一、通用同步异步收发器 (USART)
1.USART 简介
??通用同步异步收发器 (USART) 能够灵活地与外部设备进行全双工数据交换,满足外部设备对工业标准 NRZ 异步串行数据格式的要求。USART 通过小数波特率发生器提供了多种波特率。 ??它支持同步单向通信 和半双工单线通信 ,还支持LIN(局域互连网络) 、智能卡协议与 IrDA(红外线数据协会)SIR ENDEC 规范 ,以及调制解调器操作 (CTS/RTS) 。而且,它还支持多处理器通信 。 ??通过配置多个缓冲区使用DMA 可实现高速数据通信。
2.USART 功能说明
??接口通过三个引脚从外部连接到其它设备。任何USART 双向通信 均需要至少两个引脚:接收数据输入引脚 (RX) 和发送数据引脚输出 (TX) :
??RX :接收数据输入引脚就是串行数据输入引脚。过采样技术可区分有效输入数据和噪声,从而用于恢复数据。
??TX :发送数据输出引脚。如果关闭发送器,该输出引脚模式由其 I/O 端口配置决定。如果使能了发送器但没有待发送的数据,则TX 引脚处于高电平。在单线和智能卡模式下,该 I/O用于发送和接收数据(USART 电平下,随后在SW_RX上接收数据)。
正常USART 模式下,通过这些引脚以帧的形式发送和接收串行数据:
- 发送或接收前保持空闲线路
- 起始位
- 数据(字长 8 位或 9 位),最低有效位在前
- 用于指示帧传输已完成的 0.5 个、1 个、1.5 个、2 个停止位
- 该接口使用小数波特率发生器 - 带 12 位尾数和 4 位小数
- 状态寄存器 (
USART_SR ) - 数据寄存器 (
USART_DR ) - 波特率寄存器 (
USART_BRR ) - 12 位尾数和 4 位小数 - 智能卡模式下的保护时间寄存器 (
USART_GTPR )
在同步模式 下连接时需要以下引脚:
- SCLK: 发送器时钟输出。该引脚用于输出发送器数据时钟,以便按照 SPI 主模式进行同步发送(起始位和结束位上无时钟脉冲,可通过软件向最后一个数据位发送时钟脉冲)。
RX 上可同步接收并行数据。这一点可用于控制带移位寄存器的外设(如 LCD 驱动器)。时钟相位和极性可通过软件编程。在智能卡模式下,SCLK 可向智能卡提供时钟。 - nCTS: “清除以发送”用于在当前传输结束时阻止数据发送(高电平时)
- nRTS:“请求以发送”用于指示 USART 已准备好接收数据(低电平时)
3.USART框图
二、基于HAL库实现串口通信
1.工程创建
(1)新建工程 选择New Project 选择芯片型号,并创建工程
(2)设置RCC
- 设置高速外部时钟HSE 选择外部时钟源
(3)设置串口
- 1.点击USATR1
- 2.设置MODE为异步通信(Asynchronous) 。
- 3.基础参数:波特率为115200 Bits/s。传输数据长度为8 Bit,无校验位,1位停止位 ,接收和发送都使能。
- 4.GPIO引脚设置
USART1_RX /USART_TX 。 - 5.
NVIC Settings 一栏使能接收中断
(4)项目文件设置
- 1 设置项目名称
- 2 设置存储路径
- 3 选择所用IDE
(5)创建工程文件 然后点击GENERATE CODE 创建工程,完成创建。
2. HAL库UART函数库介绍
UART结构体定义
UART_HandleTypeDef huart1;
UART的名称定义,这个结构体中存放了UART所有用到的功能,后面的别名就是我们所用的uart串口的别名,默认为huart1,可以自行修改。 串口发送/接受函数
- HAL_UART_Transmit();串口发送数据,使用超时管理机制
- HAL_UART_Receive();串口接收数据,使用超时管理机制
- HAL_UART_Transmit_IT();串口中断模式发送
- HAL_UART_Receive_IT();串口中断模式接收
- HAL_UART_Transmit_DMA();串口DMA模式发送
- HAL_UART_Transmit_DMA();串口DMA模式接收
串口发送数据:
HAL_UART_Transmit(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout)
功能:串口发送指定长度的数据。如果超时没发送完成,则不再发送,返回超时标志(HAL_TIMEOUT)。
参数:
- UART_HandleTypeDef *huart UATR的别名 如 : UART_HandleTypeDef huart1; 别名就是huart1 。
- *pData 需要发送的数据
- Size 发送的字节数
- Timeout 最大发送时间,发送数据超过该时间退出发送
举例:
HAL_UART_Transmit(&huart1, (uint8_t *)ZZX, 3, 0xffff);
3.USART接收与发送
- 在 stm32f4xx_hal.c中包含
#include <stdio.h>
#include "stm32f4xx_hal.h"
#include <stdio.h>
extern UART_HandleTypeDef huart1;
- 在stm32f4xx_hal.c 中重写
fget 和fput 函数
int fputc(int ch, FILE *f)
{
HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xffff);
return ch;
}
int fgetc(FILE *f)
{
uint8_t ch = 0;
HAL_UART_Receive(&huart1, &ch, 1, 0xffff);
return ch;
}
重写后便可以使用printf() 函数和Scanf() ,getchar() 函数
int main(void)
{
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_USART1_UART_Init();
while (1)
{
printf(" Hello Windows \r\n");
HAL_Delay(1000);
}
}
三、总结
??本文通过STM32CubeMX 创建串口例程,并使用HAL 库UATR 函数库,重定义printf 函数,实现STM32系统给上位机(win10)连续发送“Hello Windows!”
四、参考
【STM32】HAL库 STM32CubeMX教程四—UART串口通信详解
【嵌入式09】STM32串口通信协议
基于 MDK 创建 STM32 汇编程序:串口输出 Hello world
|