关于STM32使用HAL_Delay(),程序卡死,的解决办法。

在使用STM32的Hal库开发时,存在在中断中使用Hal_Delay()时程序会卡死的问题,这是由于Hal_Delay()是使用定时器实现的,并且它的定时器中断优先级为15是最低的。需要给它重新设置中断优先级,实际操作方式如下:

HAL_NVIC_SetPriority(SysTick_IRQn,0,0);

这会把Hal_Delay()的优先级提到最高,同时要查看另一个中断优先级,如果其优先级也一样,那么需要把它的优先级调低,例如:

 HAL_NVIC_SetPriority(EXTI2_IRQn, 	0, 0);

 要把它的优先级调低,否则任然无法从Hal_Delay()中跳出来,修改如下:

 HAL_NVIC_SetPriority(EXTI2_IRQn, 	1, 0);

这会把外部中断的优先级调低。

中断函数的各个参数的作用如下:

 HAL_NVIC_SetPriority(EXTI2_IRQn, 	1, 0);

 HAL_NVIC_SetPriority(); :设置或初始化中断;

EXTI2_IRQn:使用外部中断2,PA2,PB2,PC2,PD2等引脚都是通过接入这里来实现中断,所以在定义多个外部中断时要注意,不可以定义相同的GPIO_Pinx,因为它们硬件上接入的是同一个外部中断,所以定义多个中断时,要像这样定义,例如:GPIOA_Pin1,GPIOA_2,GPIOB_Pin3这样,而不能定义成:GPIOA_Pin1,GPIOB_Pin1这样,因为它们映射的是同一个外部中断。

 HAL_NVIC_SetPriority(EXTI2_IRQn,     1, 0)中的1为抢占优先级,抢占的意思是不管是否有中断在执行,只要其抢占优先级比正在触发的中断的中断优先级高,那么它被触发的时候就会打断当前的中断去执行它,执行完毕之后,再返回来执行还没执行完的中断,故抢占式一般用于中断嵌套;

具体,如下图所示:

 

HAL_NVIC_SetPriority(EXTI2_IRQn,     1, 0)中的0(第三个参数)为响应优先级,它的意思是如果有一个抢占优先级比它高的中断正在执行,另一个抢占优先级与它一样的中断正在等待执行,那么它的响应优先级就可以决定它是不是可以插队执行,如果抢占优先级与它一样的中断正在等待执行,但是响应优先级比它低,那么它可以插队(优先执行),否者不能插队;

另本文只用于记录自己学习只用,不保证正确,如有错误,欢迎指正。

  • 6
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值