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

 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、避免使用死循环等待外设结束,应使用超时机制,这样当外设出问题时可以避免代码跑飞,影响其他任务执行。

----原创文章来自CSDN--凌乱的小老弟,如文章对您有帮助欢迎点赞+关注,如有错误之处,也欢迎各位大佬评论参与讨论指正,共同进步!

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

凌乱的小老弟

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值