创建FreeRTOS工程

1.创建STM32CubeMX 工程

  1. Access to MCU Selector

  2. MCU选型,在序列号那里输入想要开发的芯片

  3. 配置处理器的时钟,在“SystemCore”的“RCC”处选择外部高速时钟源和低速时钟源。HSE 是 STM32F103C8T6 实现72MHz 最大系统时钟高精度外设时序的必要选择。

    维度 HSE(外部晶振) HSI(内部 RC) 选择影响
    精度与稳定性 误差 ±10~50ppm,温漂 / 压漂极小 误差约 ±1%,受环境影响大 决定 UART/SPI/I2C 波特率精度、ADC 采样稳定性、PWM 占空比准确性
    性能上限 可作为 PLL 输入,8MHz ×9 = 72MHz 系统时钟 虽为 8MHz,但 PLL 倍频后稳定性不足,且官方推荐 HSE 作为高性能时钟源 直接影响 CPU 执行速度与高速外设(如 TIM、ADC)的工作效率
    工程兼容性 蓝板 / 核心板标配 8MHz 晶振,硬件已就绪 无需外部元件,但无法满足高精度场景 避免 “代码与硬件不匹配”(如 CubeMX 配 HSI 但硬件接 HSE,或反之)
    STM32F103C8T6使用了外部高速时钟源,如下图所示:

    FreeRTOS 与 SysTick 冲突的本质(标准库 / HAL 库通用)

    FreeRTOS 的任务调度、vTaskDelay()等核心功能必须依赖 SysTick(默认配置下):FreeRTOS 会接管 SysTick 的中断优先级和计数频率(通常配置为 1000Hz/1ms);若 HAL 库 / 标准库同时使用 SysTick 做延时,会导致:

    • HAL_Delay()/delay_ms()计时不准、卡死;
    • FreeRTOS 任务调度异常(中断抢占 / 嵌套错误);
    • 极端情况下系统死机。

另外,本实验使用了FreeRTOS,FreeRTOS的时基使用的是Systick,而STM32CubeMX

中默认的HAL库时基也是Systick,为了避免可能的冲突,最好将HAL库的时基换做其它的
硬件定时器:

    最后去时钟配置界面配置系统时钟频率。直接在HCLK时钟那里输入MCU允许的最高时 钟频率。F103的最高频率是72Mhz,所以直接在那里输入72然后按回车

     4. 配置GPIO

    这里选择GPIO Output,让PC13配置为通用输出IO,以便用来驱动LED的亮灭。

    5.配置FreeRTOS

    STM32CubeMX 已经将 FreeRTOS 集成到工具中,并且将 RTOS 的接口进行了封装
    CMSIS-RTOS V1/V2,相较之于 V1 版本的CMSIS-RTOS API,V2 版本的API的兼容性更高,为
    了将来的开发和移植,建议开发者使用V2版本的API:

    5.1 配置freertos参数

    FreeRTOS 的参数包括时基频率、任务堆栈大小、是否使能互斥锁等等,需要开发者根 据自己对FreeRTOS的了解以及项目开发的需求,来定制参数。

    添加任务 使用STM32CubeMX,可以手工添加任务、队列、信号量、互斥锁、定时器等等。但是本 课程不想严重依赖STM32CubeMX,所以不会使用STM32CubeMX来添加这些对象,而是手写代 码来使用这些对象。 使用STM32CubeMX 时,有一个默认任务,此任务无法删除,只能修改其名称和函数类型, 如下图所示:

    生成Keil MDK的工程 当对外设配置完成后,就去“Project Manager”中设置工程的名称、存储路径和开发 IDE

    添加用户代码

    STM32CubeMX 只是帮我们初始化了所配置的硬件模块,你要实现什么功能,需要自 己添加代码。打开工程,如果编译不正确可切换生成工程页面 STM32cubemx1.8.5版本

    比如实现闪烁led

    添加driver_led.c 和driver_timer.c进入工程目录(别忘记添加路径)

    在freertos.c文件中添加driver_led.h头文件进行编译烧写即可

    Logo

    openvela 操作系统专为 AIoT 领域量身定制,以轻量化、标准兼容、安全性和高度可扩展性为核心特点。openvela 以其卓越的技术优势,已成为众多物联网设备和 AI 硬件的技术首选,涵盖了智能手表、运动手环、智能音箱、耳机、智能家居设备以及机器人等多个领域。

    更多推荐