打印

GD32F103CBT6串口0无法进入中断

[复制链接]
73|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
zyftank|  楼主 | 2024-11-17 16:47 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
最近做了一个板子,发现GD32F103CBT6,在调试串口的时候,发现USART0使用PA9和PA10的时候,无法进入串口的接收中断,串口是可以正常发信,另外串口1、串口2都是能正常进入接收中断。
/* 配置串口 */
void usart_config(void)
{
    /* 使能IO口时钟 */
    rcu_periph_clock_enable(RCU_GPIOA);
    /* 使能串口时钟 */
    rcu_periph_clock_enable(RCU_USART0);
    /* 初始化TX脚 */
    gpio_init(GPIOA, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_9);
    /* 初始化RX脚 */
    gpio_init(GPIOA, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_50MHZ, GPIO_PIN_10);

    /* 串口参数配置 */
    usart_deinit(USART0);
    usart_baudrate_set(USART0, 115200U);                                                /* 波特率115200 */
    usart_word_length_set(USART0, USART_WL_8BIT);                                /* 8位数据位 */
    usart_stop_bit_set(USART0, USART_STB_1BIT);                                        /* 1位停止位 */
    usart_parity_config(USART0, USART_PM_NONE);                                        /* 无校验位 */
    usart_hardware_flow_rts_config(USART0, USART_RTS_DISABLE);        /* 无硬件流控制 */
    usart_hardware_flow_cts_config(USART0, USART_CTS_DISABLE);        /* 无硬件流控制 */
    usart_receive_config(USART0, USART_RECEIVE_ENABLE);                        /* 使能接收 */
    usart_transmit_config(USART0, USART_TRANSMIT_ENABLE);                /* 使能发送 */
       
                /* 使能串口 */
    usart_enable(USART0);       
                usart_interrupt_enable(USART0, USART_INT_RBNE);       
                //usart_interrupt_enable(USART0, USART_INT_IDLE);
}

void NVIC_Init(void)
{
        nvic_irq_enable(USART0_IRQn, 2, 0);             //开中断,中断优先级
        usart_interrupt_enable(USART0, USART_INT_IDLE); //开启空闲中断
        usart_flag_clear(USART0, USART_FLAG_LBDF);//清除IDLE空闲标志,防止上电即误触发空闲
}

/* 串口中断服务函数 */
void USART0_IRQHandler(void)
{
                if(RESET != usart_interrupt_flag_get(USART0, USART_INT_FLAG_RBNE))
                {
        /* read one byte from the receive data register */
        recv_buffer[recv_count++] = (uint8_t)usart_data_receive(USART0);
                                usart_interrupt_flag_clear(USART0,USART_INT_FLAG_RBNE);
                                usart_interrupt_enable(USART0,USART_INT_RBNE);
                                //此处使能空闲中断,完成接收后可以进入空闲中断
                                usart_interrupt_enable(USART0,USART_INT_IDLE);
        if(recv_count >= RECV_BUFFER_LEN)
        {
            /* disable the USART0 receive interrupt */
            //usart_interrupt_disable(USART0, USART_INT_RBNE);
                                                recv_count = 0;
        }
                                //printf("12\n");
    }   
                if(usart_interrupt_flag_get(USART0, USART_INT_FLAG_IDLE) != RESET)
                {
                                recv_complete_flag = SET;                                                                                        /* 接收完成标志置1 */
                                usart_data_receive(USART0);
                                recv_buffer[recv_count] = '\0';                                                                        /* 接收缓冲末尾赋值‘\0’ */
                                usart_interrupt_flag_clear(USART0,USART_INT_FLAG_IDLE);
                                //空闲中断执行完一次后要关闭空闲中断,不然会一直进入空闲中断
                                usart_interrupt_disable(USART0,USART_INT_IDLE);       
                }
}


使用特权

评论回复
沙发
zyftank|  楼主 | 2024-11-17 18:19 | 只看该作者
把工程文件上传一下

V0.2-GD32-ETA.zip

400.83 KB

使用特权

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

本版积分规则

2

主题

4

帖子

0

粉丝