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接口即可。如下:

 

 

 

 

  • 1
    点赞
  • 44
    收藏
    觉得还不错? 一键收藏
  • 11
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值