STM32 FreeRTOS USART DMA空闲中断和消息队列的使用
(后文有修改)
一、思路
USART+DMA空閑中斷發生后,將接收到的DMA消息用消息隊列發出去xQueueSendToFrontFromISR,FreeRTOS創建一個獨立的任務一直等待接受消息隊列。
DMA中斷可以被FreeRTOS管理。
二、CubeMx配置驅動
2.1 USART+DMA
FreeRTOS設置的中斷管理范圍為5~15,USART中斷應該在該范圍內,此處設計為7。
2.2 FreeRTOS創建UsartRx 任務,創建消息隊列Queue,生成代碼。
三、修改代碼
3.1 usart.c
(1)增加引用和定義
(2)編寫中斷處理函數
3.2 XXXit.c
3.3 FreeRTOS.c
修改CubeMx創建的usartRxMsgQueueHandle,指定為隊列深度為3,單個Item大小為sizeof(USART_RECEIVETYPE)。
MX_FREERTOS_Init(void)執行結束后將isFreeRTOSSysOn設置為1,通知串口中斷處理程序啟用xQueueSendToFrontFromISR。
最后在usartRxFunc任務函數入口編寫串口數據業務處理邏輯,調用xQueueReceive一直阻塞等待。
四、消息隊列的使用方式
1、使用隊列添加引用:#include "queue.h"2、初始化:osMessageQueueId_t usartRxMsgQueueHandle; const osMessageQueueAttr_t usartRxMsgQueue_attributes = {.name = "usartRxMsgQueue" };usartRxMsgQueueHandle = osMessageQueueNew (3, sizeof(USART_RECEIVETYPE), &usartRxMsgQueue_attributes);3、發送隊列消息 (1)中斷函數中發送隊列消息 xQueueSendToFrontFromISR、xQueueSendToBackFromISR、xQueueOverwriteFromISR、xQueueSendFromISR、xQueueGenericSendFromISR等 e.g. xxxISR(void) {BaseType_t xHigherPriorityTaskWoken = pdFALSE;...xQueueSendToFrontFromISR(usartRxMsgQueueHandle,&Uart1Rx,&xHigherPriorityTaskWoken);...portYIELD_FROM_ISR(xHigherPriorityTaskWoken); } (2)普通函數中發送隊列消息 xQueueSendToFront、xQueueSendToBack、xQueueOverwrite、xQueueSend、xQueueGenericSend等4、等待、查詢接受隊列消息 (1)中斷函數中查詢隊列消息 xQueuePeekFromISR等(2)普通函數中等待查詢隊列消息 xQueueReceive、uxQueueMessagesWaiting、xQueuePeek、uxQueueSpacesAvailable等2021 09 22 補充:
以上實現隊列使用方法是基于cmsis_os,對于cmsis_os2,已經不需要考慮接口是否是FromISR,直接使用osMessageQueuePut接口即可。如下:
?
?
?
?
總結
以上是生活随笔為你收集整理的STM32 FreeRTOS USART DMA空闲中断和消息队列的使用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 曲线的生成算法实现_PCGPlanet1
- 下一篇: 【转】VS2013 产品密钥 – 所有版