STM32Cube串口USART发送接收数据

举报
糖果罐子 发表于 2023/10/31 20:38:01 2023/10/31
【摘要】 >本文代码使用 `HAL` 库。@[TOC](文章目录)# 前言这篇文章介绍 实现 ***USART*** `异步模式`下 通过 串口助手 发送,接收 数据---# 一、USART 同步/异步串行接收/发送器***USART***(Universal Synchronous Asynchronous Receiver Transmitter)是一种通用的串行通信接口,它可以用来 发送 和 接...

>本文代码使用 `HAL` 库。

@[TOC](文章目录)


# 前言
这篇文章介绍 实现 ***USART*** `异步模式`下 通过 串口助手 发送,接收 数据

---



# 一、USART 同步/异步串行接收/发送器
***USART***(Universal Synchronous Asynchronous Receiver Transmitter)是一种通用的串行通信接口,它可以用来 发送 和 接收 数据。

***USART*** 可以用来 连接两个设备 ,以实现数据传输。它可以用来连接计算机、打印机、终端机、网络设备等。

***USART*** 可以使用 同步 或 异步 方式传输数据。
- 在 同步 模式下,发送和接收的数据都是 同步 的,即发送和接收的数据都是以相同的速率传输的。在绝大多数场合下`发送端和接收端采用的都是同一个时钟`。
- 而在 异步 模式下,发送和接收的数据是异步的,即发送和接收的数据可以以不同的速率传输。`发送端和接收端可以有各自独立的时钟来控制数据的发送和接收,这两个时钟各自独立,互不同步`。

# 二、USART 原理图
任何 ***USART*** 双向 通信至少需要 两个 脚:接收数据输入(RX) 和 发送数据输出(TX) 。
- RX:接收数据串行输。通过过采样技术来区别数据和噪音,从而恢复数据。
- TX:发送数据输出。当发送器被禁止时,输出引脚恢复到它的I/O端口配置。

从下图可以看到 ***USART*** 的发送引脚为==PA9 USART1_TX==, 接收引脚为 ==PA10 USART1_RX==。![在这里插入图片描述](https://img-blog.csdnimg.cn/8bba67586fd049dabda87f3c102e164f.png)
# 三、CubeMX 创建工程
1. 选择芯片。
![在这里插入图片描述](https://img-blog.csdnimg.cn/44ca98078abd4118b775259f1943fba8.png)
2. 选择 Debug 模式
![在这里插入图片描述](https://img-blog.csdnimg.cn/fdf6919adfc043628cc0ebabcc4539a8.png)
3. 选择外部时钟
![在这里插入图片描述](https://img-blog.csdnimg.cn/c4fa5177cc7e43aaafddaef32cdd70e2.png)
4. 配置系统时钟,在 红框中输入 72 ,然后点击 回车 两次,即可配置好
![在这里插入图片描述](https://img-blog.csdnimg.cn/3ccc45c0e4384d44a9cba6edbbcdec20.png)
5. 设置 io 端口
![在这里插入图片描述](https://img-blog.csdnimg.cn/ccb09c2f852f4fcf964ad0a9a0b7769e.png)
6. 设置为 异步通信。
![在这里插入图片描述](https://img-blog.csdnimg.cn/ec8696285adb424aac2a08d6d86705fd.png)
7. 可 重新设置名字
![在这里插入图片描述](https://img-blog.csdnimg.cn/15b3f60a120f4dc38dfc9f80a3696bac.png)
8. 设置工程模式和版本
![在这里插入图片描述](https://img-blog.csdnimg.cn/785a8ab7a3cb413fbc2b17829c37f377.png)
9. 选取加入.c /.h文件(便于编写代码)
 ![在这里插入图片描述](https://img-blog.csdnimg.cn/dc21ece5e0ac4bb7952bada051a87469.png)
10. 创建工程
![在这里插入图片描述](https://img-blog.csdnimg.cn/7ecbb65f07524c1cab273b620e2349af.png)
然后 打开工程,可以看到我们的 **usart.c , usart.h**
![在这里插入图片描述](https://img-blog.csdnimg.cn/3e051e4bdc31431d98d5242a16f17204.png)

# 四、usart.c 文件解析
1. 使用 ***UART_HandleTypeDef*** 结构体 定义变量具象 *USART* 对象。*huart1* 在 *usart.h* 中被定义。
 ![在这里插入图片描述](https://img-blog.csdnimg.cn/9acfc0bdaea1434fb9d674197492b744.png)
 2. 使用 ***MX_USART1_UART_Init*** 设置 *USART1* 的参数(波特率,数据位长度,奇偶校验位等)
 使用 ***HAL_UART_Init()*** 初始化结构体变量,完成对该 *USART* 外设的初始化。
![在这里插入图片描述](https://img-blog.csdnimg.cn/f040148b12a047388b70ece86e0f7027.png)
2. 在 ***HAL_UART_MspInit( )*** 函数中完成对 时钟 的 使能 和 GPIO/DMA 等的配置。
![在这里插入图片描述](https://img-blog.csdnimg.cn/861ca64167a249039620766087bce48c.png)
3. 关闭使能。
![在这里插入图片描述](https://img-blog.csdnimg.cn/e15da6bf48174002b46698853244f728.png)
# 五,设计实验:
### 在 串口输入字符点亮led
- 在 串口 输入 ' **A** ',则 led **点亮**。
- 在 串口 输入 ' **a** ',则 led **熄灭**。

1. 串口发送函数
```c
HAL_UART_Transmit ( UART_HandleTypeDef * huart , uint8_t * pData , uint16_t Size , uint32_t Timeout );
```
2. 串口接收函数
```c
HAL_UART_Receive_IT (UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size);
```
3. printf 重定向:

```c
int fputc(int str, FILE *f)     /* printf 打印 */
{
while(HAL_UART_Transmit(&huart1, (uint8_t *)&str, 1, 300) != HAL_OK);
return 0;
}
int fgetc( FILE *f)       /* scanf 输入 */
{
char c = 0;
while(HAL_UART_Receive(&huart1, (uint8_t *)&c, 1, 300) != HAL_OK);
return c;
}
```
4. 控制 *led* 亮灭。
对于 *led*  的代码以及工程文件,可以参考我之前的文章,详细的介绍了 *led* :
[STM32f103 CubeMX封装 led程序](https://blog.csdn.net/wuyiyu_/article/details/129108738)

```c
uint8_t buff[128]={0};  /* 接收数据数组 */
buff[0] = getchar();   /* 获取字符 */
 
  switch(buff[0])
  {
   case 'A':
  {
  Blue_ON();    /* led 点亮 */
  printf("led is on !\r\n");
  }
  break;
  case 'a':
  {
  Blue_OFF();   /* led 熄灭 */
  printf("led is off !\r\n");
  }
  break;
 }
```



### 实验现象:
实验现象 我放在了 B占,有兴趣的可以看看:

[STM32 串口USART 发送数据控制led亮灭](https://www.bilibili.com/video/BV1vY4y127c4/?vd_source=986c364d205fa1124b337bc665f57c4f)


---

# 总结
下一篇文章 讲 ***USART 串口 中断***。

【版权声明】本文为华为云社区用户原创内容,未经允许不得转载,如需转载请自行联系原作者进行授权。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。