1. 项目概述与背景
作为一名嵌入式开发工程师,我最近在STM32平台上尝试了FreeRTOS与HAL库的结合应用,目标是实现OLED显示和LED点亮的协同工作。这个项目看似简单,但涉及到了从裸机开发到RTOS开发的思维转变,以及多个外设的协同调度问题。
在传统的裸机开发中,我们习惯使用顺序执行的方式控制外设,比如先点亮LED,再显示OLED内容。但在RTOS环境下,我们可以将这些操作分配到不同的任务中,由调度器统一管理,实现真正的"并行"执行。这不仅提高了系统响应速度,也为后续功能扩展打下了良好基础。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 硬件与开发环境准备
2.1 硬件选型与连接
我使用的是STM32F103C8T6最小系统板,搭配0.96寸OLED显示屏(SSD1306驱动)和一个LED灯。OLED通过I2C接口连接,LED则连接到任意GPIO口。
硬件连接要点:
- OLED的SCL接PB6,SDA接PB7(I2C1)
- LED正极接PA0,负极接地
- 确保所有设备共地
2.2 开发环境配置
我使用的是STM32CubeIDE 1.11.0版本,集成了STM32CubeMX配置工具。创建新工程时选择正确的芯片型号(STM32F103C8T6),并确保安装了以下软件包:
- STM32F1 HAL库
- FreeRTOS中间件
提示:建议使用较新的HAL库版本,旧版本可能存在一些已知问题。我使用的是HAL库v1.8.4,FreeRTOS v10.4.6。
3. STM32CubeMX配置详解
3.1 时钟配置
时钟树配置是STM32开发的基础。为了避免TIM4与系统时钟冲突,我做了如下设置:
- 系统时钟源:HSE(8MHz)
- PLL倍频:9倍(8MHz × 9 = 72MHz)
- APB1预分频:2(TIM4时钟为36MHz)
- APB2预分频:1(保持72MHz)
这样配置后,TIM4的时钟频率为36MHz,既不会与系统时钟冲突,又能满足基本定时需求。
3.2 FreeRTOS配置
在Middleware选项卡中启用FreeRTOS,并做如下关键设置:
- 接口:CMSIS_V1(兼容性更好)
- 内存分配方案:heap_4(内存碎片较少)
- 总堆大小:4096字节(根据任务数量调整)
