最近做了一个板子,发现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);
- }
- }
-
|