1、RT-Thread Nano pack 安装
打开 STM32 CubeIDE --------->Software Packs ------------>Manager Software Packs界面
回到 Manage software packages 界面,就会发现 RT-Thread Nano 3.1.3 软件包,选择该软件包,点击 Install Now,如下图所示(颜色填充表示已安装):
2、创建工程添加 RT-Thread Nano
2.1 、创建一个基本工程
创建一个基本的工程文件,包含2个LED灯和USART1。
2.2、配置 Nano
勾选 RT-Thread
适配 RT-Thread Nano
中断与异常处理
RT-Thread 操作系统重定义 HardFault_Handler、PendSV_Handler、Systick_Handler 中断函数,为了避免重复定义的问题,在生成工程之前,需要在中断配置中,代码生成的选项中,取消选择三个中断函数(对应注释选项是 Hard fault interrupt, Pendable request, Time base :System tick timer),最后点击生成代码,具体操作如下图中
3、工程代码修改
3.1 需要修改的部分
1 、修改启动文件 startup_stm32f103rctx.s
bl main 修改为 bl entry
3.2 、配置rt_kprintf端口输出
端口映射,函数可以放在main.c文件里面。
/* USER CODE BEGIN 4 */
char rt_hw_console_getchar(void)
{
int ch = -1;
if (__HAL_UART_GET_FLAG(&huart1, UART_FLAG_RXNE) != RESET)
{
ch = huart1.Instance->DR & 0xff;
}
else
{
if (__HAL_UART_GET_FLAG(&huart1, UART_FLAG_ORE) != RESET)
{
__HAL_UART_CLEAR_OREFLAG(&huart1);
}
rt_thread_mdelay(10);
}
return ch;
}
void rt_hw_console_output(const char *str)
{
rt_size_t i = 0, size = 0;
char a = '
';
__HAL_UNLOCK(&huart1);
size = rt_strlen(str);
for (i = 0; i < size; i++)
{
if (*(str + i) == '
')
{
ITM_SendChar(a);
HAL_UART_Transmit(&huart1, (uint8_t*) &a, 1, 1);
}
HAL_UART_Transmit(&huart1, (uint8_t*) (str + i), 1, 1);
}
}
/* USER CODE END 4 */
3.3 、编写线程文件
创建一个app_rt_thread.c文件用于保存线程代码
app_rt_thread.c文件内容:
#include "rtthread.h"
#include "main.h"
#include "stdio.h"
#include
/* 定义线程控制块 */
//添加LED闪烁线程
static struct rt_thread led_thread;
static char led_thread_stack[256];
static void led_thread_entry(void *parameter);
int MX_RT_Thread_Init(void);
int MX_RT_Thread_Init(void)
{
//初始化线程
rt_err_t rst;
rst = rt_thread_init(&led_thread,
(const char *)"ledshine", /* 线程名字 */
led_thread_entry, /* 线程入口函数 */
RT_NULL, /* 线程入口函数参数 */
&led_thread_stack[0],
sizeof(led_thread_stack), /* 线程栈大小 */
RT_THREAD_PRIORITY_MAX-2, /* 线程的优先级 */
20); /* 线程时间片 */
if(rst == RT_EOK)
{///* 启动线程,开启调度 */
rt_thread_startup(&led_thread);
}
}
/*
*************************************************************************
* 线程定义
*************************************************************************
*/
static void led_thread_entry(void *parameter)
{
while(1)
{
rt_kprintf("led1_thread running,LED1_ON
");
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_8, GPIO_PIN_RESET);
rt_thread_mdelay(500);
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_8, GPIO_PIN_SET);
rt_thread_mdelay(500);
}
}
MSH_CMD_EXPORT(led_thread_entry,thread running);
3.4 、main.c 修改
/* USER CODE BEGIN Includes */
#include "rtthread.h"
extern int MX_RT_Thread_Init(void);
int main(void)
{
/* USER CODE BEGIN 1 */
/* USER CODE END 1 */
/* MCU Configuration--------------------------------------------------------*/
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();
/* USER CODE BEGIN Init */
/* USER CODE END Init */
/* Configure the system clock */
SystemClock_Config();
/* USER CODE BEGIN SysInit */
/* USER CODE END SysInit */
/* Initialize all configured peripherals */
MX_GPIO_Init();
MX_USART1_UART_Init();
/* USER CODE BEGIN 2 */
MX_RT_Thread_Init();
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
HAL_GPIO_TogglePin(GPIOD, GPIO_PIN_2);
rt_kprintf("led1_thread TEST
");
rt_thread_mdelay(100);
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */
}
串口输出:
原作者:青烨慕容
|