巧用STM32串口DMA的normal和circular模式,达到并行执行效果
芯片型号:stm32f103rct6;SPI接口ADC;
代码功能描述:有xyz3路数据,每路1个双通道adc采集,从x路依次数据并用串口发送出去,14字节,2250000bps;
方案1:按照顺序执行,依次采集各路数据,然后uart发送。这样也行,但是我不喜欢,这样会影响数据更新的速率,就拿x路来说,要等yz路,串口发送都完成了,x路才开始下一次数据采集。我的目的是尽量提高各路数据更新的速率。方案1不满足。
方案2:考虑用DMA发送,释放CPU。
DMA有normal和circular两种模式。
circular用法:(STM32CubeMX配置串口DMA省略)在main函数中该初始化的都初始化完毕之后,紧接着一句:
HAL_UART_Transmit_DMA(&huart1, (uint8_t*)Tx_frame, LENGTH_FRAME);
就调用这个函数一次就可以了,DMA一直开启,一帧数据发送完毕之后里面发送下一帧,中间没有停顿。这样确实是快了,也释放了CPU,各路的数据采集因为缺少了等待串口发送的时间,所以就间接提高的了数据更新速率。但有个致命缺陷:数据采集和数据发送各玩各的,就是他俩时序对不上,数据采集到一半,一个完整帧数据只更新了一部分,就被DMA挪走了,这样就把新旧数据一块发送出去了,circular模式的DMA才不管数据有没有完整更新,只管发。
normal用法:为了解决circular带来的问题,采用normal模式,就是每发一次就开启一次DMA,这样就可以等一帧数据更新完毕之后,再开启DMA发送,同样不会占用CPU,在DMA发送数据的时间里CPU可以开启下一轮的数据采集。
再HAL库配置好normal模式后,在数据采集的代码后面,比如采集数据代码是这样执行的:
CSX=0;
采集X_ADC_通道1;
采集X_ADC_通道2;
CSX=1;
CSY=0;
采集Y_ADC_通道1;
采集Y_ADC_通道2;
CSY=1;
CSZ=0;
采集Z_ADC_通道1;
采集Z_ADC_通道2;
CSZ=1;
HAL_UART_Transmit_DMA(&huart1, (uint8_t*)Tx_frame, LENGTH_FRAME);
- 这样数据采集和数据发送几乎是并行执行的,可以大大提高各路数据更新的速率。
STM32的UART使用DMA操作不要入的坑
巧用STM32串口DMA的normal和circular模式,达到并行执行效果相关推荐
- STM32串口+DMA使用1
STM32串口+DMA使用 STM32有5个串口资源(USART1,USART2,USART3及UART4,UART5).其中3个USART(通用同步/异步收/发器universalsynchrono ...
- STM32 串口DMA接收 Openmv / K210 整数、小数字符串数据 (基于HAL库)
目录 前言 一.工程配置 二.串口DMA部分代码 1.源文件UART_DMA.c 2.头文件UART_DMA.h 3.stm32f1xx_it.c的修改 4.串口收发DMA测试 三.字符串数字提取代码 ...
- STM32 串口DMA收发(二)
STM32 串口DMA收发数据 一.STM32 DMA简介与功能说明 1.STM32F4 DMA简介 DMA(Direct memory access),即直接存储器访问.用于在外设与存储器之间以及存 ...
- STM32串口DMA接收双缓冲
STM32高端MCU(F4.F7等)才支持DMA双缓冲,低端MCU(F1)不支持DMA双缓冲,不过有替代方案可实现类型效果. 一.MCU支持DMA双缓冲的情形 不再赘述,参见博客 STM32 串口DM ...
- dma接收双缓存 stm32_容易被大多数人忽视的STM32串口DMA问题
讨论三个问题: 1.什么叫串口DMA 请求: 2.串口简要复习: 3.串口DMA发送流程. 第一 什么叫串口DMA 请求(战舰STM32开发板) 说这个问题之前先简单回顾DMA的基本特性.先导出原子哥 ...
- FPGA 串口中断_一个严谨的STM32串口DMA发送amp;接收(1.5Mbps波特率)机制
昨天分享的<嵌入式大杂烩读者福利:第一期>大家有去抽奖吗,没抽的可参与抽奖,碰碰运气.我最喜欢抽奖了,还记得前几个月疫情严重时期连抽中了3包口罩,真刺激,哈哈.之后多多安排抽奖,敬请期待. ...
- 一个严谨的STM32串口DMA发送接收(1.5Mbps波特率)机制
文章目录 1 前言 2 串口有必要使用DMA吗 3 实现方式 4 STM32串口使用DMA 5 串口DMA接收 5.1 基本流程 5.2 相关配置 5.3 接收处理 5.3 .1 接收数据大小 5.3 ...
- STM32使用DMA在Normal模式下二次传输
当STM32的DMA配置为Normal(即单次)模式时,在DMA第一次传输完成后,要启动第二次DMA传输,需先关闭该DMA通道,重新设置DMA传输数据个数,再开启DMA通道. 原理和定时器关闭自动重载 ...
- 【32单片机学习】(6)STM32串口+DMA收发不定长数据
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 目录 前言 1.DMA介绍 2.串口接收数据 3.实验现象 1.实验电路图 2.串口收发不定长数据视频演示 3.OLED 显示接收数据 ...
最新文章
- 一周内被程序员疯转5.6W次,最终被大厂封杀!
- VS 2010 Beta2中WPF与Silverlight的关键区别?
- hihocoder 1320 压缩字符串(字符串+dp)
- js点击获取连接的内容
- 八篇 NeurIPS 2019 最新图神经网络相关论文
- mapreduce任务出错最大尝试次数
- C语言rewind()函数(设置文件位置为给定流 stream 的文件的开头)(回到文件开头重读)
- 使用HTML5开发手机离线应用
- 小白爬虫第一弹之抓取妹子图【更新版】
- leetcode----------Excel Sheet Column Number
- vue element table 修饰
- python numpy安装windows_windows下安装python的numpy,scipy,sklearn
- php 多附件上传插件下载,大文件、多文件分片上传插件
- 第10章 十字消除(《C和C++游戏趣味编程》配套教学视频)
- matlab 2018 adams,关于ADAMS与MATLAB联合仿真的一点经验
- 2022-2028年中国公私合作(PPP)模式深度分析及发展战略研究报告
- Java 微服务实践
- oracle使用text类型,oracle数据库中text类型用什么类型表示
- Air202掉坑日记(2)——连接阿里云成功后自动掉线(AT版本)
- 全面了解风控指标体系
热门文章
- Learning Shape Representations for Clothing Variations in Person Re-Identification
- http://nianjian.xiaze.com/tags.php?/%E6%BD%BC%E5%85%B3%E5%B9%B4%E9%89%B4/1/13595315666/
- C++实现骰子涂色算法
- 计算机的常见故障处理实验报告,实训13 微机常见故障处理实训报告.doc
- html标签em和i的区别,HTML中strong与b,em与i标签的区别和使用建议
- stc89c51单片机音乐盒系统设计_基于单片机数字音乐盒的设计与实现(附PCB,电路图,程序)...
- wing101 缩进不管用_与lg wing一起使用最有用的双屏手机
- rjs 中的一些记下 免的忘 了
- Salesforce系列(六):Salesforce Apex基础SOQL查询和数据添加!
- 华硕电脑一开机就等待按F1然后自动进入BIOS界面如何解决