打印

GD32F303串口不能产生空闲中断

[复制链接]
4842|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
lesheng002|  楼主 | 2021-6-24 16:39 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
初次使用GD32F303芯片,以为没什么难度呢结果一上来就碰到问题了,串口不能产生空闲中断
看看我的代码是否有错
void NVIC_swtConfiguration(void)
{
    /* USART interrupt configuration */
    nvic_irq_enable(MY_USART_IRQ, 1, 0);

    usart_interrupt_enable(MY_USART, USART_INT_IDLE);
    /* enable USART TBE interrupt */  
    usart_interrupt_enable(MY_USART, USART_INT_RBNE);
}


//        配置通信端口
void        funcSerialConfig(void)
{
//  /* Enable GPIO clock
    rcu_periph_clock_enable(MYRCC_USART_PORT);

    rcu_periph_clock_enable(MYRCC_USART);
    /* connect port to USARTx_Tx */
    gpio_init(MY_USART_PORT, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, MY_USART_TX_PIN);

    /* connect port to USARTx_Rx */
    gpio_init(MY_USART_PORT, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_50MHZ, MY_USART_RX_PIN);

    usart_deinit(MY_USART);
    usart_baudrate_set(MY_USART, 115200);
    usart_receive_config(MY_USART, USART_RECEIVE_ENABLE);
    usart_transmit_config(MY_USART, USART_TRANSMIT_ENABLE);

    NVIC_swtConfiguration();
    usart_enable(MY_USART);

    waitForSend = 1;
    swt_RxCounter = 1;
    usart_direct_send_data((const uint8_t*)"GD32F303VCT6 IDLE INT", 21);
}


中断函数

void UART3_IRQHandler(void)
{
        uint16_t RxChar;
    if((RESET != usart_interrupt_flag_get(MY_USART, USART_INT_FLAG_RBNE)) &&
       (RESET != usart_flag_get(MY_USART, USART_FLAG_RBNE))){
           RxChar = (usart_data_receive(MY_USART) & 0xfF);
        /* receive data */
#if     (ENABEL_DMA_TRANS == 0)
                        swt_recArray[swtRecieved][swt_RxCounter++] = RxChar;
                        if(swt_RxCounter >= EP_PACKET_MAX_SIZE)
            {
                usart_dma_irq_reciev_cb();
            }
#endif
            usart_flag_clear(MY_USART, USART_FLAG_RBNE);
    }
    if((RESET != usart_flag_get(MY_USART, USART_FLAG_IDLE)) &&
       (RESET != usart_interrupt_flag_get(MY_USART, USART_INT_IDLE)))
    {
           RxChar = (usart_data_receive(MY_USART) & 0xfF);
        usart_dma_irq_reciev_cb();
    }
    if((RESET != usart_flag_get(MY_USART, USART_FLAG_TBE)) &&
       (RESET != usart_interrupt_flag_get(MY_USART, USART_INT_TBE)))
    {
        //        usart_interrupt_flag_clear(MY_USART, USART_INT_TBE);
                /* transmit data */
                usart_data_transmit(MY_USART, swt_waitForsendArr[swt_currTxPointer][txPointer++]);
                if(txCounter == txPointer){
                    usart_interrupt_disable(MY_USART, USART_INT_TBE);
                }
                usart_flag_clear(MY_USART, USART_FLAG_TBE);
    }
    if((RESET != usart_flag_get(MY_USART, USART_FLAG_TC)) &&
       (RESET != usart_interrupt_flag_get(MY_USART, USART_INT_TC)))
    {
        usart_interrupt_flag_clear(MY_USART, USART_INT_TC);
        usart_dma_send_finish_cb();
        usart_flag_clear(MY_USART, USART_FLAG_TC);
    }
}


当接收一批数据后,中断函数中红色这部分空闲中断代码不会执行,没找到什么原因。
有哪位大咖能指点一二。非常感谢


使用特权

评论回复
沙发
薛定谔的痞子| | 2021-6-24 20:27 | 只看该作者
读SR、读DR,IDLE已经被清掉了

使用特权

评论回复
板凳
lesheng002|  楼主 | 2021-6-29 08:23 | 只看该作者
薛定谔的痞子 发表于 2021-6-24 20:27
读SR、读DR,IDLE已经被清掉了

那你的意思是,我要先判断空闲中断?然后再看其他中断

使用特权

评论回复
地板
QQ2224043166| | 2021-12-9 18:51 | 只看该作者
空闲中断是在检测到有数据接收后,总线上在一个字节的时间内没有再接收到数据时,从而产生中断。即串口的RXNE位被置位之后才开始检测,检测到空闲之后,串口的CR1寄存器的IDLE位被硬件置1。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

7

主题

93

帖子

0

粉丝