在STM32單片機(jī)上實(shí)現(xiàn)了一個(gè)基于FreeRTOS的多任務(wù)處理系統(tǒng)
FreeRTOS是一個(gè)輕量級(jí)、開(kāi)源的實(shí)時(shí)操作系統(tǒng)內(nèi)核,專為微控制器和小型嵌入式系統(tǒng)設(shè)計(jì)。它提供基本的RTOS特性,如任務(wù)調(diào)度、任務(wù)間通信、同步機(jī)制和低功耗管理,同時(shí)保持最小的內(nèi)存占用。
在這個(gè)項(xiàng)目中,F(xiàn)reeRTOS被用來(lái)管理STM32微控制器上的多個(gè)并發(fā)任務(wù),實(shí)現(xiàn)確定性執(zhí)行、模塊化軟件設(shè)計(jì)和安全訪問(wèn)共享硬件資源。RTOS調(diào)度器處理任務(wù)切換,而任務(wù)通過(guò)延遲函數(shù)顯式地產(chǎn)生CPU控制,實(shí)現(xiàn)適合資源受限系統(tǒng)的協(xié)作多任務(wù)方法。
項(xiàng)目目標(biāo)
該項(xiàng)目的目標(biāo)是設(shè)計(jì)和實(shí)現(xiàn)一個(gè)基于rtos的多任務(wù)嵌入式系統(tǒng),該系統(tǒng)同時(shí):
?從I2C傳感器獲取溫度數(shù)據(jù)
?使用模擬輸入控制RGB LED亮度
?更新LCD上的圖形信息
?定時(shí)執(zhí)行LED閃爍任務(wù)
所有任務(wù)都獨(dú)立運(yùn)行,同時(shí)使用RTOS同步原語(yǔ)安全地共享系統(tǒng)資源。
步驟1:硬件和外設(shè)初始化
?使用STM32CubeMX配置系統(tǒng)時(shí)鐘,gpio, ADC, I2C, FSMC和PWM外設(shè)
?通過(guò)FSMC使用8080并行接口初始化LCD (ST7789 v3)
?通過(guò)I2C方式初始化AHT20溫濕度傳感器
?驗(yàn)證LED和電位器輸入的正確操作
引腳映射和接線連接:
GND -> Left Leg
PA1 -> Middle Leg
3.3V -> Right Leg
STM32 Dev Board -> RGB
GND -> Long Leg
PA6 -> Red Leg
PE13 -> Blue Leg
PE11 -> Green Leg
步驟2:驅(qū)動(dòng)程序集成和實(shí)現(xiàn)
?適應(yīng)/實(shí)現(xiàn)了ST7789驅(qū)動(dòng)程序(src/drv_lcd. + inc/drv_lcd.h和drv_lcd_font.c中的字體例程)來(lái)初始化顯示,設(shè)置窗口,并在FSMC上繪制文本/像素。
?實(shí)現(xiàn)AHT2x驅(qū)動(dòng)程序(src/drv_aht21.c + inc/drv_aht21.h)執(zhí)行I2C事務(wù)并將響應(yīng)轉(zhuǎn)換為溫度/濕度值。
?增加了簡(jiǎn)單的ADC讀取助手和PWM設(shè)置功能,用于LED控制。
步驟3 - RTOS任務(wù)設(shè)計(jì)
實(shí)現(xiàn)了四個(gè)重點(diǎn)的FreeRTOS任務(wù)(在src/main.c中創(chuàng)建):
?讀取AHT2x,格式化溫度字符串,更新LCD(周期性)。
?采樣ADC,平滑值,映射到PWM占空比的RGB LED。
?CounterTask -在LCD上增加并顯示一個(gè)計(jì)數(shù)器。
?BlinkTask -以穩(wěn)定的速率切換GPIO LED。
?每個(gè)任務(wù)運(yùn)行一個(gè)無(wú)限循環(huán),并在更新后使用vTaskDelay(),以便任務(wù)自愿放棄(協(xié)作式行為)。
步驟4 -同步:保護(hù)LCD
?為L(zhǎng)CD創(chuàng)建一個(gè)FreeRTOS互斥鎖(xSemaphoreCreateMutex())。
?每一個(gè)多步驟的LCD操作在寫(xiě)入前都要獲取互斥鎖(設(shè)置窗口→推像素→繪制文本),然后立即返回。
?在xSemaphoreTake上使用短超時(shí),以便任務(wù)可以跳過(guò)更新或重試,而不是死鎖。
步驟5 - ADC平滑和PWM映射
?應(yīng)用一個(gè)小的平滑濾波器(簡(jiǎn)單的EMA)原始ADC樣本,以避免可見(jiàn)的LED閃爍。
?將濾波后的ADC值映射到定時(shí)器PWM占空比并更新三個(gè)通道(R/G/B)。
步驟6 -電源考慮
?啟用FreeRTOS空閑處理(tickless-idle或vApplicationIdleHook),以便MCU可以在沒(méi)有任務(wù)準(zhǔn)備好時(shí)進(jìn)入睡眠狀態(tài)。
?確保睡眠進(jìn)入不會(huì)干擾所需的中斷(I2C, TIM, ADC)。
步驟7 -構(gòu)建,flash和驗(yàn)證
在STM32CubeIDE中構(gòu)建項(xiàng)目,并使用ST - Link進(jìn)行閃現(xiàn)。
物理板上已驗(yàn)證的行為:
?LCD初始化和清除。
?溫度顯示,并定期更新。
?計(jì)數(shù)器在它自己的LCD區(qū)域中遞增。
?電位器平滑地改變RGB亮度。
?閃爍LED以預(yù)期速率切換。
?沒(méi)有LCD損壞(互斥鎖保護(hù)訪問(wèn))。
步驟8:觀察、調(diào)整和決定
?保持LCD臨界區(qū)短:在RAM中準(zhǔn)備字符串/緩沖區(qū),然后短暫地使用互斥鎖進(jìn)行寫(xiě)入。
?輕微增加互斥鎖超時(shí),以減少在繁忙活動(dòng)期間跳過(guò)的更新。
?增加ADC平滑去除可見(jiàn)的閃爍。
?如果計(jì)劃稍后進(jìn)行較大的刷新,可以考慮使用DMA或雙重緩沖來(lái)減少顯示阻塞時(shí)間。
要在repo中檢查的文件(工作所在的地方):
-任務(wù)創(chuàng)建,互斥鎖創(chuàng)建,調(diào)度程序啟動(dòng),高級(jí)流程。
?src/drv_lcd., inc/drv_lcd.h - ST7789初始化和繪圖功能。
Src /drv_lcd_font.c, inc/drv_lcd_font.h -字體渲染和文本輔助程序。
?src/drv_aht21.c, inc/drv_aht21.h - AHT2x傳感器驅(qū)動(dòng)程序(I2C讀取/轉(zhuǎn)換)。
?/FreeRTOSConfig.h -本項(xiàng)目使用的RTOS配置。完整的repo的源代碼在最后。
結(jié)果示例
本文編譯自hackster.io





