GD32E230G8U6TR串口接收超时中断、帧中断配置使用笔记

项目场景:

MCU-GD32E230G8U6TR:

最近项目需求需要使用GD32E230G8U6TR这款MCU开发MODBUS通信,modbus开发需要使用帧中断功能,而网上GD32关于这一块的内容资料不是很多,兆易官网也没找到合适的例程,没办法只能自己照着手册折腾了好久。


解决方案:

提示 根据用户手册的介绍来看,串口中断功能中自带接收超时中断功能,使用过程先调用usart_receiver_timeout_threshold_config(USARTX,timerout)函数设置超时时间阈值,这里timeout参数是按传输的位来计算,例如填入10则表示在10个BIT的时间内没有新数据过来就触发超时。usart_receiver_timeout_enable(USARTX)函数使能串口接收超时功能
usart_interrupt_enable(USART0, USART_INT_RT)函数使能接收超时中断

@Override
	
    /* USART configure */																
    usart_deinit(USARTX);																																				
    usart_baudrate_set(USARTX,BAUDRATE);										
    usart_transmit_config(USARTX, USART_TRANSMIT_ENABLE);//使能发送
		
    usart_receive_config(USARTX, USART_RECEIVE_ENABLE);//使能接收
		usart_receiver_timeout_threshold_config(USARTX,1000);//设置串口接收超时阈值,这个100是指100bit时间,如果按照10bit传输一个字节,那么就是10个字节时间
		usart_receiver_timeout_enable(USARTX);									
		usart_enable(USARTX);																		
		nvic_irq_enable(USART0_IRQn, 0);												
    usart_interrupt_enable(USART0, USART_INT_RBNE); //使能读取数据缓冲区不空中断和溢出错误中断
		usart_interrupt_enable(USART0, USART_INT_RT);//使能串口接收超时中断					
	}

在串口中断回调函数中,判断中断标志并进行处理,串口超时中断触发一次后调用usart_flag_clear(USART0,USART_FLAG_RT);函数清楚中断标志

/*!
    \brief      串口0中断处理函数
    \param[in]  none
    \param[out] none
    \retval     none
*/
void USART0_IRQHandler(void)
{
    if(RESET != usart_interrupt_flag_get(USART0, USART_INT_FLAG_RBNE)){ //读取数据缓冲区不为空标志
        /* receive data */
        //receiver_buffer[rxcount++] = usart_data_receive(USART0);
				receiver_buffer[rxcount] = usart_data_receive(USART0);
        if(rxcount == receivesize){
            usart_interrupt_disable(USART0, USART_INT_RBNE);
        }
    }

    if((RESET != usart_interrupt_flag_get(USART0, USART_INT_FLAG_TBE))){	//发送缓冲区为空标志
        /* transmit data */
        usart_data_transmit(USART0, transmitter_buffer[txcount++]);
        if(txcount == transfersize){
            usart_interrupt_disable(USART0, USART_INT_TBE);
        }
    }
		
		if(RESET != usart_interrupt_flag_get(USART0,USART_INT_FLAG_RT)){	//接收中断超时标志
			LED_TOGGLE();
			usart_flag_clear(USART0,USART_FLAG_RT);
		}
}
  • 5
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
USART_UX_IRQHandler() 是一个中断处理程序,通常用于处理微控制器中 USART 模块的中断事件。下面是一个简单的应用实例,展示了如何使用 USART_UX_IRQHandler() 中断处理程序来实现串口通信。 假设我们正在使用 STM32F4xx 微控制器,并且想要通过串口与计算机进行通信。我们可以使用 USART3 模块作为串口,使用 DMA2 缓冲区来实现数据的传输。 在代码中,我们需要使用以下函数来初始化 USART3 和 DMA2: ``` void USART3_Init(void) { // Enable USART3 clock RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE); // Configure USART3 pins GPIO_InitTypeDef GPIO_InitStruct; GPIO_InitStruct.GPIO_Pin = GPIO_Pin_10 | GPIO_Pin_11; GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF; GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStruct.GPIO_OType = GPIO_OType_PP; GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_UP; GPIO_Init(GPIOB, &GPIO_InitStruct); GPIO_PinAFConfig(GPIOB, GPIO_PinSource10, GPIO_AF_USART3); GPIO_PinAFConfig(GPIOB, GPIO_PinSource11, GPIO_AF_USART3); // Configure USART3 USART_InitTypeDef USART_InitStruct; USART_InitStruct.USART_BaudRate = 115200; USART_InitStruct.USART_WordLength = USART_WordLength_8b; USART_InitStruct.USART_StopBits = USART_StopBits_1; USART_InitStruct.USART_Parity = USART_Parity_No; USART_InitStruct.USART_HardwareFlowControl = USART_HardwareFlowControl_None; USART_InitStruct.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; USART_Init(USART3, &USART_InitStruct); // Enable USART3 USART_Cmd(USART3, ENABLE); } void DMA2_Init(void) { // Enable DMA2 clock RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA2, ENABLE); // Configure DMA2 DMA_InitTypeDef DMA_InitStruct; DMA_InitStruct.DMA_Channel = DMA_Channel_4; DMA_InitStruct.DMA_PeripheralBaseAddr = (uint32_t)&USART3->DR; DMA_InitStruct.DMA_Memory0BaseAddr = (uint32_t)dmaBuffer; DMA_InitStruct.DMA_DIR = DMA_DIR_PeripheralToMemory; DMA_InitStruct.DMA_BufferSize = DMA_BUFFER_SIZE; DMA_InitStruct.DMA_PeripheralInc = DMA_PeripheralInc_Disable; DMA_InitStruct.DMA_MemoryInc = DMA_MemoryInc_Enable; DMA_InitStruct.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte; DMA_InitStruct.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte; DMA_InitStruct.DMA_Mode = DMA_Mode_Circular; DMA_InitStruct.DMA_Priority = DMA_Priority_High; DMA_InitStruct.DMA_FIFOMode = DMA_FIFOMode_Disable; DMA_InitStruct.DMA_FIFOThreshold = DMA_FIFOThreshold_HalfFull; DMA_InitStruct.DMA_MemoryBurst = DMA_MemoryBurst_Single; DMA_InitStruct.DMA_PeripheralBurst = DMA_PeripheralBurst_Single; DMA_Init(DMA2_Stream1, &DMA_InitStruct); // Enable DMA2 Stream1 DMA_Cmd(DMA2_Stream1, ENABLE); // Enable DMA2 Stream1 transfer complete interrupt DMA_ITConfig(DMA2_Stream1, DMA_IT_TC, ENABLE); } ``` 在 main() 函数中,我们需要启用 USART3 和 DMA2,并在初始化完成后启用全局中断: ``` int main(void) { USART3_Init(); DMA2_Init(); // Enable global interrupts NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4); NVIC_InitTypeDef NVIC_InitStruct; NVIC_InitStruct.NVIC_IRQChannel = DMA2_Stream1_IRQn; NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 0; NVIC_InitStruct.NVIC_IRQChannelSubPriority = 0; NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStruct); while (1) { // Do some other stuff here } } ``` 最后,我们需要实现 USART_UX_IRQHandler() 中断处理程序,以便在 USART3 接收到数据时进行处理: ``` void USART3_IRQHandler(void) { if (USART_GetITStatus(USART3, USART_IT_RXNE) != RESET) { char data = USART_ReceiveData(USART3); // Do something with received data USART_ClearITPendingBit(USART3, USART_IT_RXNE); } } void DMA2_Stream1_IRQHandler(void) { if (DMA_GetITStatus(DMA2_Stream1, DMA_IT_TCIF1) != RESET) { // Do something with received data in DMA buffer DMA_ClearITPendingBit(DMA2_Stream1, DMA_IT_TCIF1); } } ``` 在 USART_UX_IRQHandler() 中断处理程序中,我们首先检查 USART3 是否接收到数据,如果有则读取数据并进行处理。在 DMA2_Stream1_IRQHandler() 中断处理程序中,我们检查 DMA2 是否已经传输完毕,如果是则处理 DMA 缓冲区中的数据。 这样,我们就可以使用 USART_UX_IRQHandler() 中断处理程序来实现串口通信。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值