STM32串口不定长接收空闲中断

发布于:2024-06-14 ⋅ 阅读:(93) ⋅ 点赞:(0)

1. 开启串口空闲中断

最近接触到的 Modbus RTU 项目使用到了串口接收中断和空闲中断。记录一下

初始化可以直接套用正点原子的初始化,只需要添加一行即可

  USART_ITConfig(USART1, USART_IT_IDLE, ENABLE);//开启串口空闲中断
}

2. 合理开关中断

FreeRTOS是不能一直串口空闲中断之中的。

我们可以使用这种中断方式来处理:在接收完数据后,开启串口空闲中断;随后在接收完毕后,会触发空闲中断,将数据全部打印出来,此时CPU会归还给任务调度器并使其恢复任务调度。

函数是修改的正点原子的,现在不需要在尾部加入 “\r\n” 也能照常使用。

void USART1_IRQHandler(void)                	//串口1中断服务程序
{
	u8 Res;
	if(USART_GetITStatus(USART1, USART_IT_IDLE) != RESET)  //空闲中断
	{
		printf("%s\n",USART_RX_STA);
		
		USART_ITConfig(USART1, USART_IT_IDLE, DISABLE);//关闭串口空闲中断
	}

	if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)  //接收中断
	{
		Res =USART_ReceiveData(USART1);	//读取接收到的数据
		USART_RX_BUF[USART_RX_STA]=Res ;
		USART_RX_STA++;
		if(USART_RX_STA>(USART_REC_LEN-1))
			USART_RX_STA=0;//接收数据错误,重新开始接收
    	USART_ITConfig(USART1, USART_IT_IDLE, ENABLE);//开启串口空闲中断
    } 
} 

3. 串口发送函数

还写了一个发送函数,以后调试不愁printf函数只能一个串口用了。

void STMLOG(USART_TypeDef* USARTx, u8 *Data)
{
	while(*Data!='\0')
	{ 
		 while(USART_GetFlagStatus(USARTx,USART_FLAG_TC)==RESET); 
		 	USART_SendData(USARTx,*Data);
		 Data++;
	}
}

网站公告

今日签到

点亮在社区的每一天
去签到

热门文章