STM32上电就进IDLE中断解决办法

本文从论坛评论里看到,亲测有效,非常感谢楼主,记录在此,仅供学习,帮助更多遇到此问题的朋友。若有侵权,请及时联系,谢谢。

1、初始化千万不要初始化就打开IDLE中断
2、在串口接收中断中打开IDLE中断
3、正确清楚IDLE中断。

void USART1_Config(void)
{
    GPIO_InitTypeDef GPIO_InitStructure;
    USART_InitTypeDef USART_InitStructure;
    NVIC_InitTypeDef NVIC_InitStruct;

    RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);  //使能GPIOA的时钟
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);//使能USART的时钟
    /* USART1的端口配置 */
    GPIO_PinAFConfig(GPIOA, GPIO_PinSource9, GPIO_AF_1);//配置PA9成第二功能引脚        TX
    GPIO_PinAFConfig(GPIOA, GPIO_PinSource10, GPIO_AF_1);//配置PA10成第二功能引脚  RX

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_10;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
    GPIO_Init(GPIOA, &GPIO_InitStructure);


    /* USART1的基本配置 */
    USART_InitStructure.USART_BaudRate = 115200;              //波特率
    USART_InitStructure.USART_WordLength = USART_WordLength_8b;
    USART_InitStructure.USART_StopBits = USART_StopBits_1;
    USART_InitStructure.USART_Parity = USART_Parity_No;
    USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
    USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;

    /* USART1的NVIC中断配置 */
    NVIC_InitStruct.NVIC_IRQChannel = USART1_IRQn;
    NVIC_InitStruct.NVIC_IRQChannelPriority = 0x02;
    NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStruct);


    USART_Init(USART, &USART_InitStructure);
    USART_ITConfig(USART, USART_IT_RXNE, ENABLE);         //使能接收中断       
//    USART_ITConfig(USART,USART_IT_IDLE,ENABLE);           //初始化的时候千万不要打开IDLE中断    
    USART_Cmd(USART, ENABLE);                             //使能USART1
}

void USART1_IRQHandler(void)
{
    uint8_t Res;
    if(USART_GetITStatus(USART, USART_IT_RXNE) != RESET) {        //接收中断
        if(!(USART->CR1 & USART_CR1_IDLEIE)) {          
            USART_ITConfig(USART,USART_IT_IDLE,ENABLE);//当没有开启IDLE中断的时候再开,不然上电会进去一次
            USART_ClearFlag(USART, USART_FLAG_IDLE);
        }
        Res = USART_ReceiveData(USART);        //读取接收到的数据
    }
    if(USART_GetFlagStatus(USART,USART_FLAG_IDLE) == SET) //空闲中断
    {        
        USART_ClearFlag(USART, USART_FLAG_IDLE);
        USART->RDR;   
        USART_ITConfig(USART,USART_IT_IDLE,DISABLE);//不用的时候关闭串口空闲中断,防止意外进入
        }
    }
 

STM32F429是ST Microelectronics推出的一款高性能微控制器系列,基于ARM Cortex-M4内核设计。这款MCU采用先的技术,如ARM CMSIS(Cortex Microcontroller Software Interface Standard),并支持浮点运算单元(FPU)、单指令多数据流(SIMD)以及数字信号处理器(DSP),使其在处理复杂算法时效率更高。 ### 关于STM32F429不产生IDLE中断IDLE中断是指当系统空闲或无其他任务需要处理时触发的一种中断。对于某些应用而言,如果MCU长时间处于空闲状态而没有接收到外部中断请求,则可能会导致资源浪费,并增加系统功耗。然而,在一些特定的应用场景下,开发者可能希望避免这种IDLE中断的发生。这通常是为了保持系统的持续活动状态,或是为了响应特定的实时事件需求。 为了避免IDLE中断的发生,你可以采取以下策略: 1. **定期更新内部计数器**:例如,可以设置一个定时器,每隔一定时间就更新其值。这样做会保证CPU至少每过一段时间就会执行一次任务,从而避免IDLE状态。 2. **保持总线活动**:通过周期性地访问内存或其他外设来保持总线忙碌。这可以通过循环读取/写入某个地址,或者简单地对存储空间行读写操作来实现。 3. **使用DMA (Direct Memory Access)**:通过配置DMA通道行数据传输,让系统自动完成数据从内存到外设间的传输,无需CPU干预。这种方法不仅可以提高数据传输速率,还能防止系统长时间闲置。 4. **配置定时中断**:在STM32中,可以设置定时中断功能,使得MCU周期性地接收中断信号,即使没有任何外部中断发生也是如此。这可以通过修改中断向量表或者配置相应的GPIO引脚作为通用输入中断来实现。 5. **优化软件结构**:确保程序结构中包含足够的任务轮询机制,即使是简单的延时函数也能让CPU保持活跃状态,减少不必要的空闲时间。 ### 相关问题: 1. 如何在STM32F429上配置定时中断? 2. 详细解释如何利用DMA实现数据传输而不占用CPU资源? 3. 怎样在代码中添加“心跳”功能以避免长时间闲置?
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值