STM32F4串口空闲中断接收

stm32f4串口空闲中断函数配置

stm32f4串口初始化

void uart_init(u32 bound){
 //GPIO端口设置
    GPIO_InitTypeDef GPIO_InitStructure;
	USART_InitTypeDef USART_InitStructure;
	NVIC_InitTypeDef NVIC_InitStructure;
	
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE); //使能GPIOA时钟
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);//使能USART1时钟
 
	//串口1对应引脚复用映射
	GPIO_PinAFConfig(GPIOA,GPIO_PinSource9,GPIO_AF_USART1); //GPIOA9复用为USART1
	GPIO_PinAFConfig(GPIOA,GPIO_PinSource10,GPIO_AF_USART1); //GPIOA10复用为USART1
	
	//USART1端口配置
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_10; //GPIOA9与GPIOA10
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;//复用功能
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;	//速度50MHz
	GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //推挽复用输出
	GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; //上拉
	GPIO_Init(GPIOA,&GPIO_InitStructure); //初始化PA9,PA10

   //USART1 初始化设置
	USART_InitStructure.USART_BaudRate = bound;//波特率设置
	USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字长为8位数据格式
	USART_InitStructure.USART_StopBits = USART_StopBits_1;//一个停止位
	USART_InitStructure.USART_Parity = USART_Parity_No;//无奇偶校验位
	USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//无硬件数据流控制
	USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;	//收发模式
    USART_Init(USART1, &USART_InitStructure); //初始化串口1
	
    USART_Cmd(USART1, ENABLE);  //使能串口1 
	
	//USART_ClearFlag(USART1, USART_FLAG_TC);
	
	USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//开启接收中端

	//Usart1 NVIC 配置
    NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;//串口1中断通道
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3;//抢占优先级3
	NVIC_InitStructure.NVIC_IRQChannelSubPriority =3;		//子优先级3
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;	//IRQ通道使能
	NVIC_Init(&NVIC_InitStructure);	//根据指定的参数初始化VIC寄存器
	
	USART_ITConfig(USART1, USART_IT_IDLE, ENABLE);//开启空闲中断
	
}

串口空闲中断配置

u8 USART_RX_BUF[USART_REC_LEN];     //接收缓存,最大USART_REC_LEN个字节
u32 USART_RX_count=0;                //接收字节计数
u8 flag_IDLE=0;      

void USART1_IRQHandler(void)                	//串口1中断服务程序
{
	if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)  //接收中断
	{
		USART_RX_BUF[USART_RX_count++] =USART_ReceiveData(USART1);//(USART1->DR);	//读取接收到的数据
  } 
	 if(USART_GetITStatus(USART1, USART_IT_IDLE) != RESET)//接收到一条完整数据进入空闲中断
	{
	  USART1->SR;//
		USART1->DR;//清楚空闲中断标志位
		flag_IDLE=1;  //空闲中断标志置位
	}
} 

主函数配置

 u8 make='0';
extern u8 USART_RX_BUF[USART_REC_LEN];     //接收缓存,最大USART_REC_LEN个字节
extern u32 USART_RX_count;                //接收字节计数
extern u8 flag_IDLE;    

int main()
{

    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置系统中断优先级分组2
	delay_init(168);		//延时初始化 
	uart_init(9600);	//串口初始化波特率为115200
	while(1)
	{
		if(flag_IDLE==1)                  //如果进入空闲中断
		{					   
			flag_IDLE=0;                       //空闲中断标志位清零
            make =USART_RX_BUF[0];
            Control_mote(make);		//处理键值	
			USART_RX_count=0;                  //计数值清零
		}
	}
}
  • 5
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
STM32F4 中,串口空闲中断是一种非常有用的机制。当串口接收完一帧数据后,如果接收缓冲区中没有新的数据到达,则会触发空闲中断。这种中断可以有效地解决数据接收时的误码问题,提高数据的可靠性。 下面是一个简单的实现步骤: 1. 初始化串口,并开启空闲中断。可以通过 HAL 库来实现这一步骤。 2. 在空闲中断处理函数中,读取串口接收缓冲区中的数据,并进行处理。 3. 在处理完数据后,重新开启串口接收中断。 代码示例: ```c // 初始化串口 void UART_Init(void) { // 其他初始化代码... // 开启空闲中断 __HAL_UART_ENABLE_IT(&huart1, UART_IT_IDLE); // 其他初始化代码... } // 串口空闲中断处理函数 void HAL_UART_IDLE_IRQHandler(UART_HandleTypeDef *huart) { if (huart->Instance == USART1) { // 读取数据 uint16_t len = huart->RxXferSize - huart->RxXferCount; uint8_t data[len]; memcpy(data, huart->pRxBuffPtr, len); // 处理数据 // ... // 重新开启接收中断 __HAL_UART_CLEAR_IDLEFLAG(huart); HAL_UART_Receive_DMA(huart, huart->pRxBuffPtr, huart->RxXferSize); } } ``` 在上面的代码中,我们使用了 HAL 库来初始化串口并开启空闲中断。在空闲中断处理函数中,我们先读取了接收缓冲区中的数据,并进行了处理。最后,我们通过重新开启接收中断来继续接收数据。注意,这里使用了 DMA 方式来进行数据的接收,以提高接收效率。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

悟道xn

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值