STM32开发 --- USART的3种发送方式
之前写了两三篇关于USART+DMA数据传输的笔记。
这里记录另一种数据发送方式:利用中断发送。
总结三种发种方式, 并分析其优缺点:
- 正常发送(while);
- 使用DMA发送;
- 使用中断发送;
实验使用搭建
- 软件: Keil_v5.27 (目前最好用的版本)
- 硬件: STM32F103C8T6 (魔女开发板 集成下载器, 接线轻松)
- 串口上位机: 秉火串口调试助手 (野火的, 感觉比原子哥的启动要快)
需要完成代码的兄弟, 到Q群文件夹里下载: 262901124
方式一:正常发送
初学STM32时,必用的发送方式。
看看熟悉的代码:
// 发送一个字符串
void Usart1_SendString( char* buff )
{while( *buff !=0 ) // 检查是否是字符串结束符{while( (USART1->SR & 1<<7) == 0 ); // 等待发送缓冲区空闲USART1->DR = *buff; // 填入发送数据buff++; // 发送数据指针后移}
}
优点:代码和逻辑都简单,容易理解!新手必备!
缺点:利用while不断检测发送状态+等待,挨个字节发出,其实很费时;如115200波特率,发送100个字节,至少用时8700us!!而且发送期间,中断响应外,整个程序、系统不能干其它事,如假死一般;
方式二:使用DMA发送
先看代码:
// 发送一个字符串
void Usart1_Send_DMA(char* charTemp)
{u32 num = 0; // 发送的数量,注意发送的单位不是必须8位的 static u8 Flag_DmaTxInit=0; // 用于标记是否已配置DMA发送char* t=charTemp ; // 用于配合计算发送的数量while(*t++ !=0) num++; // 计算要发送的数目,这步比较耗时,测试发现每多6个字节,增加1us,单位:8位 while(DMA1_Channel4->CNDTR > 0); // 如果DMA还在进行上次发送,就等待; 得进完成中断清标志,F4不用这么麻烦,发送完后EN自动清零if( Flag_DmaTxInit == 0) // 是否已进行过USAART_TX的DMA传输配置{ Flag_DmaTxInit = 1; // 设置标记,下次调用本函数就不再进行配置了USART1 ->CR3 |= 1<<7; // 使能DMA发送RCC->AHBENR |= 1<<0; // 开启DMA1时钟 [0]DMA1 [1]DMA2 DMA1_Channel4->CCR = 0; // 失能, 清0整个寄存器, DMA必须失能才能配置DMA1_Channel4->CNDTR = num; // 传输数据量 DMA1_Channel4->CMAR = (u32)charTemp; // 存储器地址 DMA1_Channel4->CPAR = (u32)&USARTx->DR;// 外设地址 DMA1_Channel4->CCR |= 1<<4; // 数据传输方向 0:从外设读 1:从存储器读DMA1_Channel4->CCR |= 0<<5; // 循环模式 0:不循环 1:循环DMA1_Channel4->CCR |= 0<<6; // 外设地址非增量模式DMA1_Channel4->CCR |= 1<<7; // 存储器增量模式DMA1_Channel4->CCR |= 0<<8; // 外设数据宽度为8位DMA1_Channel4->CCR |= 0<<10; // 存储器数据宽度8位DMA1_Channel4->CCR |= 0<<12; // 中等优先级DMA1_Channel4->CCR |= 0<<14; // 非存储器到存储器模式 } DMA1_Channel4->CCR &= ~((u32)(1<<0)); // 失能,DMA必须失能才能配置DMA1_Channel4->CNDTR = num; // 传输数据量DMA1_Channel4->CMAR = (u32)charTemp; // 存储器地址 DMA1_Channel4->CCR |= 1<<0; // 开启DMA传输
}
代码是寄存器编程,精简。但如果使用标准库,或者HAL库,那么代码量会怕吓怕很多人......
优点:
- 占用资源最少,发送100字节(用"处理"这个词更好理解), 只需大约30us, 比方式1发送快290倍!!
- 发送工作都在后台,调试时特省工夫。别看代码好像很复杂,其实过程会很简单,只要配置好DMA基本就没啥事了。
缺点:
- 代码长,易出错。 这里指的是使用标准库,或HAL库编写的代码, 调试时, 发量直线下降
- 发送处理的时间确实很短, 但后台中还得按设定的波特率进行发送, 115200, 100字节, 后台工作时长还是要8600us左右, 如果在这8600us期间, 又有新的数据要发送出去, 要么等待上次的发送完成,要么停止上次未完的发送。
方式三:发送中断
这种方式,可以说是UART数据发送的最优解!!
先看代码:
static u8 TxBuffer[512] ; // 数组大小根据实际数据、发送频率调整
static u8 TxCounter = 0 ;
static u8 LastCount = 0 ;// 发送一个字符串
void Usart1_SendIE(u8* buf, u8 cnt) // 指定数据长度,可发送各种数据, 而不仅限于字符串
{for(u8 i=0; i<cnt; i++) // 把要发送的数据,复制到待发送区(数组)TxBuffer[LastCount++] = buf[i]; // 如果加个while, 也可以发送不定长字符串if( (USARTx->CR1 & 1<<7) == 0 ) // 开启 发送缓冲区空置中断, 在USART初始化时,先不要打开空置中断USARTx->CR1 |= 1<<7;
}// 中断服务函数
void USART_IRQHANDLER(void)
{ if(USART1->SR & 1<<7) // 检查中断来源:发送缓冲区空置——TXE{USART1->DR = TxBuffer[TxCounter++]; // 发送缓冲区填充一个字节if(TxCounter == LastCount ) // 检查发送是否完成USART1->CR1 &= ~(1<<7); // 关闭发送缓冲区空置中断}
}
代码量比想象中的要少,而且很有意思~~~。
优点:
- 占用资源少,没准确测量时间,如100字节,估计总用时100us左右吧,但分100次中断分摊。
- 发送期间,如果有新的数据要发送,交追加到发送区的尾部,不会像DMA那样被抹掉。
缺点:
- 逻辑比DMA要多两个弯弯, 调试时有点麻烦;
STM32开发 --- USART的3种发送方式相关推荐
- stm32运行java_STM32之——3种启动方式学习
参考: https://blog.csdn.net/wwt18811707971/article/details/78678059 所谓启动,一般来说就是指我们下好程序后,重启芯片时,SYSCLK的第 ...
- x210开发板的三种启动方式(三星推荐的,分散加载,uboot采用的)
1.三星推荐的启动方式 (1)将bl1放在在SRAM中运行,将bl2也在SRAM中运行,就像datasheet中描述那样. (2)bootloader必须小于96KB并大于16KB,假定bootloa ...
- RocketMQ—Producer(三)发送方式和消息类型
一:发送方式讲解 RocketMQ版提供三种方式来发送消息:同步(Sync)发送.异步(Async)发送和单向(Oneway)发送. 我们会介绍每种发送方式的原理.应用场景.代码差异,以及三种发送方式 ...
- NBIOT 移远BC28模块+stm32开发板例程、教程(打通TCP、COAP协议)
为了开发者能够快速入门BC28的开发,加快开发者的项目进度,开发出此款针对BC28的stm32开发板和完善的发送网络数据的示例程序(TCP协议.COAP协议),程序流程逻辑清楚,注释完善,上手就可以玩 ...
- STM32开发 -- 4G模块开发详解(3)
如需转载请注明出处:https://blog.csdn.net/qq_29350001/article/details/81782682 上面两篇文章,基本上把软硬件部分讲完了.接下来我们就看一下收发 ...
- rocketMQ的消息介绍、发送方式和消费方式
rocketMQ中消息有以下几种 普通消息:消息队列中没有特性的消息 顺序消息:严格按照顺序发布和消费的消息,先发布的消息一定会先被消费,可以分为 全局顺序消息:所有消息严格按照先入先出的顺序来发布和 ...
- 流媒体的几种播放方式
流媒体技术的出现,极大程度的解决了互联网传输多媒体数据的方式,不仅提高了网络直播.VOD点播等互联网传输.下载的速度,更改变了人们的生活和工作方式.在流媒体技术中,流媒体的份额是和播放方式是最终用户很 ...
- 大白NBIOT 移远BC28模块+stm32开发板例程、教程(打通TCP、COAP协议)
大白为了开发者能够快速入门BC28的开发,加快开发者的项目进度,大白开发出此款针对BC28的stm32开发板和完善的发送网络数据的示例程序(TCP协议.COAP协议),程序流程逻辑清楚,注释完善,上手 ...
- STM32的USART串口通讯程序(查询方式)
STM32的USART串口通讯程序(查询方式) 文章目录 STM32的USART串口通讯程序(查询方式) 一.USART介绍 1.异步通信: 2.同步通信: 二.CubeMX创建项目 1.点击ACCE ...
最新文章
- LeetCode Decode Ways(动态规划)
- 一句话回复:关于'SqlMembershipProvider' requires a database schema compatible with schema version '1'...
- php mysql 批量insert_mysql批量插入数据方法
- python装饰品 后端_python装饰器
- boost::program_options 用法详解
- Nacos初探(3)-- 服务发现原理解析
- 二线水温传感器怎么检测_水温传感器出现故障,发动机真的会限矩吗?本文告诉你答案...
- python 使用 .qrc文件
- Windows事件ID大全
- [安洵杯 2019]easy misc 1
- 高中计算机竞赛学什么,什么是高中数学竞赛,要怎么去做?
- Java,设计,功能权限和数据权限,用户、角色、权限和用户组
- 下载想看的英文kindle 电子书
- arm搭建云手机教程_云手机解决方案对比:arm服务器与安卓板机
- 数据流压缩原理实现(huffman编码,LZ77压缩算法)
- 笨方法学Python 习题21
- 【无标题】拼多多商品详情API接口
- rsync+inotify高效实时同步
- 晃乱年华,谁的呢喃呓语?
- vue引入音乐播放器插件