STM32学习笔记——USART串口使用

本文详细介绍了STM32中的USART串口通信模块,包括其特点、配置步骤及中断处理过程。深入分析了USART的工作原理,并通过具体实例演示了如何实现数据的发送与接收。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

USART串口概况

在STM32的参考手册中,串口被描述成通用同步异步收发器(USART),它提供了一种灵活的方法与使用工业标准NRZ异步串行数据格式的外部设备之间进行全双工数据交换。USART利用分数波特率发生器提供宽范围的波特率选择。它支持同步单向通信和半双工单线通信,也支持LIN(局部互联网),智能卡协议和IrDA(红外数据组织)SIR ENDEC规范,以及调制解调器(CTS/RTS)操作。它还允许多处理器通信。还可以使用DMA方式,实现高速数据通信。
常用的帧结构为:1位起始位+8位数据位+1位奇偶校验位(可选)+1位停止位。如下图:
UART串口通信的数据包以帧为单位,常用的帧结构为:1位起始位+8位数据位+1位奇偶校验位(可选)+1位停止位。

USART特点

全双工异步通信;

  1. 分数波特率发生器系统,提供精确的波特率。发送和接受共用的可编程波特率,最高可达4.5Mbits/s
  2. 可编程的数据字长度(8位或者9位); 可配置的停止位(支持1或者2位停止位)
  3. 可配置的使用DMA多缓冲器通信;
  4. 单独的发送器和接收器使能位
  5. 检测标志:① 接受缓冲器 ②发送缓冲器空 ③传输结束标志; 多个带标志的中断源,触发中断;其他:校验控制,四个错误检测标志。

USART配置的一般步骤

  1. 串口时钟使能,GPIO时钟使能:RCC_APB2PeriphClockCmd();
  2. 串口复位:USART_DeInit(); 这一步不是必须的
  3. GPIO端口模式设置:GPIO_Init();
  4. 串口参数初始化:USART_Init();
  5. 开启中断并且初始化NVIC(如果需要开启中断才需要这个步骤:NVIC_Init();USART_ITConfig();
  6. 使能串口:USART_Cmd();
  7. 编写中断处理函数:USARTx_IRQHandler();
  8. 串口数据收发:void USART_SendData();//发送数据到串口,
    uint16_t USART_ReceiveData();//接受数据,从DR读取接受到的数据串口传输状态获取:
 USART_GetFlagStatus(USART_TypeDef* USARTx, uint16_t USART_FLAG);
 void USART_ClearITPendingBit(USART_TypeDef* USARTx, uint16_t USART_IT);

USART的理解

主要使用 USART_SendData() 该函数发送消息到串口,然后使用USART_ReceiveData()来接收发送的消息;而同时调用该函数的时候,会自动跳转到USARTx_IRQHandler() 中,而在相应的串口中断函数中,对传入的消息的字节数进行判断选择,以及挨个输出。

void USART1_IRQHandler(void)                	//串口1中断服务程序
	{
	u8 Res;
	if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)  //接收中断(接收到的数据必须是0x0d 0x0a结尾)
		{
		Res =USART_ReceiveData(USART1);	//读取接收到的数据
		
		if((USART_RX_STA&0x8000)==0)//接收未完成
			{
			if(USART_RX_STA&0x4000)//接收到了0x0d
				{
				if(Res!=0x0a)USART_RX_STA=0;//接收错误,重新开始
				else USART_RX_STA|=0x8000;	//接收完成了 
				}
			else //还没收到0X0D
				{	
				if(Res==0x0d)USART_RX_STA|=0x4000;
				else
					{
					USART_RX_BUF[USART_RX_STA&0X3FFF]=Res ;
					USART_RX_STA++;
					if(USART_RX_STA>(USART_REC_LEN-1))USART_RX_STA=0;//接收数据错误,重新开始接收	  
					}		 
				}
			}   		 
     } 

这里拿正点原子的代码来进行分析
void USART1_IRQHandler(void) 的串口1中断函数中,先是定义了Res这个变量来储存USART_ReceiveData() 接受到的消息。

最重要的过程,就是在这段函数中,还使用了USART_RX_STA(在先前就定义好了的变量,主要用于储存串口接收到的数据形式,16位的数据格式,[0:13]用于储存数据长度,[14]用于标记是否接收到0x4000,[15]用于标记是否接收到0x8000)

同时,串口接收中断服务函数要考虑到了所接收到的数据长度远大于**[0:13]位所能存放的位置,此时直接将USART_RX_STA**的第15位直接标记为1,即表示此次接收完成。

				USART_RX_BUF[USART_RX_STA&0X3FFF]=Res ;
				USART_RX_STA++;							 

正常情况下,通过USART_RX_STA该变量不断++来改变USART_RX_BUF(先前定义用于接收数据的数组);而USART_RX_STA&0X3FFF此段代码的作用是为了判断大小究竟为多少的数组能够完全接收全部的消息,而且该代码是会因为后面这行代码 USART_RX_STA不断叠加,直至超出最大值。
至此,中断函数的分析大概分析得差不多了,至于前面的配置串口GPIO和使能的操作就不累述了。
以及后面的使用Usart串口配合其他的外设的相关操作和调试。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值