USART:通用同步/异步串行接收/发送器

举报
惘纬 发表于 2020/07/29 08:02:59 2020/07/29
【摘要】 USART:(Universal Synchronous/Asynchronous Receiver/Transmitter) 通用同步/异步串行接收/发送器USART是一个全双工通用同步/异步串行收发模块,该接口是一个高度灵活的串行通信设备。特点:全双工操作(相互独立的接收数据和发送数据); 2. 同步操作时,可主机时钟同步,也可从机时钟同步; 3. 独立的高精...

USART:(Universal Synchronous/Asynchronous Receiver/Transmitter) 通用同步/异步串行接收/发送器

USART是一个全双工通用同步/异步串行收发模块,该接口是一个高度灵活的串行通信设备。


特点:

    1. 全双工操作(相互独立的接收数据和发送数据);

        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); //延时


【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

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

全部回复

上滑加载中

设置昵称

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

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

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