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

这篇具有很好参考价值的文章主要介绍了关于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_delay死机,stm32,单片机,嵌入式硬件

 

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

另本文只用于记录自己学习只用,不保证正确,如有错误,欢迎指正。文章来源地址https://www.toymoban.com/news/detail-562629.html

到了这里,关于关于STM32使用HAL_Delay(),程序卡死,的解决办法。的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • STM32:HAL_RCC_OscConfig中程序卡死问题解决办法

    首先,参考该博主的文章(感谢博主的刨根问底),了解卡死的原理:https://blog.csdn.net/qq153471503/article/details/114700884 在了解原理后,发现在IAP跳转后,APP卡死是因为不能再次对PLL进行初始化操作,所以导致了卡死现象。 经过思考,HAL库所有模块的Init,都会有对应的DeInit,所

    2024年02月09日
    浏览(110)
  • STM32踩坑:UCOSIII下串口中断服务中使用OSIntEnter函数使程序卡死解决方案

    本文侧重于 STM32 标准库,HAL 库可以借鉴,因为该项目是基于标准库做的(因为涉及到保密问题,这里我就不张贴源码进行描述了)。 因项目需求,需要使用RTOS实时操作系统来完成单片机程序的应用开发,今天在串口模块开发完成后自测,功能实现没有问题,问题出在串口在

    2024年02月08日
    浏览(35)
  • 【STM32笔记】HAL库UART串口配置及重定向(解决接收中断与scanf不能同时工作、重定向卡死、低功耗一直唤醒的问题)

    【STM32】HAL库UART串口配置及重定向(解决接收中断与scanf不能同时工作、重定向卡死、低功耗一直唤醒的问题) 注意:这里用的编译器版本为ARMCC(也就是第5代编译器 而不是AC6) 首先 要使用printf和scanf 必不可少的就是 这里需要做的就是配置单片机的UART 并且使其能够被pri

    2023年04月08日
    浏览(48)
  • 【STM32】关于LWIP高频率快速发送大量数据(1MB以上)卡死问题解决 + 提高LWIP发送速率的办法

    STM32型号:STM32F47VGTx 初始LWIP版本:1.4.1 PHY: ksz8051 最近遇到了个问题,从sd卡读数据存储到一个1024大小的数组,每次读200个字节,while循环读取,每次读取完成后立即通过lwip的conn_write接口通过tcp方式发送出去。但是会出现发送速率只有9kb/s的情况,而且高频率快速发送大量数

    2024年02月04日
    浏览(41)
  • 关于STM32 Hal 库函数编写的程序 在编译时报错 :“Error: L6218E: Undefined symbol 函数名 (referred from xx.o)” 的解决办法

    一开始以为是没有包含头文件,将头文件包含后,再次进行编译仍然不能解决。并且在进行源文件跳转时出现下面的问题: 去源文件进行查看,确实存在该函数,但是就是不能跳转回去,检查函数名拼写后无果。所以尝试另外的解决办法。 参考https://blog.csdn.net/zhizuwei/articl

    2024年02月14日
    浏览(53)
  • STM32L0 ADC使用HAL库关于校准问题的说明

    最近是有一个产品用到了ADC,使用的是STM32L051 芯片,使用 STM32CubeMX 生成的代码,本来以为简简单单,但是在调用 HAL ADC校准函数的时候遇到一个问题有点疑问,度娘一下也没有找到解答,还是经过翻阅了一些资料才得到答案,特此来记录一下。 我是矜辰所致,全网同名,尽

    2024年02月02日
    浏览(52)
  • 关于STM32使用HAL_UART_Receive()无法接收数据的问题

    一、问题发现         在项目中我想通过阻塞的方式接收一段来自串口的数据,于是使用了HAL_UART_Receive函数,但跑起来发现一直超时接收不到。网上使劲搜但没搜到啥有用的结果,那只能自己捣鼓了。一开始怀疑是硬件的问题,于是用示波器直接连到对应的rx脚上,发现数据

    2024年02月11日
    浏览(50)
  • STM32使用HAL库,串口收发一段时间后出错问题及解决

    当STM32使用HAL库进行开发时,偶尔会遇到串口收发数据量大时,会出现问题。比如同时串口同时收发,一段时间后就只能发送,接收不工作。或是只接收,但数据量大时也不工作。下面对这些问题和其解决办法进行整理。 当数据量过大且传输频率快时,串口可能会因为溢出,

    2024年02月16日
    浏览(41)
  • 嵌入式STM32程序一些卡死的原因

    嵌入式STM32程序卡死的原因可能有以下几种: 1、死循环:程序中存在死循环,导致程序无法继续执行下去。 2、中断问题:中断处理不当,导致程序无法正常运行。 3、堆栈溢出:程序中使用的堆栈空间超出了预设的范围,导致程序无法正常运行。 4、资源竞争:多个任务或中

    2024年02月08日
    浏览(59)
  • 关于STM32 hal printf重定向 “FILE“ is undefined

    关于STM32 hal printf重定向,及报错。“FILE” is undefined 增加以下内容:

    2024年02月13日
    浏览(44)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包