STM32 USART中断

本文介绍STM32F103系列微控制器的串口配置过程,包括管脚初始化、USART参数设置、中断配置及数据收发处理。通过实例展示了如何实现115200波特率下的串口通信。

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

以STM32F103系列为例:

管脚初始化:

	RX-----浮空输入
	TX------复用推挽输出

USART初始化

  USART_InitStructure.USART_BaudRate = 115200;//波特率115200
  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_Tx|USART_Mode_Rx;//发送和接收模式
  USART_Init(USART1,&USART_InitStructure);
  USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);  //使能USART中断
  /*使能USART1*/
  USART_Cmd(USART1,ENABLE);
  USART_ClearFlag(USART1, USART_FLAG_TC);     /* 清发送外城标志,Transmission Complete flag */

中断优先级初始化

  NVIC_InitTypeDef NVIC_InitStructure;
  /* Configure the NVIC Preemption Priority Bits */  
  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);
  /* Enable the USART1 Interrupt */
  NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;//优先级
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;  //抢占优先级
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStructure);

串口中断模版


typedef struct{
	uint8_t rcvlen;//接受数据长度
	uint8_t rcvflag;//接受到数据标志位
	uint8_t rcvbuff[USARTLEN];//接受数据缓存区
}USART1RCV;


typedef struct{
	uint8_t sendcnt;
	uint8_t sendlen;
	uint8_t sendbuff[USARTLEN];
}USART1SEND;


void USART1_IRQHandler(void)
{
//使用操作系统时使用
#if OS_CRITICAL_METHOD == 3u
  OS_CPU_SR  cpu_sr = 0u;
#endif

  /*********************使用Ucosii时使用*******************/
  //告诉uCOS-II正在进行中断处理,在发送信号量时不进行任务调度  
  OS_ENTER_CRITICAL();   //保存全局中断标志,关总中断
  OSIntNesting++;
  OS_EXIT_CRITICAL();	   //恢复全局中断标志	
 /*******************************************************/
  //接收中断
	if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
	{
		USART_ClearFlag(USART1,USART_FLAG_RXNE);
		USART_ClearITPendingBit(USART1,USART_IT_RXNE);
		
		rec_data = USART_ReceiveData(USART1);//接受数据
		usart1rcv.rcvlen++;                  //接受数据长度加一
		usart1rcv.rcvflag=1;//接受到数据
		runrecive[0]=0;//不执行时间点轮训中的串口接受数据处理
		usart1rcv.rcvbuff[(usart1rcv.rcvlen-1)]=rec_data;//保存数据
	}
	
	
	/*串口发送*/
	if(USART_GetITStatus(USART1, USART_IT_TXE) != RESET)
	{
		USART_ClearITPendingBit(USART1,USART_IT_TXE);//清除发送中断标志位
		USART_SendData(USART1, usart1send.sendbuff[usart1send.sendcnt++]);
		if(sendcnt == usart1send.sendlen)
		{
			/* 关闭发送空中断,开启发送完成中断 */
			USART_ITConfig(USART1, USART_IT_TXE, DISABLE);
			USART_ITConfig(USART1, USART_IT_TC, ENABLE);
		}    
	}
		//发送完成中断,最后一字节发送
	else if(USART_GetITStatus(USART1, USART_IT_TC) != RESET)
		USART_ITConfig(USART1,USART_IT_TC,DISABLE);
	
	OSIntExit();//使用UCOS-II时使用
}

接受数据处理:
接受到数据后若50ms后没有接受到数据,则数据接受完成
使用时间点轮训法

uint8_t   runrecive[2]={0,50};
if(runrecive[0]>=runrecive[1])
{
	runrecive[0]=0;//USART中断中清零,中断时不进入
	if(usart1rcv.rcvflag==1)
	{	
		RcvData_Handle();//自写中断数据处理函数
		Usart_Data_Clean();//串口接受结构体数据清空
	}
}

发送数据处理:

usart1send.sendlen=x;//x为要发送的数据长度,自定义
usart1send.sendtcnt=0;//清空已发送次数
usart1send.sendbuff[N]=data;//发送数据缓存赋值
USART_ITConfig(USART1,USART_IT_TXE,ENABLE); //使能串口1发送 
STM32 UART(通用异步收发器)的中断接收功能是通过USART控制器提供的中断机制来实现的。当你需要在数据接收完成后执行特定操作时,可以配置USART寄存器以触发RXNE(接收数据就绪)中断。以下是基本步骤: 1. 首先,你需要在STM32的系统初始化阶段开启USART的接收功能,并设置适当的波特率、数据位数、停止位和校验位。 2. 接下来,在STM32中断管理器里,启用USART接收中断,并为其分配一个优先级。通常使用`NVIC_InitStructure`结构体来配置中断。 ```c NVIC_InitTypeDef NVIC_InitStructure; // ...其他配置... NVIC_InitStructure.NVIC_IRQChannel = USARTx_IRQn; // x替换为实际的USART通道,如USART1、USART2等 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; // 设置抢占级别 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; // 设置子优先级 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; // 开启中断 NVIC_Init(&NVIC_InitStructure); ``` 3. 定义中断服务函数(ISER),比如`USART1_IRQHandler()`,在这个函数内检查是否接收到新数据,然后处理数据。 4. 在中断服务函数中,检查USART标志寄存器的`USART_FLAG_RXNE`位,如果为1,则表示有新的数据接收完成。清除这个标志并执行相应的数据处理逻辑。 ```c if (USART_GetFlagStatus(USARTx, USART_FLAG_RXNE)) { uint8_t receivedData = USART_ReceiveData(USARTx); // 读取接收到的数据 // ...处理接收到的数据... USART_ClearITPendingBit(USARTx, USART_IT_RXNE); // 清除RXNE标志 } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值