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发送/接收使能