STM32Cube串口USART发送接收数据

本文代码使用 HAL 库。

文章目录

  • 前言
  • 一、USART 同步/异步串行接收/发送器
  • 二、USART 原理图
  • 三、CubeMX 创建工程
  • 四、usart.c 文件解析
  • 五,设计实验:
      • 在 串口输入字符点亮led
      • 实验现象:
  • 总结

前言

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


一、USART 同步/异步串行接收/发送器

USART(Universal Synchronous Asynchronous Receiver Transmitter)是一种通用的串行通信接口,它可以用来 发送 和 接收 数据。

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

USART 可以使用 同步 或 异步 方式传输数据。

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

二、USART 原理图

任何 USART 双向 通信至少需要 两个 脚:接收数据输入(RX) 和 发送数据输出(TX) 。

  • RX:接收数据串行输。通过过采样技术来区别数据和噪音,从而恢复数据。
  • TX:发送数据输出。当发送器被禁止时,输出引脚恢复到它的I/O端口配置。

从下图可以看到 USART 的发送引脚为PA9 USART1_TX, 接收引脚为 PA10 USART1_RXSTM32Cube串口USART发送接收数据_第1张图片

三、CubeMX 创建工程

  1. 选择芯片。
    STM32Cube串口USART发送接收数据_第2张图片
  2. 选择 Debug 模式
    STM32Cube串口USART发送接收数据_第3张图片
  3. 选择外部时钟
    STM32Cube串口USART发送接收数据_第4张图片
  4. 配置系统时钟,在 红框中输入 72 ,然后点击 回车 两次,即可配置好
    STM32Cube串口USART发送接收数据_第5张图片
  5. 设置 io 端口
    STM32Cube串口USART发送接收数据_第6张图片
  6. 设置为 异步通信。
    STM32Cube串口USART发送接收数据_第7张图片
  7. 可 重新设置名字
    STM32Cube串口USART发送接收数据_第8张图片
  8. 设置工程模式和版本
    STM32Cube串口USART发送接收数据_第9张图片
  9. 选取加入.c /.h文件(便于编写代码)
    STM32Cube串口USART发送接收数据_第10张图片
  10. 创建工程
    STM32Cube串口USART发送接收数据_第11张图片
    然后 打开工程,可以看到我们的 usart.c , usart.h
    STM32Cube串口USART发送接收数据_第12张图片

四、usart.c 文件解析

  1. 使用 UART_HandleTypeDef 结构体 定义变量具象 USART 对象。huart1usart.h 中被定义。
    在这里插入图片描述
  2. 使用 MX_USART1_UART_Init 设置 USART1 的参数(波特率,数据位长度,奇偶校验位等)
    使用 HAL_UART_Init() 初始化结构体变量,完成对该 USART 外设的初始化。
    STM32Cube串口USART发送接收数据_第13张图片
  3. HAL_UART_MspInit( ) 函数中完成对 时钟 的 使能 和 GPIO/DMA 等的配置。
    STM32Cube串口USART发送接收数据_第14张图片
  4. 关闭使能。
    STM32Cube串口USART发送接收数据_第15张图片

五,设计实验:

在 串口输入字符点亮led

  • 在 串口 输入 ’ A ',则 led 点亮
  • 在 串口 输入 ’ a ',则 led 熄灭
  1. 串口发送函数
HAL_UART_Transmit ( UART_HandleTypeDef * huart , uint8_t * pData , uint16_t Size , uint32_t Timeout );
  1. 串口接收函数
HAL_UART_Receive_IT (UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size);
  1. printf 重定向:
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;
}
  1. 控制 led 亮灭。
    对于 led 的代码以及工程文件,可以参考我之前的文章,详细的介绍了 led
    STM32f103 CubeMX封装 led程序
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亮灭


总结

下一篇文章 讲 USART 串口 中断

你可能感兴趣的:(stm32f103,封装最强入门教学,stm32,单片机,嵌入式硬件)