基于 STM32CubeMX 添加 RT-Thread 操作系统组件(一)- 详细介绍操作步骤

概述 

       本篇主要介绍,怎么使用STM32CubeMx工具,添加RT-Thread操作系统组件,码代码的IDE是keil。快速移植RT-Thread实时操作系统。本篇主要是面对入门人士,大神请绕道,谢谢!也可以自行去官网 RT-Thread 学习。

一、STM32CubeMx 添加RT-Thread操作系统组件

  1. 首先要获取 RT-Thread NANO软件包,链接      

二、打开STM32CubeMx

  1. 操作步骤 (Help -> Manage embedded software packages)

  2. 添加NANO软件包

  3. 添加NANO软件包链接
     
  4. 添加software packs






     
  5. 创建工程



  6. 以上步骤操作完成,接下来就是借助STM32CubeMx工具生成工程代码。见以下介绍 ^_^ 
  7. 先实现点亮一盏灯功能。



    配置串口调试

     
  8. 配置RT-Thread组件
  9. 找到System Core ->NIVC (取消HardFault_Handler、PendSV_Handler、SysTick_Handler中断函数(因为RTT已经定义了,需要取消))

     
  10. 生成代码配置

  11. 打开keil IDE,创建STM32开发环境。

  12. 开始编写代码
    在Application/User文件夹,新建app_rt_thread.c文件,并添加如下代码
    #include "rtthread.h"
    #include "main.h"
    #include "stdio.h"
    
    struct rt_thread led_thread;
    rt_uint8_t rt_led_thread_stack[128];
    void led_task_entry(void *parameter);
    
    //初始化线程函数
    void MX_RT_Thread_Init(void)
    {
    	//初始化LED线程
    	rt_thread_init(&led_thread,"led",led_task_entry,RT_NULL,&rt_led_thread_stack[0],sizeof(rt_led_thread_stack),3,20);
    	//开启线程调度
    	rt_thread_startup(&led_thread);
    }
    
    //主任务
    void MX_RT_Thread_Process(void)
    {
    	printf("Hello RT_Thread!!!");
    	rt_thread_delay(2000);
    }
    
    //LED任务
    void led_task_entry(void *parameter)
    {
    	while(1)
    	{
    		HAL_GPIO_WritePin(LED_GPIO_Port,LED_Pin, GPIO_PIN_RESET);
    		rt_thread_delay(500);
    		HAL_GPIO_WritePin(LED_GPIO_Port,LED_Pin, GPIO_PIN_SET);
    		rt_thread_delay(500);
    	}
    }
    

  13. 在usart.c文件添加如下代码:
    /* USER CODE BEGIN 0 */
    #include "stdio.h"
    
    /* USER CODE END 0 */
    .
    .
    .
    /* USER CODE BEGIN 1 */
    #ifdef __GNUC__
      /* With GCC/RAISONANCE, small printf (option LD Linker->Libraries->Small printf
         set to 'Yes') calls __io_putchar() */
      #define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
    #else
      #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
    #endif /* __GNUC__ */
    /**
      * @brief  Retargets the C library printf function to the USART.
      * @param  None
      * @retval None
      */
    PUTCHAR_PROTOTYPE
    {
      /* Place your implementation of fputc here */
      /* e.g. write a character to the EVAL_COM1 and Loop until the end of transmission */
      HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xFFFF);
     
      return ch;
    }
    
    /* USER CODE END 1 */
  14. 在main.c文件添加如下代码:
    /* USER CODE END Header */
    
    /* Includes ------------------------------------------------------------------*/
    #include "main.h"
    #include "usart.h"
    #include "gpio.h"
    
    /* Private includes ----------------------------------------------------------*/
    /* USER CODE BEGIN Includes */
    
    /* USER CODE END Includes */
    
    /* Private typedef -----------------------------------------------------------*/
    /* USER CODE BEGIN PTD */
    extern void MX_RT_Thread_Init(void);
    extern void MX_RT_Thread_Process(void);
    
    /* USER CODE END PTD */
    .
    .
    .
    
    
    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)
      {
    	MX_RT_Thread_Process();
        /* USER CODE END WHILE */
    
        /* USER CODE BEGIN 3 */
      }
      /* USER CODE END 3 */
    }

  15. 运行效果如下所示:

参考文章来自RT-Thread官网:RT-Thread 文档中心

源码:git

### RTT 实时线程与CubeMX集成指南 在嵌入式开发领域,实时操作系统RTOS)对于实现高效的任务调度至关重要。当涉及到STM32微控制器系列时,使用CubeMX初始化配置工具可以极大简化项目设置过程[^1]。 #### 使用RTT实现实时功能 为了使应用程序具备实时特性,在基于STM32的系统中通常会引入FreeRTOS或其他类似的轻量级内核来管理多个并发执行路径。通过CubeMX生成的基础框架支持轻松添加这些组件到工程文件里去。 #### 配置步骤概述 - **创建新项目**: 打开STMCubeMX软件并启动个新的设计流程。 - **选择设备型号**: 根据实际硬件平台挑选对应的处理器版本。 - **外设配置**: 启用必要的通信接口和其他外围模块。 - **中间件导入**: 将Real-Time-Thread (RTT)作为中间件加入进来,并完成初步参数设定。 - **代码自动生成**: 利用CubeMX内置的功能来自动生成初始化源码片段以及Makefile构建脚本等辅助资源. ```c // 示例:定义个简单的任务函数 void TaskFunction(void *argument){ while(1){ // 用户逻辑处理部分... osDelay(1); // 延迟段时间以减少CPU占用率 } } int main(void){ /* 初始化HAL库 */ HAL_Init(); /* 系统时钟配置 */ SystemClock_Config(); /* 创建任务实例 */ osThreadId_t taskHandle; const osThreadAttr_t task_attributes = { .name = "myTask", .priority = (osPriority_t) osPriorityNormal, .stack_size = 128 * 4 }; taskHandle = osThreadNew(TaskFunction, NULL, &task_attributes); } ``` 上述代码展示了如何利用CubeMX配合RTT建立个多线程环境下的基本应用结构。值得注意的是,具体的API调用方式可能会因所选RTOS的不同而有所差异;因此建议查阅官方文档获取最准确的信息。
评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Ch_champion

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值