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





