问答

汇集网友智慧,解决技术难题

21ic问答首页 - [APM32F030R8][求助]关于USART使能后直接进入空闲中断

空闲中断 APM32F030 直接 国产芯片 单片机 MUC

[APM32F030R8][求助]关于USART使能后直接进入空闲中断

礦ision52024-05-30
板子用的是APM32F030R8 MINI Board给USART配置空闲中断,USART使能后就会进入一次空闲中断。
代码如下:
int main(void)
{
    GPIO_Config_T gpioConfig;
    USART_Config_T usartConfigStruct;

    RCM_EnableAHBPeriphClock(MINI_COM1_RX_GPIO_CLK);

    RCM_EnableAPB2PeriphClock(MINI_COM1_CLK);

//    GPIO_ConfigPinAF(MINI_COM1_TX_GPIO_PORT, MINI_COM1_TX_SOURCE, MINI_COM1_TX_AF);
    GPIO_ConfigPinAF(MINI_COM1_RX_GPIO_PORT, MINI_COM1_RX_SOURCE, MINI_COM1_RX_AF);

    gpioConfig.mode = GPIO_MODE_AF;
//    gpioConfig.pin = MINI_COM1_TX_PIN;
    gpioConfig.speed = GPIO_SPEED_50MHz;
    gpioConfig.outtype = GPIO_OUT_TYPE_PP;
    gpioConfig.pupd = GPIO_PUPD_PU;
//    GPIO_Config(MINI_COM1_TX_GPIO_PORT, &gpioConfig);
    gpioConfig.pin  = MINI_COM1_RX_PIN;
    GPIO_Config(MINI_COM1_RX_GPIO_PORT, &gpioConfig);


    usartConfigStruct.baudRate = 110;
    usartConfigStruct.mode     = USART_MODE_RX;
    usartConfigStruct.hardwareFlowCtrl = USART_FLOW_CTRL_NONE;
    usartConfigStruct.parity   = USART_PARITY_NONE;
    usartConfigStruct.stopBits =  USART_STOP_BIT_1;
    usartConfigStruct.wordLength = USART_WORD_LEN_8B;
    USART_Config(MINI_COM1, &usartConfigStruct);
    NVIC_EnableIRQRequest(MINI_COM1_IRQn, 2);
    USART_Enable(MINI_COM1);
//        Delay(0xfff);
        Delay(0xfffffff);
        USART_EnableInterrupt(MINI_COM1, USART_INT_IDLEIE);

    while (1)
    {
    }
}


CSDN上找到一篇是说USART使能发送功能会发送一个空闲帧,解决方法是使能串口,延迟一会再使能空闲中断。但那篇文章中用的是STM32,而且是自收发。我用APM32禁用USART发送功能再使能后还是会进入空闲中断。原因应该不是CSDN那篇文章里的,但用延迟确实能解决,就是延迟的时间要设置的很大。
CSDN文章链接:
https://blog.csdn.net/weixin_38106263/article/details/129234153?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522171705336916800186593920%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=171705336916800186593920&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduend~default-1-129234153-null-null.142^v100^pc_search_result_base3&utm_term=%E7%A9%BA%E9%97%B2%E4%B8%AD%E6%96%AD%E5%A4%9A%E8%BF%9B%E5%85%A5%E4%B8%80%E6%AC%A1&spm=1018.2226.3001.4187

还有一个问题是不同程序,延迟时间要设的得不一样;同一个程序,波特率设置得不一样,延迟时间也要不一样。
写的串口+DMA缓存收发程序里的代码:
void USART_Init(USART_ConfigType *usartType,USART_Config_T* usartConfig) {
        usartType->gpioInit(&(usartType->gpioType));
        // 启用USART时钟
        usartType->rcmEnableAPB(usartType->usartClock);
       
        // 配置USART
    USART_Config(usartType->usart, usartConfig);

    // 启用USART中断
    NVIC_EnableIRQRequest(usartType->irqChannel, usartType->irqPriority);
        USART_EnableInterrupt(usartType->usart,USART_INT_ERRIE);
    USART_Enable(usartType->usart);

    // 延迟和清除状态标志
    Delay(0xfffff);
    USART_ClearStatusFlag(usartType->usart, USART_INT_IDLEIE);
    USART_EnableInterrupt(usartType->usart, USART_INT_IDLEIE);
       
        if (usartType->enableDMA){
                DMA_Init(usartType);
                USART_EnableDMA(usartType->usart, USART_DMA_REQUEST_RX);
                USART_EnableDMA(usartType->usart, USART_DMA_REQUEST_TX);
        }

}


同样是115200的波特率,这里delay(0xfff)就行了,而同样程序,波特率改为1200后,这里的延时又要改为delay(0xfffff)
我想知道串口使能后进入空闲中断的原因,还有有没有除了延时外其他的方法解决这个问题。
回答 +关注 1
2172人浏览 1人回答问题 分享 举报
1 个回答

您需要登录后才可以回复 登录 | 注册