USART (Universal synchronous/asynchronous receiver transmitter , 通用同步/异步收发器),也称为串行通信口或简称为串口,提供了一种灵活的方法与使用工业标准NRZ(Non Return to Zero ,不归零码)异步串行数据格式的外部设备之间进行全双工数据交换。USART利用波特率发生器提供宽范围的波特率选择。
USART可以简化为通过3个引脚与其他设备相连,3个引脚分别是RXD(Receive Data,接收数据)、TXD(Transmit Data,发送数据)、GND(Ground,地线)。
USART通信数据包含一个起始位、一个数据字(8位或9位,最低有效位在前),以及一个停止位,数据帧格式如图3-44所示。在起始位期间,TXD脚处于低电平;在停止位期间,TXD处于高电平。
RS-232C标准(协议)的全称是EIA-RS-232C标准,定义是“数据终端设备(DTE)和数据通讯设备(DCE)之间串行二进制数据交换接口技术标准”。
它是在1970年由美国电子工业协会(EIA)联合贝尔系统、调制解调器厂家及计算机终端生产厂家共同制定的用于串行通讯的标准。
其中EIA(Electronic Industry Association)代表美国电子工业协会,RS(Recommended standard)代表推荐标准,232是标识号,C代表RS232的最新一次修改。
实验3-7 printf 函数输出到USART1(标准库)
本实验演示如何将C标准库的printf函数重定向到USART1,从而实现使用USART1在超级终端上或串口助手软件中输出printf的消息。使用串口输出调试信息就是这样做的。
1.硬件设计
USART可以简化为通过3个引脚与其他设备相连,3个引脚分别是RXD(Receive Data,接收数据)、TXD(Transmit Data,发送数据)、GND(Ground,地线)。
2.软件设计(编程)
使用STM32的V3.5.0版标准库的关键程序段如下
使能GPIOA的时钟,原因是USART1的数据发送线(引脚)和接收线(引脚)是PA9和PA10的复用功能;使能AFIO的时钟;使能USART1的时钟。
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
配置PA9为复用功能推挽输出(GPIO_Mode_AF_PP)模式,配置PA10为浮空输入(GPIO_Mode_IN_FLOATING)模式。
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;//PA9为复用功能推拉输出模式
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//PA10为浮空输入模式
GPIO_Init(GPIOA, &GPIO_InitStructure);
使用库函数USART_Init初始化USART1来配置USART1的工作参数。
USART_InitStructure.USART_BaudRate = 115200; //波特率115200bps
USART_InitStructure.USART_WordLength = USART_WordLength_8b; //8个数据位,就是10位帧格式
USART_InitStructure.USART_StopBits = USART_StopBits_1; //1个停止位
USART_InitStructure.USART_Parity = USART_Parity_No; //没有奇偶校验位
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; //不使用硬件流控
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; //全双工通信
USART_Init(USART1, &USART_InitStructure); //初始化USART1
使能USART1。
USART_Cmd(USART1, ENABLE); //使能USART1
使用USART1发送数据。
printf("\n\rUSART Printf Example: retarget the C library printf function to the USART\n\r");
//使用超级终端或者串口助手显示USART1输出的信息
特别注意:由于C语言printf是输出到显示器,这里需要输出重定向输出到USART1。
#include "stdio.h"
ifdef GNUC
/* With GCC/RAISONANCE, small printf (option LD Linker->Libraries->Small printf
set to 'Yes') calls __io_putchar() */
#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
else
#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
endif /* GNUC */
PUTCHAR_PROTOTYPE //输出重定向函数
{
USART_SendData(USART1, (u8) ch); //发送数据函数(使用USART1)
while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET) ; //直到发送完毕
{
}
return ch;
}
另外在MDK工程配置目标选项中,需要勾选使用“Use MicroLIB”(微库),如图3-46所示。
实验现象
硬件实验的串口驱动安装
实验3-8 Proteus仿真STM32:printf 函数输出到USART1(标准库)
本实验使用Proteus对STM32F103R6进行仿真,演示如何将C标准库的printf函数重定向到USART1,实现使用USART1在仿真虚拟终端上中输出printf的输出信息。
实验3-9 printf 函数输出到USART1(HAL库)
实验过程参考3.2.6小节,确保RCC和时钟配置与此小节描述一致。USART1配置如图3-50所示。