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

这篇具有很好参考价值的文章主要介绍了使用STM32CubeMX生成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设置外部晶振,这个根据板子情况调整,我这里高低速都是外部晶振

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

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

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

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

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

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

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

2. 配置串口和USB

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

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

配置USB FS,用于和EC20通信

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

3. 重头戏:配置Azure RTOS

首先安装所需软件包

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

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

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

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

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

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

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的值判断是否是线程创建失败导致的问题。

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

最后,在文件末尾编写跑马灯线程代码:

/* 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的项目里,需要选上。

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

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

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

博客主页:链接。转载请注明出处!文章来源地址https://www.toymoban.com/news/detail-440762.html

到了这里,关于使用STM32CubeMX生成ThreadX实时操作系统工程模板的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • STM32初学者入门FreeRTOS操作系统,多任务实时系统

            FreeRTOS(Free Real-Time Operating System)是一个开源的嵌入式实时操作系统,它专门设计用于在资源有限的嵌入式系统中运行。FreeRTOS提供了一些用于任务管理、调度、同步和通信的功能,使开发者能够轻松地创建可靠的嵌入式系统。 以下是FreeRTOS的一些特点和功能: 轻量

    2024年02月11日
    浏览(47)
  • STM32CubeMX教程11 RTC 实时时钟 - 入侵检测和时间戳

    目录 1、准备材料 2、实验目标 3、实验流程 3.0、前提知识 3.1、CubeMX相关配置 3.1.0、工程基本配置 3.1.1、时钟树配置 3.1.2、外设参数配置 3.1.3、外设中断配置 3.2、生成代码 3.2.0、配置Project Manager页面 3.2.1、外设初始化调用流程 3.2.2、外设中断调用流程 3.2.3、添加其他必要代码

    2024年02月03日
    浏览(47)
  • STM32 HAL库 RTC实时时钟打印时间日期 掉电不清零 CubeMX

    启用HSE和HSI 启用RTC和Calendar功能,选择内部唤醒 设置参数 Hour Format:小时格式(12小时或24小时制) Asynchronous Predivider value:异步分频系数 Synchronous Predivider value:同步分频系数 异步分频系数和同步分频系数共同决定RTC的频率。当使用32.768KHz的LSE时,RTC分频后的时钟频率为

    2024年04月27日
    浏览(43)
  • STM32CubeMX软件介绍及工程文件生成

        STM32CubeMX 是用于 32 位 ARM Cortex STM32 微控制器的图形工具。它通过分步过程可以非常轻松地配置STM32微控制器和微处理器,以及为Arm® Cortex®-M内核或面向Arm® Cortex®-A内核的特定Linux®设备树生成相应的初始化C代码。 STM32CubeMX 是 ST 意法半导体近几年来大力推荐的STM3

    2024年02月12日
    浏览(60)
  • STM32CubeMX生成C代码及时钟树配置(基于stm32f407)

    近来对于stm32单片机编程中,HAL库逐渐取代标准库成为主流的库。标准库支持的芯片型号有限,而且目前已经停止支持,而HAL库支持所有类型的芯片,可移植性也很高,再加上有神器STM32Cube可以生成工程模板,越来越多的编程开始从使用标准库转到使用HAL库。 新建工程后,在

    2024年02月15日
    浏览(61)
  • STM32CubeMX教程10 RTC 实时时钟 - 周期唤醒、闹钟A/B事件和备份寄存器

    开发板(正点原子stm32f407探索者开发板V2.4) STM32CubeMX软件(Version 6.10.0) keil µVision5 IDE(MDK-Arm) ST-LINK/V2驱动 野火DAP仿真器 XCOM V2.6串口助手 使用STM32CubeMX软件配置STM32F407开发板 实现RTC周期唤醒、闹钟A/B事件功能 ,具体为在周期唤醒时利用串口输出当前RTC记录时间,当闹钟

    2024年02月03日
    浏览(55)
  • 【STM32】STM32 移植鸿蒙操作系统

    随着 OpenHarmony3.1 的正式发布,其功能也在不断完善。OpenHarmony LiteOS-M 内核是面向IoT领域构建的轻量级物联网操作系统内核,具有小体积、低功耗、高性能的特点,其代码结构简单,主要包括内核最小功能集、内核抽象层、可选组件以及工程目录等,分为硬件相关层以及硬件无

    2024年02月09日
    浏览(54)
  • STM32CubeMX教程6 TIM 通用定时器 - 生成PWM波

    开发板(STM32F407G-DISC1) STM32CubeMX软件(Version 6.10.0) keil µVision5 IDE(MDK-Arm) ST-LINK/V2驱动 逻辑分析仪nanoDLA 使用STM32CubeMX软件配置STM32F407 通用定时器生成可变占空比PWM波形,并将其输出到LED灯引脚实现呼吸灯效果 STM32F407有10个通用定时器,其中TIM2、TIM3、TIM4和TIM5有4个捕获

    2024年02月03日
    浏览(45)
  • 【STM32开发小技巧】CUBEMX改变工程模板(FreeMarker一键生成定制文件)

    ps:可直接跳到效果展示 众所周知CUBEMX可以生成代码,图形界面可以方便用户进行STM32的配置,有天我就在想能否用户改变生成后的代码,于是就有了下面的文章。 直接进入Project Manager页面。 我们看一下官方的说明 生成了一些外设信息,这些都是通过FreeMarker模板引擎代码生成

    2023年04月08日
    浏览(78)
  • 解决:STM32CubeMX生成MDK代码提示项目有问题(...have a problem)

    通过STM32CubeMX进行STM32项目创建过程中,在生成MDK代码时提示\\\"The Code is successfully generated under C:/TEST/LED but MDK-ARM V5 Project genera have a problem\\\"的解决办法: 1、检查项目名称是否为存在特殊字符、中文等,例如:例题1; 2、检查项目创建路径是否存在特殊字符、中文或空格等,例如

    2024年02月16日
    浏览(44)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包