USART:通用同步/异步串行接收/发送器
USART:(Universal Synchronous/Asynchronous Receiver/Transmitter) 通用同步/异步串行接收/发送器
USART是一个全双工通用同步/异步串行收发模块,该接口是一个高度灵活的串行通信设备。
特点:
全双工操作(相互独立的接收数据和发送数据);
2. 同步操作时,可主机时钟同步,也可从机时钟同步;
3. 独立的高精度波特率发生器,不占用定时/计数器;
4. 支持5、6、7、8和9位数据位,1或2位停止位的串行数据桢结构;
5. 由硬件支持的奇偶校验位发生和检验;
6. 数据溢出检测;
7. 帧错误检测;
8. 包括错误起始位的检测噪声滤波器和数字低通滤波器;
9. 三个完全独立的中断,TX发送完成、TX发送数据寄存器空、RX接收完成;
10.支持多机通信模式;
11.支持倍速异步通信模式。
组成:
USART收发模块一般分为三大部分:时钟发生器、数据发送器和接收器。控制寄存器为所有的模块共享。
时钟发生器由同步逻辑电路(在同步从模式下由外部时钟输入驱动)和波特率发生器组成。发送时钟引脚XCK仅用于同步发送模式下,
发送器部分由一个单独的写入缓冲器(发送UDR)、一个串行移位寄存器、校验位发生器和用于处理不同帧结构的控制逻辑电路构成。使用写入缓冲器,实现了连续发送多帧数据无延时的通信。
接收器是USART模块最复杂的部分,最主要的是时钟和数据接收单元。数据接收单元用作异步数据的接收。除了接收单元,接收器还包括校验位校验器、控制逻辑、移位寄存器和两级接收缓冲器(接收UDR)。接收器支持与发送器相同的帧结构,同时支持帧错误、数据溢出和校验错误的检测。
举例:
STM32 USART的使用(基于库函数版本)
步骤说明:
对中断需要用到的的默认的两个管脚PA9和PA10的模式进行设置.
* 注意:不要忘记RCC的设置!STM32的结构决定了用任何一个外设 * 就必须设置相应的使能时钟。USART1的使能时钟位是在APB2中的 * 本例中对应函数UART1_GPIO_Configuration()
* 2: 对USART的数据格式进行设置,即发送数据的数据位、校验位等.
* 本例对应函数为UART1_GPIO_Configuration()
* 注:对于数据是以上升沿还是下降沿有效,可以设置也可以不设 * 置,如果不设置,则系统采用默认值。本例中将其屏蔽。 * 3: 在主函数中调用以上两个函数,然后用库函数USART_SendData()
* 发送数据,用USART_GetFlagStatus(USART1, USART_FLAG_TXE) * 查询中断即可。
程序如下:
#include<stm32f10x_lib.h> void delay(u32 x) //延时函数,u32是库函数中定义好的宏,意为无符号32位整数 { while(x--);} /********************************************************************** * Name : UART1_GPIO_Configuration * Deion : Configures the uart1 GPIO ports. * Input : None * Output : None * Return : None void UART1_GPIO_Configuration(void) //注意:不是库函数,而是自己定义的GPIO初始化函数, { GPIO_InitTypeDef GPIO_InitStructure; //定义GPIO管脚初始化结构体 RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE); //本函数(使能时钟)参数中,RCC_APB2Periph_USART1是必不可少的,有人会问,对于串口用到的PA9和 //PA10不用使能时钟吗?其实由于USART1默认的就是PA9和PA10,所以这一个就行了,当然你要是加上 //这个|RCC_APB2Periph_GPIOA也是不报错的,只是重复了。 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //选中串口默认输出管脚 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//定义输出最大速率 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //定义管脚9的模式 GPIO_Init(GPIOA, &GPIO_InitStructure); //调用函数,把结构体参数输入进行初始化 // Configure USART1_Rx as input floating GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; //同上 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//设置上浮模式 GPIO_Init(GPIOA, &GPIO_InitStructure); //同上 * Name : UART1_Configuration * Deion : Configures the uart1 * Input : None * Output : None * Return : None *******************************************************************************/ void USART_Configuration(void) { USART_InitTypeDef USART_InitStructure; //定义串口初始化结构体 /*USART_ClockInitTypeDef USART_ClockInitStructure;//定义串口模式初始化结构体 USART_ClockInitStructure.USART_Clock = USART_Clock_Enable;// USART_ClockInitStructure.USART_CPOL = USART_CPOL_Low; USART_ClockInitStructure.USART_CPHA = USART_CPHA_2Edge; USART_ClockInitStructure.USART_LastBit = USART_LastBit_Disable; USART_ClockInit(USART1,&USART_ClockInitStructure); */ USART_InitStructure.USART_BaudRate = 9600; //设置串口通信时的波特率9600 USART_InitStructure.USART_WordLength = USART_WordLength_8b;//设置数据位的长度8个位 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); //将以上赋完值的结构体带入库函数USART_Init进行初始化 USART_Cmd(USART1, ENABLE);//开启USART1,注意与上面RCC_APB2PeriphClockCmd()设置的区别 } int main(void) UART1_GPIO_Configuration(); //调用GPIO初始化函数 USART_Configuration(); //调用USART配置函数 while(1) //大循环 { USART_SendData(USART1, 'A'); //发送一位数据 while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET); //判断是否发送完毕 delay(0XFFFFF); //延时
- 点赞
- 收藏
- 关注作者
评论(0)