【官方原创】在H563上使用RTX5 RTOS LAT1584

关键字:RTX5, RTOS

1. 背景

客户反馈在STM32H563上使用RTX5 RTOS时,无法使用LSE,否则上电启动时会

死机。LSE本身与RTOS并不冲突,但为了解决客户问题,需要在H563 Nucleo板上测

试一下RTX5 RTOS。

2. RTX5 测试

KEIL RTX5 是 ARM 公司提供的一款实时操作系统(RTOS),它是 CMSIS-RTOS2

标准的实现,专为嵌入式系统设计,特别适用于基于 ARM Cortex-M 系列内核的微控制

器。RTX5 是 KEIL MDK(Microcontroller Development Kit)的一部分,具有高效、灵

活和易用的特点。

2.1. 创建工程

使用CubeMX创建工程,使能LSE,并使能LSCO输出LSE波形,使用TIM6作为

HAL 库的tick source,将SYS_TICK 保留给RTOS使用,最后生成 KEIL工程。

图1. CubeMX创建工程,使能LES

图2. 配置KEIL 组件

添加RTX5 组件后,即可将RTX5的代码添加到工程中。并且需要将stm32h5xx_it.c

文件中的 PendSV_Handler, SysTick_Handler, SVC_Handler 三个中断函数注释掉,因为

这三个函数在RTX5代码中已有定义。修改后,工程就能编译通过。

3. 多任务测试

添加完RTX5代码后,可以在main函数中,对RTOS进行初始化,并创建任务,启

动RTOS。

上面代码创建了两个任务:

复制代码
// 外设初始化,系统初始化,创建任务,启动系统 
  /* Initialize all configured peripherals */ 
  MX_GPIO_Init(); 
  MX_USART3_UART_Init(); 
  MX_ICACHE_Init(); 
  /* USER CODE BEGIN 2 */  
  osKernelInitialize();      // 系统初始化 
  threadIdStart = osThreadNew(TaskStart, NULL, &threadAttrStart);   //创建任务 
  osKernelStart();      //启动系统 
 
void HAL_GPIO_EXTI_Rising_Callback(uint16_t GPIO_Pin) 
{ 
  if (GPIO_Pin == GPIO_PIN_13) 
  { 
    osThreadFlagsSet(threadIdStart, 1);    // 给任务设置任务标志 
  } 
} 
 
// 两个任务 
void TaskUser(void *argument) 
{ 
    for(;;) 
    { 
        /* turn on the LED */ 
        HAL_GPIO_WritePin(LD1_GPIO_Port, LD1_Pin, GPIO_PIN_SET); 
        osDelay(500); 
 
        /* turn off the LED */ 
        HAL_GPIO_WritePin(LD1_GPIO_Port, LD1_Pin, GPIO_PIN_RESET); 
        osDelay(500); 
    } 
} 
void TaskStart(void *argument) 
{ 
    osThreadId_t osIdArr[10] = {0}; 
    int osThreadNum; 
    int flgComm = 0; 
  char* name = NULL; 
 
    printf(">>>>> H563 Nucleo RTX5 demo <<<<<\n\n"); 
    for(;;) 
    {    
        osThreadNum = osThreadEnumerate(osIdArr, 10); 
        printf("Total Threads: %d\n-------------------------\n", osThreadNum); 
  osThreadNum -= 1; 
        for(; osThreadNum>=0; osThreadNum--) 
        { 
          name = osThreadGetName(osIdArr[osThreadNum]); 
          if(name != NULL) 
            printf("[%d] Name: %s \n", osThreadNum, name);     
        } 
        printf("\n"); 
        flgComm = osThreadFlagsWait(1, osFlagsWaitAny, 1000u); 
        if(1 == flgComm) 
        { 
            if(threadIdUser != NULL) 
            { 
                osThreadTerminate(threadIdUser); 
                threadIdUser = NULL; 
            } 
            else 
            { 
                threadIdUser = osThreadNew(TaskUser, NULL, &threadAttrUser);  
            }         
        } 
    } 
} 

任务1:TaskStart,定期打印系统总的任务数量及任务名字。通过按键给TaskStart

发送任务标志,来创建或终止UserTask任务。

任务2:TaskUser,用于闪灯。

通过上面两个任务,对RTX5进行测试,能正常运行。观察LSCO输出的LSE时钟波

形正常,说明LSE也工作正常。

4. 小结

本文简要介绍了RTX5 RTOS的使用方法,并在H563 Nucleo板上实测了RTX5

RTOS操作系统。LSCO输出LSE时钟波形正常,也说明了LSE与RTX5系统并不冲突。


意法半导体公司及其子公司 ("ST")保留随时对 ST 产品和 / 或本文档进行变更的权利,恕不另行通知。买方在订货之前应获取关于 ST 产 品的最新信息。 ST 产品的销售依照订单确认时的相关 ST 销售条款。 买方自行负责对 ST 产品的选择和使用, ST 概不承担与应用协助或买方产品设计相关的任何责任。 ST 不对任何知识产权进行任何明示或默示的授权或许可。 转售的 ST 产品如有不同于此处提供的信息的规定,将导致 ST 针对该产品授予的任何保证失效。 ST 和 ST 徽标是 ST 的商标。若需 ST 商标的更多信息,请参考 www.st.com/trademarks。所有其他产品或服务名称均为其 各自所有者的财 产。 本文档是ST中国本地团队的技术性文章,旨在交流与分享,并期望借此给予客户产品应用上足够的帮助或提醒。若文中内容存有局限或与ST 官网资料不一致,请以实际应用验证结果和ST官网最新发布的内容为准。您拥有完全自主权是否采纳本文档(包括代码,电路图等)信息, 我们也不承担因使用或采纳本文档内容而导致的任何风险。 本文档中的信息取代本文档所有早期版本中提供的信息。

相关推荐
欢乐熊嵌入式编程4 小时前
BLE 蓝牙开发入门:用手机控制开发板 LED
单片机·ble蓝牙开发·嵌入式入门
小美单片机4 小时前
External model DLL ”ADC083XDLL“ not found_proteus仿真报错解决方法
c语言·单片机·51单片机·proteus·课程设计·课设
Tyrion.Mon5 小时前
沁恒PD协议诱骗芯片CH224A/CH224Q--IIC研究(0x60~0x8F)
单片机·硬件工程
田甲5 小时前
基于STM32L051和HDC2080的低功耗温湿度计
单片机·嵌入式硬件·温湿度计·hdc2080
List<String> error_P5 小时前
STM32 GPIO HAL库常用函数
stm32·单片机·hal库
乡野码圣6 小时前
【RK3588 Android12】设备树DTS进阶
嵌入式硬件
小痞同学6 小时前
【铁头山羊STM32】HAL库 5.SPI部分
stm32·单片机·嵌入式硬件
蓬荜生灰6 小时前
STM32(5)-- 新建寄存器版工程
stm32·单片机·嵌入式硬件
萧技电创EIIA6 小时前
基于stc12单片机的双轴舵机太阳能追光系统设计与实现
单片机·51单片机·硬件工程·pcb工艺