使用STM32CubeMX生成ThreadX实时操作系统工程模板

科技资讯 投稿 7100 0 评论

使用STM32CubeMX生成ThreadX实时操作系统工程模板

由于需要在stm32上使用USB Host CDC-ECM,连接EC20发送数据到服务器,接触到了ThreadX实时操作系统。

电脑上经常使用的tinyusb,对stm设备的device支持较差;

最终决定使用微软的Azure RTOS ThreadX全家桶,利用NetX Duo+USBX实现对ECM网卡的支持。ThreadX的性能和存储占用都优化得很好,且中间件齐全,免去了很多自己配置的麻烦。目前ThreadX已经开源,并加入CubeMX,直接使用可视化界面就可完成配置,解决一些小坑之后十分方便,遂写此随笔以作记录、分享。

https://juejin.cn/post/7099829592713592840

一、CubeMX生成模板

1. 配置RCC、时钟、SYS、GPIO

RCC设置外部晶振,这个根据板子情况调整,我这里高低速都是外部晶振

系统设置内,debug根据板子设置,我使用的是jlink的SW调试口,所以选择serial wire。时基源选择任意一个没用到的TIM。

最后配置板子上三个LED灯的GPIO,根据自己板子上情况修改。

2. 配置串口和USB

3. 重头戏:配置Azure RTOS

我用的MCU是stm32f4系列,因此找到AZRTOS-F4。勾选Core以及需要使用的USBX-UX Host Class CDC ECM,会提示所选的包还有依赖项没选上,根据提示补齐。如果不需要USB和网络,只选择threadx core就行。

可以根据需要修改配置,我这里基本保持默认,后面有需求再修改。

4. 生成项目模板

二、Keil内编写跑马灯代码

1. 编辑app_azure_rtos.h

增加对GPIO、串口、printf的支持,代码:

/* USER CODE BEGIN Includes */
#include "main.h"
#include "stdio.h"
#include "usart.h"
#if 1
__asm__(".global __use_no_semihosting";

FILE __stdout;
//define function _sys_exit( to avoid using semi-hosting mode
void _sys_exit(int x
{
    x = x;
}
//redefine function fputc to redirect output
int fputc(int ch, FILE *f
{
    HAL_UART_Transmit(&huart6, (uint8_t *&ch, 1, 0x10;
    return ch;
}
#endif
/* USER CODE END Includes */

/* USER CODE BEGIN EFP */
void app1_LED123(ULONG thread_input;
/* USER CODE END EFP */

2. 编辑app_azure_rtos.h

文件前面增加线程参数设置

/* USER CODE BEGIN PD */
//defination of app1
#define APP1_PRIO 15u    //优先级,越大越不优先
#define APP1_STACKSIZE 1024u    //堆栈大小,注意大于cubemx内设置的最低大小
static TX_THREAD app1_TCB;    //线程控制块
static uint8_t app1_STACK[APP1_STACKSIZE];    //堆栈
/* USER CODE END PD */

在 tx_application_define函数内,增加创建线程的操作,并串口显示创建状态。

/* USER CODE BEGIN  tx_application_define */
printf("tx_application_define\n";
UINT status = tx_thread_create(&app1_TCB,
                               "app1_led123",
                               app1_led123,
                               0,
                               &app1_STACK[0],
                               APP1_STACKSIZE,
                               APP1_PRIO,
                               APP1_PRIO,
                               TX_NO_TIME_SLICE,
                               TX_AUTO_START;
printf("thread create status:%d\n", status;
/* USER CODE END  tx_application_define */

 这里遇到一个坑,我的堆栈大小起初设置得低于cubemx中指定的400B,因此线程创建失败。可通过status的值判断是否是线程创建失败导致的问题。

/* USER CODE BEGIN  0 */
void app1_led123(ULONG thread_input
{
    printf("app1_led123 start\n";
    while(1 {
        HAL_GPIO_TogglePin(LED1_GPIO_Port, LED1_Pin;
        tx_thread_sleep(10;
        HAL_GPIO_TogglePin(LED2_GPIO_Port, LED2_Pin;
        tx_thread_sleep(10;
        HAL_GPIO_TogglePin(LED3_GPIO_Port, LED3_Pin;
        tx_thread_sleep(10;
    }
}
/* USER CODE END  0 */

3. 设置编译和调试参数

在魔法棒内设置使用v6编译器、勾选上microlib。debug选项卡内也选择自己使用的调试器。

博客主页:链接。转载请注明出处!

编程笔记 » 使用STM32CubeMX生成ThreadX实时操作系统工程模板

赞同 (31) or 分享 (0)
游客 发表我的评论   换个身份
取消评论

表情
(0)个小伙伴在吐槽