利用FreeRTOS和STM32CubeIDE,在开发板上实现一个简单的实时操作系统应用
扫描二维码
随时随地手机看文章
1. 介绍
本项目利用FreeRTOS和STM32CubeIDE,在RT- thread RT- Spark开发板上实现了一个简单的实时操作系统(RTOS)应用。
单板上运行4个并发任务(线程):
•通过AHT21传感器在LCD上显示温度
•使用电位器调整RGB LED亮度
•在LCD上显示递增计数器
•闪烁状态指示灯
LCD是在任务之间共享的,因此使用互斥锁来保护独占访问。所有任务都在无限循环中运行,并在每次更新后延迟自己,以便其他任务可以运行。
2. 硬件和软件要求
2.1硬件
•RT- thread RT- Spark开发板(基于stm32)
•板载1.3" 240×240 LCD (ST7789, FSMC/8080接口)
•1板载AHT2温湿度传感器(I²C)
•外置RGB LED
•外部电位计(连接到ADC引脚)
•板载用户LED
•Micro USB电缆,用于电源和编程
2.2软件
•STM32CubeIDE(用于ioc和C代码)
•FreeRTOS(通过STM32CubeMX / CubeIDE集成)
3. 项目概述和任务设计
该应用程序使用四个FreeRTOS任务:
1.温度显示任务
•通过I²C从AHT21传感器读取温度
•将值转换为人类可读的格式
•使用LCD互斥锁安全地将温度写入LCD
2.RGB亮度控制任务
•使用ADC读取电位器
•将ADC值映射到PWM占空比
•更新一个或多个通道的RGB LED改变亮度
3.计数器显示任务
•维护一个递增的整数计数器
•定期锁定LCD互斥锁,更新LCD上的计数器,并解锁互斥锁
4.LED闪烁任务
•以固定的间隔切换一个简单的状态LED
•用作显示RTOS正在运行的视觉心跳
主要功能:
•初始化硬件和外设
•清除LCD
•创建所有四个任务
•启动调度程序。
•可选配置低功耗/休眠模式
4. 一步- -步骤指南
4.1创建STM32CubeIDE项目
1.在STM32CubeIDE中创建一个新的STM32项目。
•文件→新建→STM32项目
•选择RT - Spark板使用的MCU(如果在板数据库中出现,则选择RT - Spark板本身)。
•给它起一个名字,比如FreeRTOS_RT_Spark_Project。
2.生成启用HAL驱动程序的基本项目。
•最初接受默认的时钟设置。
•完成向导以打开。ioc配置。
4.2.Ioc引脚和外设配置
4.2.1配置AHT20传感器I²C
1.打开.ioc文件中的Pinout & Configuration选项卡。
2. 启用I2C外设(例如,I2C1或I2C2,取决于RT - Spark原理图和文档)。
3. 设置引脚以匹配RTSpark AHT21连接:
•SCL引脚:GPIO AHT SCL(来自原理图1.3)
•SDA引脚:GPIO AHT SDA
4. 在I2C设置中:
•选择“I2C”模式
•配置速度(例如,标准模式100 kHz,除非你改变它)
添加:I²C配置和所用引脚的屏幕截图。
4.2.2配置LCD接口(FSMC/8080)
1. 使能通过8080并行接口驱动ST7789 LCD的FSMC/FMC (Flexible Static Memory Controller)。
2. 根据RT - Spark原理图(图1.1)配置数据线db0 - db7、控制线CS、DC、WR、RD和背光引脚(LCD_BL)。
3. 根据您使用的现有LCD库的要求设置相应的引脚(这应该与repo代码匹配)。
4. 确保GPIO的速度和输出类型符合LCD驱动代码的要求。
4.2.3配置RGB LED和电位器
1.RGB led (pwm):
•选择一个TIMx定时器,并在连接到RGB LED引脚(由RTSpark板定义)的通道上启用PWM模式。
•将每个颜色通道配置为PWM输出,具有合适的频率(例如,1-10 kHz)。
•将引脚映射到RGB LED焊盘。
2.电位计(ADC):
•使能ADC外设(如ADC1)。
•选择连接到电位器的通道(请参阅文档/电路板手册)。
•根据代码的读取方式设置连续或单一转换模式。
4.2.4配置状态指示灯和其他gpio
1. 识别用于闪烁的LED引脚(板载用户LED)。
2. 在Pinout中设置为GPIO Output。
3. 配置代码所需的任何其他gpio(例如,重置引脚,背光启用等)。
4.3在STM32CubeMX中启用FreeRTOS
1. 在。iocMiddleware部分,启用FreeRTOS。
2. 选择一个与您的项目设置匹配的基本堆方案(例如,heap_4)。
3. 配置:
•每个任务的最小堆栈大小
•总堆大小(足够4个任务+其他分配)
4.4生成代码和集成库
1. 点击项目→生成代码(或按齿轮图标),让STM32CubeIDE基于ioc生成源文件。
2. 在项目中添加/导入LCD驱动程序和AHT21传感器驱动程序:
•复制LCD驱动程序。c和。h文件到Core/Src和Core/Inc(或适当的文件夹)。
•也复制AHT21驱动程序的。c和。h文件。
•确保项目属性→C/ c++通用→路径和符号中的包含路径是正确的。
3. 将这些驱动程序包含在应用程序代码中(例如,main.c或专用的app.c):
4.5实现互斥锁和任务
现在我们用FreeRTOS把所有的东西捆绑在一起。
4.5.1创建LCD互斥锁
在你的应用程序代码中(例如,main.c的顶部附近):
在main()中启动调度器之前:
任何时候你访问LCD在一个任务:
4.5.2温度显示任务
伪结构(适应你现有的代码):
4.5.3 RGB亮度任务(锅控)
4.5.4计数器显示任务
4.5.5 LED闪烁任务
4.6创建任务并启动调度程序
在硬件初始化之后和vTaskStartScheduler()之前的main()中:
4.7构建、flash和测试
1.在STM32CubeIDE中构建项目。
•修复任何缺失的包含或类型错误,使用您的repo作为参考。
2.通过USB连接RT - Spark板。
3. 选择正确的调试配置并刷新固件。
4. 复位单板,观察:
•液晶显示温度和计数器(在不同的区域或风格)。
•RGB LED亮度随着电位器的转动而变化。
•状态指示灯以正常速率闪烁。
5. 它是如何工作的(摘要)
•FreeRTOS管理四个任务,每个任务都有一个无限循环和自己的职责。
•任务通过调用vTaskDelay()来进行协作,这将产生CPU,以便其他任务可以运行。
•LCD互斥锁确保一次只有一个任务使用LCD,防止重复写入。
•AHT21传感器提供超过I²C的实时温度数据。
•电位器输入通过ADC读取并映射到PWM占空比以控制RGB亮度。
•LED闪烁任务为RTOS调度器提供了一个简单的视觉心跳。
6. 可能的改进
•你可以把这个实验扩展成一个更高级的RTOS项目:
•从AHT21添加湿度显示,并在LCD上显示温度/湿度。
•使用队列在任务之间发送数据(例如,传感器任务→显示任务)。
•添加按钮输入以更改显示模式或RGB模式。
•更积极地实现低功耗模式,并在定时器或中断时唤醒。
7. 结果和输出
本文编译自hackster.io





