GD32F103CBT6串口0无法进入中断

[复制链接]
4272|17
 楼主| zyftank 发表于 2024-11-17 16:47 | 显示全部楼层 |阅读模式
最近做了一个板子,发现GD32F103CBT6,在调试串口的时候,发现USART0使用PA9和PA10的时候,无法进入串口的接收中断,串口是可以正常发信,另外串口1、串口2都是能正常进入接收中断。
  1. /* 配置串口 */
  2. void usart_config(void)
  3. {
  4.     /* 使能IO口时钟 */
  5.     rcu_periph_clock_enable(RCU_GPIOA);
  6.     /* 使能串口时钟 */
  7.     rcu_periph_clock_enable(RCU_USART0);
  8.     /* 初始化TX脚 */
  9.     gpio_init(GPIOA, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_9);
  10.     /* 初始化RX脚 */
  11.     gpio_init(GPIOA, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_50MHZ, GPIO_PIN_10);

  12.     /* 串口参数配置 */
  13.     usart_deinit(USART0);
  14.     usart_baudrate_set(USART0, 115200U);                                                /* 波特率115200 */
  15.     usart_word_length_set(USART0, USART_WL_8BIT);                                /* 8位数据位 */
  16.     usart_stop_bit_set(USART0, USART_STB_1BIT);                                        /* 1位停止位 */
  17.     usart_parity_config(USART0, USART_PM_NONE);                                        /* 无校验位 */
  18.     usart_hardware_flow_rts_config(USART0, USART_RTS_DISABLE);        /* 无硬件流控制 */
  19.     usart_hardware_flow_cts_config(USART0, USART_CTS_DISABLE);        /* 无硬件流控制 */
  20.     usart_receive_config(USART0, USART_RECEIVE_ENABLE);                        /* 使能接收 */
  21.     usart_transmit_config(USART0, USART_TRANSMIT_ENABLE);                /* 使能发送 */
  22.        
  23.                 /* 使能串口 */
  24.     usart_enable(USART0);       
  25.                 usart_interrupt_enable(USART0, USART_INT_RBNE);       
  26.                 //usart_interrupt_enable(USART0, USART_INT_IDLE);
  27. }

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

  34. /* 串口中断服务函数 */
  35. void USART0_IRQHandler(void)
  36. {
  37.                 if(RESET != usart_interrupt_flag_get(USART0, USART_INT_FLAG_RBNE))
  38.                 {
  39.         /* read one byte from the receive data register */
  40.         recv_buffer[recv_count++] = (uint8_t)usart_data_receive(USART0);
  41.                                 usart_interrupt_flag_clear(USART0,USART_INT_FLAG_RBNE);
  42.                                 usart_interrupt_enable(USART0,USART_INT_RBNE);
  43.                                 //此处使能空闲中断,完成接收后可以进入空闲中断
  44.                                 usart_interrupt_enable(USART0,USART_INT_IDLE);
  45.         if(recv_count >= RECV_BUFFER_LEN)
  46.         {
  47.             /* disable the USART0 receive interrupt */
  48.             //usart_interrupt_disable(USART0, USART_INT_RBNE);
  49.                                                 recv_count = 0;
  50.         }
  51.                                 //printf("12\n");
  52.     }   
  53.                 if(usart_interrupt_flag_get(USART0, USART_INT_FLAG_IDLE) != RESET)
  54.                 {
  55.                                 recv_complete_flag = SET;                                                                                        /* 接收完成标志置1 */
  56.                                 usart_data_receive(USART0);
  57.                                 recv_buffer[recv_count] = '\0';                                                                        /* 接收缓冲末尾赋值‘\0’ */
  58.                                 usart_interrupt_flag_clear(USART0,USART_INT_FLAG_IDLE);
  59.                                 //空闲中断执行完一次后要关闭空闲中断,不然会一直进入空闲中断
  60.                                 usart_interrupt_disable(USART0,USART_INT_IDLE);       
  61.                 }
  62. }


 楼主| 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,导致不能正常使用。
xionghaoyun 发表于 2024-11-18 11:10 | 显示全部楼层
问问题 工程要上传的
两只袜子 发表于 2024-11-20 11:16 | 显示全部楼层
可能是外部晶振频率设置错误
elephant00 发表于 2024-11-20 11:20 | 显示全部楼层
串口配置参数(如波特率、数据位、停止位、校验位等)设置不正确,或者与发送端不匹配,也可能导致接收中断无法触发。
stormwind123 发表于 2024-11-20 11:22 | 显示全部楼层
检查串口线的连接是否牢固可靠,避免松动或接触不良。
jcky001 发表于 2024-11-20 12:00 | 显示全部楼层
外部或内部晶振出现频偏,也可能导致波特率频偏,影响串口通信。
两只袜子 发表于 2024-11-20 14:00 | 显示全部楼层
检查是不是串口接收线上数据量接收过载
jcky001 发表于 2024-11-20 14:00 | 显示全部楼层
串口中断的优先级设置过低?
cr315 发表于 2024-11-20 16:09 | 显示全部楼层
硬件连接问题?
laocuo1142 发表于 2024-11-20 20:26 | 显示全部楼层
中断使能配置不正确,或者中断服务函数中存在错误
flycamelaaa 发表于 2024-11-20 21:26 | 显示全部楼层
使用示波器测量下晶振频率
powerantone 发表于 2024-11-20 22:09 | 显示全部楼层
使用中断进行数据接收,并适当提高中断优先级。
probedog 发表于 2024-11-20 23:00 | 显示全部楼层
检查中断使能配置和中断服务函数是否存在错误或遗漏。
 楼主| zyftank 发表于 2024-11-21 09:58 | 显示全部楼层
统一回复一下,是因为USART0,我另外接了一个RS485芯片,后来把RS485芯片去掉,就可以正常通信了。
等你下课 发表于 2025-1-31 19:22 | 显示全部楼层
发现USART0使用PA9和PA10的时候,无法进入串口的接收中断,串口是可以正常发信,另外串口1、串口2都是能正常进入接收中断。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

9

主题

26

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部