【面包】STM32学习笔记(二) --- USART 串口通信学习总结

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、代码初始化配置及修改

  1. 完成基本的时钟配置 —> 配置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*/
这个函数不应该被改变,如果需要使用回调函数,请重新在用户文件中实现该函数。

HAL_UART_Receive_IT(中断接收函数)    --->  USART1_IRQHandler(void)(中断服务函数)   --->    HAL_UART_IRQHandler(UART_HandleTypeDef *huart)(中断处理函数)   --->    UART_Receive_IT(UART_HandleTypeDef *huart) (接收函数)   --->    HAL_UART_RxCpltCallback(huart);(中断回调函数)

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值