(后文有修改)

一、思路

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空闲中断和消息队列的使用相关推荐

  1. stm32的串口DMA空闲中断接收不等长数据,stm32F1的usart1-DMA-IDLE收发

    stm32的DMA收发原理,和stm32F4 + USART2 +DMA +IDLE使用,见另一篇:https://blog.csdn.net/Mark_md/article/details/1072 ...

  2. stm32的串口DMA空闲中断接收不等长数据,stm32F4的usart2-DMA-IDLE收发

    1. 串口为什么要使用DMA?好处? 提高系统实时性:stm32单片机的串口没有FIFO,使用字节中断的方式去接收,会频繁进入中断,影响系统实时性.好在stm32的串口可以级联DMA使用,在大数据量连 ...

  3. STM32应用(七)JY901九轴姿态模块(串口DMA空闲中断和I2C通信)

    文章目录 0.相关基础知识介绍 0.1六轴.九轴传感器有什么区别? 1.JY901模块简介 1.1 产品概述 1.2 性能参数 1.3 实物图和接线 2.软件和使用说明书 3.串口通信JY901 3. ...

  4. STM32-HAL库串口DMA空闲中断的正确使用方式+解析SBUS信号

    STM32-HAL库串口DMA空闲中断的正确使用方式+解析SBUS信号 一. 问题描述 二. 方法一--使用HAL_UART_Receive_DMA 三. 方法二--使用HAL_UARTEx_Rece ...

  5. GD32F4xx串口收发,DMA+空闲中断

    GD32F4xx系列的串口收发DMA+空闲中断基础配置:(这里主要是以DMA+空闲中断为例) 原理就不赘述了,网上资料很多,这里直接进行配置和测试. 1,首先添加GD32F4xx的dma外设库函数文件 ...

  6. STM32L476 DMA空闲中断使用问题

    项目场景: 使用STM32L476最小核心板与4G模块通信 问题描述: 使用了HAL DMA空闲中断的方式与模块通信.测试中发现,串口会时不时的接收数据失败,重新初始化串口,又可以使用了. 这个是串口 ...

  7. 基于STM32F407标准库串口DMA+空闲中断

    核心板:STM32F407 实验目的:通过DMA接收串口发来的数据,并且利用串口空闲中断在将这些数据发送至串口助手. 在通常我们使用串口接收数据时,会使能串口接收中断,并在每次接收到数据后会进入中断将 ...

  8. STM32 hal库串口空闲中断最新用法

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言 一.串口空闲中断是什么? 二.使用步骤 1.hal库空闲中断接收函数 2.使用方法 3.最终效果 实际效果 总结 前言 ...

  9. freeRtos学习笔(4)消息队列

    freeRtos学习笔记 freeRtos消息队列 为什么要用消息队列 消息队列可以在任务与任务间,中断与任务间传递信息.为什么不用全局数组?全局数组也可以传递信息,但是和消息队列相比,消息队列有一下 ...

最新文章

  1. 什么是COM与DCOM
  2. html语言的空格键,如何在如何在HTML中插入空格中插入空格
  3. [C++程序语言设计笔记一]面向对象编程抽象,继承,重写基本介绍
  4. list.action.php,教你利用 PHP 实现高性能微服务部署
  5. python基础——使用__slots__
  6. python中用于标识字符串的定界符_Python 基本数据类型
  7. ssh时,密码输入框(密码输入提示)很晚才出现的解决方法
  8. 带权并查集-Building Block
  9. 小说网jsp源码_基于jsp+mysql的JSP小说网
  10. 【Java】Java之Collections.emptyList()、emptySet()、emptyMap()的作用和好处以及要注意的地方
  11. 史上最浅显易懂的Git教程3 分支管理
  12. vector容器——容量和大小
  13. 百度 李彦宏 2008年在北大毕业典礼的演讲稿
  14. 使用octomap_server将点云地图转化为八叉树地图和占据栅格地图
  15. js pug 代码_Pug模板(一)
  16. Minimum supported Gradle version is 5.4.1. Current version is 4.10.1. If using the gradle wrapper
  17. plsql导入excel时无odbc importer中无dsn选项
  18. QQ注册页面(完整版)
  19. 通过钉钉机器人发送群消息通知
  20. 脑电图源成像:分析步骤的实践回顾

热门文章

  1. gulpfile php,Laravel利用gulp如何构建前端资源详解
  2. python数据分析与基础实战_《python数据分析与挖掘实战》基础概念
  3. wordpress 添加小工具分类
  4. Exynos4412 裸机开发—— 流水灯
  5. 对象文件格式分析工具: objdump, nm,ar
  6. 前端学习(3288):object.define
  7. 前端学习(3284):立即执行函数三
  8. react学习(57)--map赋值
  9. 前端学习(3189):react简介
  10. [vue] vue边界情况有哪些?