利用FreeRTOS和STM32CubeIDE,在開發(fā)板上實現(xiàn)一個簡單的實時操作系統(tǒng)應(yīng)用
1. 介紹
本項目利用FreeRTOS和STM32CubeIDE,在RT- thread RT- Spark開發(fā)板上實現(xiàn)了一個簡單的實時操作系統(tǒng)(RTOS)應(yīng)用。
單板上運行4個并發(fā)任務(wù)(線程):
?通過AHT21傳感器在LCD上顯示溫度
?使用電位器調(diào)整RGB LED亮度
?在LCD上顯示遞增計數(shù)器
?閃爍狀態(tài)指示燈
LCD是在任務(wù)之間共享的,因此使用互斥鎖來保護(hù)獨占訪問。所有任務(wù)都在無限循環(huán)中運行,并在每次更新后延遲自己,以便其他任務(wù)可以運行。
2. 硬件和軟件要求
2.1硬件
?RT- thread RT- Spark開發(fā)板(基于stm32)
?板載1.3" 240×240 LCD (ST7789, FSMC/8080接口)
?1板載AHT2溫濕度傳感器(I2C)
?外置RGB LED
?外部電位計(連接到ADC引腳)
?板載用戶LED
?Micro USB電纜,用于電源和編程
2.2軟件
?STM32CubeIDE(用于ioc和C代碼)
?FreeRTOS(通過STM32CubeMX / CubeIDE集成)
3. 項目概述和任務(wù)設(shè)計
該應(yīng)用程序使用四個FreeRTOS任務(wù):
1.溫度顯示任務(wù)
?通過I2C從AHT21傳感器讀取溫度
?將值轉(zhuǎn)換為人類可讀的格式
?使用LCD互斥鎖安全地將溫度寫入LCD
2.RGB亮度控制任務(wù)
?使用ADC讀取電位器
?將ADC值映射到PWM占空比
?更新一個或多個通道的RGB LED改變亮度
3.計數(shù)器顯示任務(wù)
?維護(hù)一個遞增的整數(shù)計數(shù)器
?定期鎖定LCD互斥鎖,更新LCD上的計數(shù)器,并解鎖互斥鎖
4.LED閃爍任務(wù)
?以固定的間隔切換一個簡單的狀態(tài)LED
?用作顯示RTOS正在運行的視覺心跳
主要功能:
?初始化硬件和外設(shè)
?清除LCD
?創(chuàng)建所有四個任務(wù)
?啟動調(diào)度程序。
?可選配置低功耗/休眠模式
4. 一步- -步驟指南
4.1創(chuàng)建STM32CubeIDE項目
1.在STM32CubeIDE中創(chuàng)建一個新的STM32項目。
?文件→新建→STM32項目
?選擇RT - Spark板使用的MCU(如果在板數(shù)據(jù)庫中出現(xiàn),則選擇RT - Spark板本身)。
?給它起一個名字,比如FreeRTOS_RT_Spark_Project。
2.生成啟用HAL驅(qū)動程序的基本項目。
?最初接受默認(rèn)的時鐘設(shè)置。
?完成向?qū)б源蜷_。ioc配置。
4.2.Ioc引腳和外設(shè)配置
4.2.1配置AHT20傳感器I2C
1.打開.ioc文件中的Pinout & Configuration選項卡。
2. 啟用I2C外設(shè)(例如,I2C1或I2C2,取決于RT - Spark原理圖和文檔)。
3. 設(shè)置引腳以匹配RTSpark AHT21連接:
?SCL引腳:GPIO AHT SCL(來自原理圖1.3)
?SDA引腳:GPIO AHT SDA
4. 在I2C設(shè)置中:
?選擇“I2C”模式
?配置速度(例如,標(biāo)準(zhǔn)模式100 kHz,除非你改變它)
添加:I2C配置和所用引腳的屏幕截圖。
4.2.2配置LCD接口(FSMC/8080)
1. 使能通過8080并行接口驅(qū)動ST7789 LCD的FSMC/FMC (Flexible Static Memory Controller)。
2. 根據(jù)RT - Spark原理圖(圖1.1)配置數(shù)據(jù)線db0 - db7、控制線CS、DC、WR、RD和背光引腳(LCD_BL)。
3. 根據(jù)您使用的現(xiàn)有LCD庫的要求設(shè)置相應(yīng)的引腳(這應(yīng)該與repo代碼匹配)。
4. 確保GPIO的速度和輸出類型符合LCD驅(qū)動代碼的要求。
4.2.3配置RGB LED和電位器
1.RGB led (pwm):
?選擇一個TIMx定時器,并在連接到RGB LED引腳(由RTSpark板定義)的通道上啟用PWM模式。
?將每個顏色通道配置為PWM輸出,具有合適的頻率(例如,1-10 kHz)。
?將引腳映射到RGB LED焊盤。
2.電位計(ADC):
?使能ADC外設(shè)(如ADC1)。
?選擇連接到電位器的通道(請參閱文檔/電路板手冊)。
?根據(jù)代碼的讀取方式設(shè)置連續(xù)或單一轉(zhuǎn)換模式。
4.2.4配置狀態(tài)指示燈和其他gpio
1. 識別用于閃爍的LED引腳(板載用戶LED)。
2. 在Pinout中設(shè)置為GPIO Output。
3. 配置代碼所需的任何其他gpio(例如,重置引腳,背光啟用等)。
4.3在STM32CubeMX中啟用FreeRTOS
1. 在。iocMiddleware部分,啟用FreeRTOS。
2. 選擇一個與您的項目設(shè)置匹配的基本堆方案(例如,heap_4)。
3. 配置:
?每個任務(wù)的最小堆棧大小
?總堆大小(足夠4個任務(wù)+其他分配)
4.4生成代碼和集成庫
1. 點擊項目→生成代碼(或按齒輪圖標(biāo)),讓STM32CubeIDE基于ioc生成源文件。
2. 在項目中添加/導(dǎo)入LCD驅(qū)動程序和AHT21傳感器驅(qū)動程序:
?復(fù)制LCD驅(qū)動程序。c和。h文件到Core/Src和Core/Inc(或適當(dāng)?shù)奈募A)。
?也復(fù)制AHT21驅(qū)動程序的。c和。h文件。
?確保項目屬性→C/ c++通用→路徑和符號中的包含路徑是正確的。
3. 將這些驅(qū)動程序包含在應(yīng)用程序代碼中(例如,main.c或?qū)S玫腶pp.c):
4.5實現(xiàn)互斥鎖和任務(wù)
現(xiàn)在我們用FreeRTOS把所有的東西捆綁在一起。
4.5.1創(chuàng)建LCD互斥鎖
在你的應(yīng)用程序代碼中(例如,main.c的頂部附近):
在main()中啟動調(diào)度器之前:
任何時候你訪問LCD在一個任務(wù):
4.5.2溫度顯示任務(wù)
偽結(jié)構(gòu)(適應(yīng)你現(xiàn)有的代碼):
4.5.3 RGB亮度任務(wù)(鍋控)
4.5.4計數(shù)器顯示任務(wù)
4.5.5 LED閃爍任務(wù)
4.6創(chuàng)建任務(wù)并啟動調(diào)度程序
在硬件初始化之后和vTaskStartScheduler()之前的main()中:
4.7構(gòu)建、flash和測試
1.在STM32CubeIDE中構(gòu)建項目。
?修復(fù)任何缺失的包含或類型錯誤,使用您的repo作為參考。
2.通過USB連接RT - Spark板。
3. 選擇正確的調(diào)試配置并刷新固件。
4. 復(fù)位單板,觀察:
?液晶顯示溫度和計數(shù)器(在不同的區(qū)域或風(fēng)格)。
?RGB LED亮度隨著電位器的轉(zhuǎn)動而變化。
?狀態(tài)指示燈以正常速率閃爍。
5. 它是如何工作的(摘要)
?FreeRTOS管理四個任務(wù),每個任務(wù)都有一個無限循環(huán)和自己的職責(zé)。
?任務(wù)通過調(diào)用vTaskDelay()來進(jìn)行協(xié)作,這將產(chǎn)生CPU,以便其他任務(wù)可以運行。
?LCD互斥鎖確保一次只有一個任務(wù)使用LCD,防止重復(fù)寫入。
?AHT21傳感器提供超過I2C的實時溫度數(shù)據(jù)。
?電位器輸入通過ADC讀取并映射到PWM占空比以控制RGB亮度。
?LED閃爍任務(wù)為RTOS調(diào)度器提供了一個簡單的視覺心跳。
6. 可能的改進(jìn)
?你可以把這個實驗擴展成一個更高級的RTOS項目:
?從AHT21添加濕度顯示,并在LCD上顯示溫度/濕度。
?使用隊列在任務(wù)之間發(fā)送數(shù)據(jù)(例如,傳感器任務(wù)→顯示任務(wù))。
?添加按鈕輸入以更改顯示模式或RGB模式。
?更積極地實現(xiàn)低功耗模式,并在定時器或中斷時喚醒。
7. 結(jié)果和輸出
本文編譯自hackster.io





