STM32 FreeRTOS与HAL库实现OLED与LED协同控制

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字节(根据任务数量调整)

内容推荐

已经到底了哦
已经到底了哦