其他分享
首页 > 其他分享> > 【面包】STM32学习笔记(二) --- USART 串口通信学习总结

【面包】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.单工、半双工、全双工区别


三、代码实验

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) 参数:

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进行开发,养成边学习边开发记录的一个习惯。

如有不当之处,欢迎指正。


附录|参考

标签:HAL,函数,USART,UART,---,中断,https,串口
来源: https://blog.csdn.net/weixin_45684469/article/details/122408313