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





