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

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表示10V表示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发送/接收使能

  • 5
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值