• 使用CubeMX生成STM32的ThreadX实时操作系统工程模板


    文章发布于博客园,主页:https://www.cnblogs.com/-fcy-/。转载请注明出处!

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

    在调研过程中,发现stm32官方USB库内只有Device ECM类,无法作为host连接网卡;

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

    此外还有lrndis、TeenyUSB,提供了host ecm类的支持,但使用并不方便,且有的已很少有人维护(小开源项目难免如此)。

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

    本文使用的工具包括CubeMX、MDK,内容假设阅读者已基本掌握这两个软件的使用。在学习过程中,参考了另两篇教程,附上链接:

    https://juejin.cn/post/7099829592713592840

    https://blog.csdn.net/wallace89/article/details/114941859

    一、CubeMX生成模板

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

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

    时钟配置,和平时一样,可以输入HCLK让cubemx自动设置,也可手动调,48MHz时钟一定要有

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

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

    2. 配置串口和USB

    根据板子,配置串口用于调试

    配置USB FS,用于和EC20通信

    3. 重头戏:配置Azure RTOS

    首先安装所需软件包

    我用的MCU是stm32f4系列,因此找到AZRTOS-F4。勾选Core以及需要使用的USBX-UX Host Class CDC ECM,会提示所选的包还有依赖项没选上,根据提示补齐。如果不需要USB和网络,只选择threadx core就行。注意,这里需要勾选上USBX下面的UX Host Controllers,否则以后移植代码会缺失控制器相关函数。

    回到主界面,可以看到左边X-CUBE-AZRTOS-F4变得可选,点击打开配置。

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

    4. 生成项目模板

    常规操作,注意:1. IDE选用自己使用的;2. 增大堆栈,我均改为0x2000;3. .c/.h分开

    二、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选项卡内也选择自己使用的调试器。

    v6编译器的速度快了相当多,尤其是在带RTOS的项目里,需要选上。

    设置完成,即可编译下载,运行自己的程序!

    ——————THE END——————

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

  • 相关阅读:
    STM32 - SPI硬件外设
    el-button 的:disabled不生效
    基于信号量与环形队列实现读写异步缓存队列
    MFA-Conformer
    KUKA机器人中断编程2—中断相关的指令
    网络安全等级保护测评师定义以及主要工作任务是什么?
    调味品行业数据分析
    商品期货一手是多少(商品期货一手是多少吨)
    Android 13.0 SystemUI下拉状态栏时间格式的修改(一)
    物联网如何变革包装行业
  • 原文地址:https://www.cnblogs.com/-fcy-/p/17393940.html