打印

GD32F103CBT6串口0无法进入中断

[复制链接]
1878|16
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
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 | 只看该作者
把工程文件上传一下

使用特权

评论回复
板凳
lemonboard| | 2024-11-17 23:22 | 只看该作者
这个级别的bug 还是要看自己的代码。

使用特权

评论回复
地板
zyftank|  楼主 | 2024-11-18 05:23 | 只看该作者
lemonboard 发表于 2024-11-17 23:22
这个级别的bug 还是要看自己的代码。

已经解决了,是因为该串口上接了一个RS485,导致不能正常使用。

使用特权

评论回复
5
xionghaoyun| | 2024-11-18 11:10 | 只看该作者
问问题 工程要上传的

使用特权

评论回复
6
两只袜子| | 2024-11-20 11:16 | 只看该作者
可能是外部晶振频率设置错误

使用特权

评论回复
7
elephant00| | 2024-11-20 11:20 | 只看该作者
串口配置参数(如波特率、数据位、停止位、校验位等)设置不正确,或者与发送端不匹配,也可能导致接收中断无法触发。

使用特权

评论回复
8
stormwind123| | 2024-11-20 11:22 | 只看该作者
检查串口线的连接是否牢固可靠,避免松动或接触不良。

使用特权

评论回复
9
jcky001| | 2024-11-20 12:00 | 只看该作者
外部或内部晶振出现频偏,也可能导致波特率频偏,影响串口通信。

使用特权

评论回复
10
两只袜子| | 2024-11-20 14:00 | 只看该作者
检查是不是串口接收线上数据量接收过载

使用特权

评论回复
11
jcky001| | 2024-11-20 14:00 | 只看该作者
串口中断的优先级设置过低?

使用特权

评论回复
12
cr315| | 2024-11-20 16:09 | 只看该作者
硬件连接问题?

使用特权

评论回复
13
laocuo1142| | 2024-11-20 20:26 | 只看该作者
中断使能配置不正确,或者中断服务函数中存在错误

使用特权

评论回复
14
flycamelaaa| | 2024-11-20 21:26 | 只看该作者
使用示波器测量下晶振频率

使用特权

评论回复
15
powerantone| | 2024-11-20 22:09 | 只看该作者
使用中断进行数据接收,并适当提高中断优先级。

使用特权

评论回复
16
probedog| | 2024-11-20 23:00 | 只看该作者
检查中断使能配置和中断服务函数是否存在错误或遗漏。

使用特权

评论回复
17
zyftank|  楼主 | 2024-11-21 09:58 | 只看该作者
统一回复一下,是因为USART0,我另外接了一个RS485芯片,后来把RS485芯片去掉,就可以正常通信了。

使用特权

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

本版积分规则

4

主题

12

帖子

0

粉丝