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空闲中断和消息队列的使用相关推荐
- stm32的串口DMA空闲中断接收不等长数据,stm32F1的usart1-DMA-IDLE收发
stm32的DMA收发原理,和stm32F4 + USART2 +DMA +IDLE使用,见另一篇:https://blog.csdn.net/Mark_md/article/details/1072 ...
- stm32的串口DMA空闲中断接收不等长数据,stm32F4的usart2-DMA-IDLE收发
1. 串口为什么要使用DMA?好处? 提高系统实时性:stm32单片机的串口没有FIFO,使用字节中断的方式去接收,会频繁进入中断,影响系统实时性.好在stm32的串口可以级联DMA使用,在大数据量连 ...
- STM32应用(七)JY901九轴姿态模块(串口DMA空闲中断和I2C通信)
文章目录 0.相关基础知识介绍 0.1六轴.九轴传感器有什么区别? 1.JY901模块简介 1.1 产品概述 1.2 性能参数 1.3 实物图和接线 2.软件和使用说明书 3.串口通信JY901 3. ...
- STM32-HAL库串口DMA空闲中断的正确使用方式+解析SBUS信号
STM32-HAL库串口DMA空闲中断的正确使用方式+解析SBUS信号 一. 问题描述 二. 方法一--使用HAL_UART_Receive_DMA 三. 方法二--使用HAL_UARTEx_Rece ...
- GD32F4xx串口收发,DMA+空闲中断
GD32F4xx系列的串口收发DMA+空闲中断基础配置:(这里主要是以DMA+空闲中断为例) 原理就不赘述了,网上资料很多,这里直接进行配置和测试. 1,首先添加GD32F4xx的dma外设库函数文件 ...
- STM32L476 DMA空闲中断使用问题
项目场景: 使用STM32L476最小核心板与4G模块通信 问题描述: 使用了HAL DMA空闲中断的方式与模块通信.测试中发现,串口会时不时的接收数据失败,重新初始化串口,又可以使用了. 这个是串口 ...
- 基于STM32F407标准库串口DMA+空闲中断
核心板:STM32F407 实验目的:通过DMA接收串口发来的数据,并且利用串口空闲中断在将这些数据发送至串口助手. 在通常我们使用串口接收数据时,会使能串口接收中断,并在每次接收到数据后会进入中断将 ...
- STM32 hal库串口空闲中断最新用法
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言 一.串口空闲中断是什么? 二.使用步骤 1.hal库空闲中断接收函数 2.使用方法 3.最终效果 实际效果 总结 前言 ...
- freeRtos学习笔(4)消息队列
freeRtos学习笔记 freeRtos消息队列 为什么要用消息队列 消息队列可以在任务与任务间,中断与任务间传递信息.为什么不用全局数组?全局数组也可以传递信息,但是和消息队列相比,消息队列有一下 ...
最新文章
- 什么是COM与DCOM
- html语言的空格键,如何在如何在HTML中插入空格中插入空格
- [C++程序语言设计笔记一]面向对象编程抽象,继承,重写基本介绍
- list.action.php,教你利用 PHP 实现高性能微服务部署
- python基础——使用__slots__
- python中用于标识字符串的定界符_Python 基本数据类型
- ssh时,密码输入框(密码输入提示)很晚才出现的解决方法
- 带权并查集-Building Block
- 小说网jsp源码_基于jsp+mysql的JSP小说网
- 【Java】Java之Collections.emptyList()、emptySet()、emptyMap()的作用和好处以及要注意的地方
- 史上最浅显易懂的Git教程3 分支管理
- vector容器——容量和大小
- 百度 李彦宏 2008年在北大毕业典礼的演讲稿
- 使用octomap_server将点云地图转化为八叉树地图和占据栅格地图
- js pug 代码_Pug模板(一)
- Minimum supported Gradle version is 5.4.1. Current version is 4.10.1. If using the gradle wrapper
- plsql导入excel时无odbc importer中无dsn选项
- QQ注册页面(完整版)
- 通过钉钉机器人发送群消息通知
- 脑电图源成像:分析步骤的实践回顾
热门文章
- gulpfile php,Laravel利用gulp如何构建前端资源详解
- python数据分析与基础实战_《python数据分析与挖掘实战》基础概念
- wordpress 添加小工具分类
- Exynos4412 裸机开发—— 流水灯
- 对象文件格式分析工具: objdump, nm,ar
- 前端学习(3288):object.define
- 前端学习(3284):立即执行函数三
- react学习(57)--map赋值
- 前端学习(3189):react简介
- [vue] vue边界情况有哪些?