类STM32的MCU很多遇到这个问题,串口是能就立马进入发送完成中断的问题。
能能中断后, 立马清除中断标志,不能解决问题, 代码如下:
[C] 纯文本查看 复制代码 gpio_init_type gpio_init_struct;
gpio_default_para_init(&gpio_init_struct);
/* 复用推挽输出 */
gpio_init_struct.gpio_mode = GPIO_MODE_MUX;
gpio_init_struct.gpio_out_type = GPIO_OUTPUT_PUSH_PULL;
gpio_init_struct.gpio_drive_strength = GPIO_DRIVE_STRENGTH_MODERATE;
gpio_init_struct.gpio_pull = GPIO_PULL_NONE;
/* PB6 PB7 */
gpio_init_struct.gpio_pins = GPIO_PINS_6 | GPIO_PINS_7;
gpio_init(GPIOB, &gpio_init_struct);
/* 配置复用模式 */
gpio_pin_mux_config(GPIOB, GPIO_PINS_SOURCE6, GPIO_MUX_0);
gpio_pin_mux_config(GPIOB, GPIO_PINS_SOURCE7, GPIO_MUX_0);
/* 初始化串口1 */
crm_periph_clock_enable(CRM_USART1_PERIPH_CLOCK, TRUE);
usart_init(USART1, baudrate, USART_DATA_8BITS, USART_STOP_1_BIT);
usart_enable(USART1, TRUE);
usart_receiver_enable(USART1, TRUE);
usart_transmitter_enable(USART1, TRUE);
/* 使能收发中断 */
usart_interrupt_enable(USART1, USART_RDBF_INT, TRUE);
usart_interrupt_enable(USART1, USART_TDC_INT, TRUE);
/* 清除中断标志 */
usart_flag_clear(USART1, USART_RDBF_FLAG);
usart_flag_clear(USART1, USART_TDC_FLAG);
/* 配置发送中断优先级 */
nvic_irq_enable(USART1_IRQn, 15, 0);
经过搜索,总于找到答案, 网上有不少网友也遇到过类似的问题
分析初始化STM32串口后进入发送完成中断的现象-电子工程世界
我使用的是AT32F421, 文档介绍如下
确实,在开启发送器后,将会自动发送1个空闲帧,如果使能后立即清除标志,而空闲帧发送完成又在清除标志之后。那发送完成标志位又将置位。从而使能后,自动进入中断服务函数
以下是修改后的代码:
[C] 纯文本查看 复制代码 gpio_init_type gpio_init_struct;
gpio_default_para_init(&gpio_init_struct);
/* 复用推挽输出 */
gpio_init_struct.gpio_mode = GPIO_MODE_MUX;
gpio_init_struct.gpio_out_type = GPIO_OUTPUT_PUSH_PULL;
gpio_init_struct.gpio_drive_strength = GPIO_DRIVE_STRENGTH_MODERATE;
gpio_init_struct.gpio_pull = GPIO_PULL_NONE;
/* PB6 PB7 */
gpio_init_struct.gpio_pins = GPIO_PINS_6 | GPIO_PINS_7;
gpio_init(GPIOB, &gpio_init_struct);
/* 配置复用模式 */
gpio_pin_mux_config(GPIOB, GPIO_PINS_SOURCE6, GPIO_MUX_0);
gpio_pin_mux_config(GPIOB, GPIO_PINS_SOURCE7, GPIO_MUX_0);
/* 初始化串口1 */
crm_periph_clock_enable(CRM_USART1_PERIPH_CLOCK, TRUE);
usart_init(USART1, baudrate, USART_DATA_8BITS, USART_STOP_1_BIT);
usart_enable(USART1, TRUE);
usart_receiver_enable(USART1, TRUE);
/* 使能发送, 将自动发送一个空闲帧 */
usart_flag_clear(USART1, USART_TDC_FLAG);
usart_transmitter_enable(USART1, TRUE);
uint32_t cnt = 0;
while (usart_flag_get(USART1, USART_TDC_FLAG) == FALSE) {cnt++;}
DEBUG_RTT("cnt:%d\r\n", cnt);
/* 使能收发中断 */
usart_interrupt_enable(USART1, USART_RDBF_INT, TRUE);
usart_interrupt_enable(USART1, USART_TDC_INT, TRUE);
/* 清除中断标志 */
usart_flag_clear(USART1, USART_RDBF_FLAG);
usart_flag_clear(USART1, USART_TDC_FLAG);
/* 配置发送中断优先级 */
nvic_irq_enable(USART1_IRQn, 15, 0);
1.清除发送完成标志;
2.开启发送器;
3.等待发送完成标志位置位;
4.清除发送完成标志.
可以发现, 波特率越低, 等待的时间越长
|