tip:如有错误,希望指出,非常感谢!
目录
简介
本文主要是对USART知识点的回顾总结,采用刚学习的STM32CubeMX 进行测试学习,对整个学习过程的一个记录总结,方便以后查阅。
一、USART是什么?
USART全称:universal synchronous asynchronous receiver and transmitter通用同步/异步收/发器,是一个串行通信设备,可以灵活地与外部设备进行全双工数据交换。一般情况下,我们32单片机的串口通信采用的是UART异步通信,传输时只需配置协议层:波特率、起始位、数据位、奇偶效验位、停止位,只有保持双方数据包的格式要一致,才能正常的接受发数据!(注意:在使用蓝牙模块、WiFi模块等模块时,需要连接一条共地线)
二、问答
通信方式
1、串行通信:
- 定义:数据按位顺序传输
- 优点:占用引脚资源少
- 缺点:传输速率相对较慢
2、并行通信:
- 定义:数据各位同时传输
- 优点:传输速率相对较快
- 缺点:占用引脚资源多
1.USART和UART区别
UART全称:universal asynchronous receiver and transmitter通用异步收/发器,它是在 USART 基础上裁剪掉了同步通信功能,只有异步通信。
在异步通讯的情况下,USART是和UART 是没什么区别的;但是在同步通信的情况下,就有一些区别的,因为同步通信是需要依靠时钟来控制实现数据传输的,UART 是不需要时钟信号来同步的异步,全双工串口总线。
2.单工、半双工、全双工区别
- 单工:数据传输只支持数据在一个方向上传输,一方只能接收信号,另一方只能发送信号。例如:电视机,小米盒子等。
- 半双工:允许数据在两个方向上传输,但是同一时间数据只能在一个方向上传输,相当于是可切换的单工。例如:RS-485、I2C、对讲机等。
- 全双工:允许数据同时在两个方向上传输。例如:USART、SPI、RS232、SPI、手机通话等。
三、代码实验
1、说明
本次实验是通过STM32CubeMX 直接生成初始化代码,不写出整个具体的流程,只说明核心部分。
详细可参考:GPIO为例的STM32CubeMX使用流程 https://blog.csdn.net/weixin_45684469/article/details/122341014)
本次测试实验主要编写一个程序实现开发板与上位机通信,在开发板上电后通过USART发送一串字符串给上位机,然后开发板进入中断接收等待状态,如果上位机有数据发送过来,开发板就会产生中断,我们在中断服务函数接收数据,并马上把数据返回发送给电脑。
思路:
1、使能时钟、初始化USART1、NVIC等生成代码
2、在main函数前,串口初始化后,调用HAL_UART_Receive_IT函数(串口中断模式接收)
3、修改HAL_UART_RxCpltCallback中断回调函数,处理接收的数据。
2、代码初始化配置及修改
- 完成基本的时钟配置 —> 配置USART1 (Asynchronous 异步通信 、 Baud Rate 波特率为 115200 Bits/s、World Length传输数据长度为 8 Bit、Parity 奇偶检验 None,Stop Bits 停止位 1 ,Data Direction接收和发送都使能、Over Sampling 过采样 16倍(增强抗干扰))。
2、调用串口中断模式接收,
HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size) 参数:
- UART_HandleTypeDef *huart : USART结构体
- *pData : 接收到的数据存放地址
- Size : 接收的字节数
3、重定义HAL_UART_RxCpltCallback中断回调函数(内容:判断是否为USART1,然后将接收到的数据通过HAL_UART_Transmit函数发回个上位机,然后重新开启串口中断模式接收)
4、重定向printf、getchar(注意:需要包含#include <stdio.h>)
3、注意点
1、STM32CubeMX 中断处理流程
在我们使用中断的时候,hal库通过一级级的调用,最终调用到HAL_UART_RxCpltCallback中断回调函数,根据NOTE提示以及在库中该函数带__weak 弱化标识,也就是说我们只需要重新定义该函数,在该函数中重新写中断服务函数就可以了。
/* NOTE: This function Should not be modified, when the callback is needed,
the HAL_GPIO_EXTI_Callback could be implemented in the user file*/
这个函数不应该被改变,如果需要使用回调函数,请重新在用户文件中实现该函数。
2、关于HAL_Delay和NVIC中断冲突问题
问题:调用HAL_Delay卡死,无法进入中断。
分析:由于在使用STM32CubeMX软件配置的时候Time base:Systime tick time的抢占优先级和响应优先级都是0,于我们配置NVIC的两个优先级是一样的,所以会出现HAL_Delay卡死的情况。
解决方案:将NVIC的优先级降低。
4、验证
总结
本次实验主要是是对USART知识的回顾学习以及测试总结,并通过最近刚学的软件STM32CubeMX进行开发,养成边学习边开发记录的一个习惯。
如有不当之处,欢迎指正。
附录|参考
- STM32CubeMX项目搭建流程:https://blog.csdn.net/weixin_45684469/article/details/122341014
- STM32–USART(串口通信):https://blog.csdn.net/zxh1592000/article/details/78656609
- HAL库USART函数 :https://blog.csdn.net/as480133937/article/details/99073783
- HAL_Delay与NVIC问题: https://blog.csdn.net/weixin_43892323/article/details/104383560
- STM32CubeMX实战教程——串口通信 :https://blog.csdn.net/weixin_43892323/article/details/105339949
- STM32CubeMX学习笔记 :https://blog.csdn.net/weixin_43892323/article/details/105339949
- 单工、半双工和双工通信:https://blog.csdn.net/iningwei/article/details/100134783
- 各种通信协议: https://blog.csdn.net/qq_21104377/article/details/107058919