打印
[STM32F4]

STM32F4跑飞,定时器和ADC冲突导致跑飞及问题解决办法

[复制链接]
366|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
tpgf|  楼主 | 2024-3-19 17:23 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
STM32跑飞大多数情况是变量的溢出(数组、指针等),此处的溢出情况是 STM32的外设没有完成初始化(初始化过程被打断)就持续调用外设导致溢出。

现象:单独ADC或者单独定时器初始化(开启1ms进一次中断)都能正常工作,ADC和定时器都初始化后无法进入while循环;

代码如下:

int main(void)
{
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置系统中断优先级分组2
       
        uart1_Init(115200);        //串口初始化波特率为115200
        delay_init();                //延时初始化
        LED_Init();                                  //初始化与LED连接的硬件接口
        TIM4_Int_Init();       
        //delay_ms(100);
        ADC_VBet_Init();//电池电量测量
        while(1)
        {
               
                LED_NET=!LED_NET;
                LED_TRG=!LED_TRG;
                LED_MSG=!LED_MSG;
                Get_VBet();
                delay_ms(100);
        }
}

解决方法:

方法1、在定时器初始化之后延时1ms以上(我的定时器中断设置的1ms一次,此处延时要大于定时器中断时间)

方法2、ADC初始化放在定时器初始化之前
方法3、定时器中断优先级设置为0或1或2

修改后代码:

int main(void)
{
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置系统中断优先级分组2
        ADC_VBet_Init();//电池电量测量
        uart1_Init(115200);        //串口初始化波特率为115200
        delay_init();                //延时初始化
        LED_Init();                                  //初始化与LED连接的硬件接口
        TIM4_Int_Init();       
        //delay_ms(100);
        while(1)
        {
               
                LED_NET=!LED_NET;
                LED_TRG=!LED_TRG;
                LED_MSG=!LED_MSG;
                Get_VBet();
                delay_ms(100);
        }
}

问题原因:定时器初始化完成后,在ADC初始化过程中,定时器中断来临打断了ADC的初始化。使ADC没有初始化完成,无法正常工作,且使用死循环等待ADC采集结束导致代码跑飞

经过测试,定时器中断优先级为0-2时正常,优先级3-15时打断了ADC的初始化导致ADC无法正常工作。

总结:
1、有中断的初始化尽量放在后面,没有中断的初始化靠前。
2、避免使用死循环等待外设结束,应使用超时机制,这样当外设出问题时可以避免代码跑飞,影响其他任务执行。
————————————————

                            版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

原文链接:https://blog.csdn.net/zuoxi4621/article/details/136236344

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1923

主题

15596

帖子

11

粉丝