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