|
本帖最后由 qingyemurong 于 2020-9-24 22:13 编辑
STM32 CubeIDE 使用RT-Thread Nano
使用的 STM32 CubeIDE 版本 1.4
在STM32 CubeIDE中已经集成了RT-Thread Nano,可以直接在 IDE 中进行下载添加。工程文件附件自己下载。
- # 1、RT-Thread Nano pack 安装
打开 STM32 CubeIDE --------->**Software Packs** ------------>**Manager Software Packs**界面(
获取 RT-Thread Nano 软件包,需要在 STM32CubeIDE 中添加 [https://www.rt-thread.org/download/cube/RealThread.RT-Thread.pdsc](https://www.rt-thread.org/download/cube/RealThread.RT-Thread.pdsc)
回到 Manage software packages 界面,就会发现 RT-Thread Nano 3.1.3 软件包,选择该软件包,点击 Install Now,如下图所示(颜色填充表示已安装)(
(
- # 2、创建工程添加 RT-Thread Nano
## 2.1 、创建一个基本工程
创建一个基本的工程文件,包含2个LED灯和USART1。
(
#
勾选 RT-Thread
(?x-oss
中断与异常处理
RT-Thread 操作系统重定义 **HardFault_Handler**、**PendSV_Handler**、**SysTick_Handler** 中断函数,为了避免重复定义的问题,在生成工程之前,需要在中断配置中,代码生成的选项中,取消选择三个中断函数(对应注释选项是 Hard fault interrupt, Pendable request, Time base :System tick timer),最后点击生成代码,具体操作如下图中
(
# 3、工程代码修改
1 、修改启动文件 startup_stm32f103rctx.s
**bl main** 修改为 **bl entry**
(
端口映射,函数可以放在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 = '\r';
- __HAL_UNLOCK(&huart1);
- size = rt_strlen(str);
- for (i = 0; i < size; i++)
- {
- if (*(str + i) == '\n')
- {
- 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 <finsh.h>
- /* 定义线程控制块 */
- //添加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\r\n");
- 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\r\n");
- rt_thread_mdelay(100);
- /* USER CODE END WHILE */
- /* USER CODE BEGIN 3 */
- }
- /* USER CODE END 3 */
- }
复制代码
串口输出:
(
|
|