USART(全双工通用同步/异步串行收发模块)

您所在的位置:网站首页 异步串口包括哪些部件组成 USART(全双工通用同步/异步串行收发模块)

USART(全双工通用同步/异步串行收发模块)

2024-07-17 18:32| 来源: 网络整理| 查看: 265

USART介绍

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

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

在嵌入式领域,它还有一个更口语化的称呼,即“串口”

UART介绍

UART:(Universal Asynchronous Receiver/Transmitter)通用异步收发器

UART是一种异步串行通信协议,它通过起始位、数据位、可选的奇偶校验位和停止位来串行传输数据,不使用外部时钟信号进行数据传输,因此更适合简单的数据传输需求。

区别

USART则在UART的基础上增加了同步传输的功能,它可以通过外部时钟源进行同步传输,也可以在异步模式下工作,支持硬件流控制,如RTS(请求发送)和CTS(清除发送)信号,适用于更复杂的通信场景和高速数据传输。

USART框图

串口相关配置寄存器(详情见参考手册,阅读手册很重要!!!)

硬件电路

电平标准

电平标准是数据1和数据0的表达方式,是传输线缆中人为规定的电压与数据的对应关系,串口常用的电平标准有如下三种:

TTL电平:+3.3V或+5V表示1,0V表示0

RS232电平:-3~-15V表示1,+3~+15V表示0

RS485电平:两线压差+2~+6V表示1,-2~-6V表示0(差分信号)

串口初始化

根据需求开启对应串口,这里举例开启USART1

void USART_InitA(void) { RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE); USART_InitTypeDef USART_InitStruct; /*串口初始化*/ USART_InitStruct.USART_BaudRate = 115200;//波特率 USART_InitStruct.USART_Parity = USART_Parity_No;//校验位 USART_InitStruct.USART_StopBits = USART_StopBits_1;//停止位 USART_InitStruct.USART_WordLength = USART_WordLength_8b;//数据位 USART_InitStruct.USART_Mode = USART_Mode_Tx | USART_Mode_Rx;//串口模式 USART_InitStruct.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//流控制 USART_Init(USART1,&USART_InitStruct); /*使能串口*/ USART_Cmd(USART1,ENABLE); }  串口常用函数 /*串口初始化*/ USART_Init(USART_TypeDef* USARTx, USART_InitTypeDef* USART_InitStruct); /*使能或者失能某个串口*/ USART_Cmd(USART_TypeDef* USARTx, FunctionalState NewState); /*使能或者失能某个串口的中断*/ USART_ITConfig(USART_TypeDef* USARTx, uint16_t USART_IT, FunctionalState NewState); /*串口中断函数*/ USARTx_IRQHandler(void);      /*用于收发的函数*/ /*发送单字节*/ USART_SendData(USART_TypeDef* USARTx, uint16_t Data); /*接收单字节*/ USART_ReceiveData(USART_TypeDef* USARTx);      /*检测标志位和中断标志及清除标志的函数*/ /*检查标志位*/ USART_GetFlagStatus(USART_TypeDef* USARTx, uint16_t USART_FLAG); /*串口工具自发自收*/ void UsartSeToRe(USART_TypeDef* USARTx) { uint16_t Data; if(USART_GetFlagStatus(USARTx,USART_FLAG_RXNE) != RESET) { Data = USART_ReceiveData(USARTx); if(USART_GetFlagStatus(USARTx,USART_FLAG_TXE) != RESET) { USART_SendData(USARTx,Data); } } } /*串口发送函数*/ void UsartSR(USART_TypeDef* USARTx,char* Buff,int Len) { int i = 0; for(i = 0; i < Len;) { if(USART_GetFlagStatus(USARTx,USART_FLAG_TXE) != RESET) { USART_SendData(USARTx,Buff[i]); i++; } } } /* 重定义fputc函数 */ int fputc(int ch, FILE *f) { /* 选择USART1发送 */ while((USART1->SR&0X40)==0);//循环发送,直到发送完毕 USART1->DR = (uint8_t) ch; return ch; } 注意

配置代码,需要注意

1:USART_ITConfig(USARTx,USART_IT_TC,ENABLE);

      USART_ITConfig(USARTx, USART_IT_RXNE, ENABLE); 

如果使用中断一定要将发送/接收中断使能

2:USART_DMACmd(USARTx,USART_DMAReq_Tx,ENABLE);      USART_DMACmd(USARTx,USART_DMAReq_Rx,ENABLE);

如果使用DMA一定要将串口DMA发送/接收使能



【本文地址】


今日新闻


推荐新闻


    CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3