串口通讯(DMA模式)
在高级语言中,I/O 流输入(input)操作一般都要求指定要读取的数据的最大长度(字节数)。当接收到至少1字节、最多所指定的字节数时,函数返回。
STM32 串口接收数据时,HAL API 要求指定数据长度。但无论轮询、中断或是DMA方式,都必须完整地接收到这么多字节,程序流程才继续。如何接收变长消息,我想不到特别好的实现方式。一种方式是,轮询加超时。另一种方式是,设计消息协议,使消息头为定长,且消息头内包含消息体的长度。但是,如果通讯异常,导致消息数据错误或丢失,那么,还是缺少“提前返回”的机制。
相对来说,轮询加超时的方式似乎更好些。效率低,但是是可靠的。我也不确定。
DMA是STM32内的一个硬件模块,它独立于CPU在外围设备和内存之间进行数据传输,解放了CPU。每个型号的STM32 MCU有1-2个DMA,每个DMA有一定数量的Channel。每个Channel两端分别绑定到外围设备和内存。每个Channel可与哪种外围设备绑定,这是STM32设计时固定下来的,要查询参考手册得知。
Nucleo-F303RE 的 USART2 支持DMA。使用 DMA模式发送数据,要启用 DMA Channel的中断和USART2的中断。数据发送完成时,HAL会触发USART2 的中断进而调用中断回调函数。概况起来:
- 调用 HAL_UART_Transmit_DMA() 函数发送数据
- 实现 HAL_UART_TxCpltCallback() 回调函数。当数据发送完成后,此函数被HAL调用
下面的例程使用 DMA 方式依次从串口发送3条消息。App_loop() 在main() 函数的主循环中被调用。当串口数据发送完成时,txDone 标志被置1,此时将闪烁 LED(blink()),并发送下一条消息:
static void blink();static const char * msgArr[] = { "We still can find a way\n", //"Because nothing lasts for ever\n", //"Event the cold November rain\n" };static int msgIndex = 0;
volatile uint8_t txDone = 1;void App_loop() {if (txDone) {blink();txDone = 0;const char * msg = msgArr[msgIndex];HAL_UART_Transmit_DMA(&huart2, (uint8_t *) msg, strlen(msg));msgIndex = (1 + msgIndex) % 3;}
}void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart) {txDone = 1;
}
从Cube HAL的角度来说,就这么多。
转载于:https://www.cnblogs.com/vinccc/p/8296103.html
串口通讯(DMA模式)相关推荐
- Cypress EZ-USB FX3 DMA模式下的串口通讯
由于公司设备升级后出了问题,需要对USB驱动进行修改,原本使用的是寄存器模式进行UART传输,但是由于FX3寄存器模式会出现长时间延时等待的问题,不得不对其传输模式进行修改.虽然赛普拉斯的EZ-USB ...
- STM32从零到一,从标准库移植到HAL库,UART串口1以DMA模式收发不定长数据代码详解+常见问题 一文解析
前言 本文的参考资料 感谢提供标准库版本的CSDN同学:这两篇文章至少是我看过的最详细的标准库配置DMA版本.而且代码实测稳定能用. STM32 | DMA配置和使用如此简单(超详细)_...| .. ...
- 【沁恒WCH CH32V307V-R1的单线半双工模式串口通讯】
[沁恒WCH CH32V307V-R1的单线半双工模式串口通讯] 1. 前言 2. 软件配置 2.1 安装MounRiver Studio 3. UASRT项目测试 3.1 打开UASRT工程 3.2 ...
- 串口工作在DMA模式下有时接收异常
1 前言 客户反馈在使用STM32F205的串口工作在DMA模式时,有时能够接收数据,有时完全没有数据,但如果换成中断模式来接收又能100%正常收到数据. 2 复现现象 2.1 问题背景 与客户沟通, ...
- 手把手教你从0创建STM32串口空闲+DMA数据接收工程
串口通讯是嵌入式系统中最常用的通讯方式. STM32的串口接收普通的方式是在串口读数据寄存器非空RXNE中断(Read data register not empty)中1个字节1个字节的接收串口数据 ...
- 串口通讯基础及S3C2410 UART控制器
数据通信的基本方式可分为并行通信与串行通信两种: 并行通信:是指利用多条数据传输线将一个资料的各位同时传送.它的特点是传输速度快,适用于短距离通信,但要求通讯速率较高的应用场合. 串行通信:是指利用一 ...
- linux can总线接收数据串口打包上传_USART串口通讯
在计算机科学里,大部分复杂的问题都可以通过分层来简化.如芯片被分为内核层和片上外设:STM32 标准库则是在寄存器与用户代码之间的软件层.对于通讯协议,我们也以分层的方式来理解,最基本的是把它分为物理 ...
- 【STM32学习笔记】(9)——串口通讯(USART)详解
本文主要参考了野火的零死角玩转STM32和正点原子的STM32F1 开发指南 V1.1(精英板-库函数版本),文章中大部分知识都是从两本书中提取出来,串口通信协议的知识主要参考野火的书籍,而串口实验部 ...
- 【STM32】 STM32 F4 串口通讯
概念 串口,即串行接口,是一种可以将接收来自CPU的并行数据字符转换为连续的串行数据流发送出去,同时可将接收的串行数据流转换为并行的数据字符供给CPU的器件. 串口通信(Serial Communic ...
- STM32的USART串口通讯程序
文章目录 一.STM32 USART串口通信 1.串口通信简介 1.1.物理层 1.2.协议层 2.STM32 的 USART 简介 二.STM32的USART串口通讯程序 1.创建项目 2.添加.s ...
最新文章
- Android Handler杂记(结合别人的blog)
- poj 1950 Dessert(dfs枚举,模拟运算过程)
- 麒麟 UKUI 3.0 发布预告视频,能否接替 Win 7 成为大家的新选择?
- ajax上传.mp4文件不出错,ajax视频如何上传?
- is_enabled:selenium中判断元素是否可以使用;is_selected()/is_displayed()
- 关于宁盾平台Spring框架RCE 0day漏洞修复的公告
- matlab colarbar设置,matlab color bar 如何改变色调
- 【生产调度】基于Harmony Search (HSPMS) 和 Shuffled Complex Evolution (SCEPMS) 实现并行机器调度附matlab代码
- Java進階:ExecutorService 線程池
- 2020面试要点大全
- 【LeetCode每日一题】——714.买卖股票的最佳时机含手续费
- 6U VPX NVME存储板 速度≥10GB/S 最大32TB
- Linux下使用AppImageLauncher安装AppImage文件
- p20华为云电脑白屏_华为P20云电脑方案曝光:运行Windows系统
- js设置页面语音播放
- 来看看Jmeter官网给我们的提示之如何减少资源使用
- 如何在3个月内写出博士论文
- 腾讯广点通深度用户挖掘与精准广告定向
- iOS开发-发送邮件及短信
- TCP/IP协议学习记录之九:Traceroute程序
热门文章
- (1)数据结构-绪论
- (8)机器学习_混淆矩阵(分类模型评估)
- python property使用
- java io 读取配置文件_(转)Java 读写Properties配置文件
- android从本地图片导入应用,android – 将图像添加到图库
- VGG16的10折交叉验证实现cifar10的分类(keras实现)
- 卷积神经网络 第一周作业 Convolution+model+-+Application+-+v1
- hyperparameter_hunter 超参数优化模块实践
- 当前读和快照读是什么 区别
- fisco bcos PerformanceDT.java 源码解析阅读注释