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