当前位置:网站首页>Gd32f4xx serial port receive interrupt and idle interrupt configuration

Gd32f4xx serial port receive interrupt and idle interrupt configuration

2022-07-06 22:26:00 fangye945a

Recently debugging GD32F4xx, Want to use the idle interrupt of serial port , Discovery and STM32 Some differences . Make a record here , Memo , Prevent repeated stepping on the pit .
Serial port enable interrupt related code :

nvic_irq_enable(USART0_IRQn,0,1);
usart_interrupt_enable(USART0, USART_INT_RBNE);         /*  Can make USART0 Read area non empty interrupt  */  
usart_interrupt_enable(USART0, USART_INT_IDLE);         /*  Can make USART0 Idle interrupt  */

Serial interrupt processing function :

void USART0_IRQHandler(void)
{
    
    if ((RESET != usart_interrupt_flag_get(USART0, USART_INT_FLAG_RBNE)) &&
        (RESET != usart_flag_get(USART0, USART_FLAG_RBNE))) {
    
        unsigned char value = usart_data_receive(USART0);
        RingBufWrite(g_debugRingBuf, value);		// Write the received data to ringbuf in 
        usart_interrupt_flag_clear(USART0, USART_INT_FLAG_RBNE); // Clear the interrupt flag 

    }
    else if (RESET != usart_interrupt_flag_get(USART0, USART_INT_FLAG_IDLE)) {
    
        usart_interrupt_flag_clear(USART0, USART_INT_FLAG_IDLE);
        usart_data_receive(USART0); /*  Clear the receive completion flag bit  */
        (void)LOS_EventWrite(&g_shellInputEvent, 0x1); // Event notification reception completed 
    }
}

Special attention is paid to : And STM32F4 The difference is , After entering idle interrupt , Need to call usart_data_receive function , Used to clear the receive completion flag bit , Otherwise, the idle interrupt will be triggered many times or not .
stay STM32f4xx in , Clear idle interrupt flag macro is defined as follows :

/** @brief Clears the UART IDLE pending flag. * @param __HANDLE__ specifies the UART Handle. * UART Handle selects the USARTx or UARTy peripheral * (USART,UART availability and x,y values depending on device). * @retval None */
#define __HAL_UART_CLEAR_IDLEFLAG(__HANDLE__) __HAL_UART_CLEAR_PEFLAG(__HANDLE__)

/** @brief Clears the UART PE pending flag. * @param __HANDLE__ specifies the UART Handle. * UART Handle selects the USARTx or UARTy peripheral * (USART,UART availability and x,y values depending on device). * @retval None */
#define __HAL_UART_CLEAR_PEFLAG(__HANDLE__) \ do{
       \ __IO uint32_t tmpreg = 0x00U; \ tmpreg = (__HANDLE__)->Instance->SR; \ tmpreg = (__HANDLE__)->Instance->DR; \ UNUSED(tmpreg); \ } while(0U)

You can see that there are read operation pairs DR Register to read , amount to GD32 Standard library usart_data_receive Function function .

原网站

版权声明
本文为[fangye945a]所创,转载请带上原文链接,感谢
https://yzsam.com/2022/187/202207061429346087.html