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
|