中断里调用HAL_Delay()进入死循环的原因 

摘自:http://blog.csdn.net/alwxkxk/article/details/47204677

CUBE生成的程序中, SysTick是中断型延时(利用中断来查询时间到了没)。

/* Use systick as time base source and configure 1ms tick (default clock after Reset is MSI) */

HAL_InitTick(TICK_INT_PRIORITY);

#define  TICK_INT_PRIORITY            ((uint32_t)0x000F)    /*!< tick interrupt priority */

SysTick是内核中断,优先级别默认最低。

(可以用内核函数来修改~   当然,这就要看内核M3的书了,而不是看STM32的参考手册那么简单。暂时就不深入研究,日后更新。)

总结起来就是,就是传说中优先级别默认最低,虽然SysTick一直在跑,但是没进入到中断来读取它的值~

(不知是哪里让我潜意识地认为SysTick级别比外设都高,导致这问题)

如果中断里调用HAL_Delay就会停在那里,因为根本不会进入那个级别更低的中断。

资料补充:

网上还有一种写 法是时间摘取法,是一直读取SysTick产生延时函数~(原子的例程就是用这种方法)

其次,有人提到,中断里面不应该使用延时,中断所占的时间越短越好~有道理~

附上原子的时间摘取法的程序,很有学习价值~

 //////////////////////////////////////////////////////////////////////////////////  

 //本程序只供学习使用,未经作者许可,不得用于其它任何用途

 //Mini STM32开发板

 //使用SysTick的普通计数模式对延迟进行管理

 //包括delay_us,delay_ms

 //正点原子@ALIENTEK

 //技术论坛:www.openedv.com

 //修改日期:2010/5/27

 //版本:V1.2

 //版权所有,盗版必究。

 //Copyright(C) 正点原子 2009-2019

 //All rights reserved

 //********************************************************************************

 //V1.2修改说明

 //修正了中断中调用出现死循环的错误

 //防止延时不准确,采用do while结构!

 //////////////////////////////////////////////////////////////////////////////////  

 static u8  fac_us=;//us延时倍乘数

 static u16 fac_ms=;//ms延时倍乘数

 //初始化延迟函数

 //SYSTICK的时钟固定为HCLK时钟的1/8

 //SYSCLK:系统时钟

 void delay_init(u8 SYSCLK)

 {

 SysTick->CTRL&=0xfffffffb;//bit2清空,选择外部时钟  HCLK/8

 fac_us=SYSCLK/;     

 fac_ms=(u16)fac_us*;

 }     

 //延时nms

 //注意nms的范围

 //SysTick->LOAD为24位寄存器,所以,最大延时为:

 //nms<=0xffffff*8*1000/SYSCLK

 //SYSCLK单位为Hz,nms单位为ms

 //对72M条件下,nms<=1864 

 void delay_ms(u16 nms)

 {        

 u32 temp;    

 SysTick->LOAD=(u32)nms*fac_ms;//时间加载(SysTick->LOAD为24bit)

 SysTick->VAL =0x00;           //清空计数器

 SysTick->CTRL=0x01 ;          //开始倒数  

 do

 {

 temp=SysTick->CTRL;

 }

 while(temp&0x01&&!(temp&(<<)));//等待时间到达   

 SysTick->CTRL=0x00;       //关闭计数器

 SysTick->VAL =0X00;       //清空计数器        

 }   

 //延时nus

 //nus为要延时的us数.         

 void delay_us(u32 nus)

 {

 u32 temp;       

 SysTick->LOAD=nus*fac_us; //时间加载     

 SysTick->VAL=0x00;        //清空计数器

 SysTick->CTRL=0x01 ;      //开始倒数   

 do

 {

 temp=SysTick->CTRL;

 }

 while(temp&0x01&&!(temp&(<<)));//等待时间到达   

 SysTick->CTRL=0x00;       //关闭计数器

 SysTick->VAL =0X00;       //清空计数器  

 }

[HAL]5.中断里调用HAL_Delay()进入死循环的原因的更多相关文章

  1. Entity Framework 6 Recipes 2nd Edition(11-4)译 -> 在”模型定义”函数里调用另一个”模型定义”函数

    11-4.在”模型定义”函数里调用另一个”模型定义”函数 问题 想要用一个”模型定义”函数去实现另一个”模型定义”函数 解决方案 假设我们已有一个公司合伙人关系连同它们的结构模型,如Figure 11 ...

  2. 在ORACLE触发器里调用JAVA程序

    因为项目需要,有一个已经写好的Java程序,想要在Oracle某个表的触发器中调用,以使得每次数据更新时,调用这个JAVA程序,来修改后台某个数据. 现将过程记录如下: 1.编写JAVA程序 publ ...

  3. 在 C++Builder 工程里调用 DLL 函数

    调用 Visual C++ DLL 给 C++Builder 程序员提出了一些独特的挑战.在我们试图解决 Visual C++ 生成的 DLL 之前,回顾一下如何调用一个 C++Builder 创建的 ...

  4. Ruby操作VBA的注意事项和技巧(2):宏里调用和控制窗体以及窗体上的控件、不同workbook之间的宏互相调用

    4.宏里调用并控制窗体以及窗体上的各种控件 1 Sub Criterion_Check() 2 If Workbooks.count = 0 Then '如果当前没有打开的工作薄的话需要发出警告 3 ...

  5. C语言学习_C如何在一个文件里调用另一个源文件中的函数

    问题 C如何在一个文件里调用另一个源文件中的函数,如题. 解决办法 当程序大了代码多了之后,想模块化开发,不同文件中存一点,是很好的解决办法,那我们如何做才能让各个文件中的代码协同工作呢?我们知道,m ...

  6. 在iframe里调用parent.func()引出的js函数运行在它们被定义的作用域里,而不是它们被执行的作用域里

    有个document里定义了一个函数func(),同时在document里嵌入了一个iframe,在这个iframe里调用父窗口的方法:parent.func(),本来我以为这个函数的运行环境是在这个 ...

  7. [转载]C#控制台应用程序里调用自己写的函数的方法

    (2011-08-15 15:52:13) 转载▼ 标签: 转载 分类: 技术类 原文地址:C#控制台应用程序里调用自己写的函数的方法作者:萧儿 最近写程序,遇到了一个很白痴的问题,记录下来,免得下次 ...

  8. AX2009里调用.NET DLL的效率问题

    经常在AX2009里引用.NET的DLL,因为序列化和反序列化,用.NET的定义的实体方便一些,平时数据量不大,也没觉得有什么问题,今天要把几万条数据从数据库中取出来序列化以后,调用第三方系统的接口, ...

  9. RTX——第19章 SVC 中断方式调用用户函数(后期补历程)

    以下内容转载自安富莱电子: http://forum.armfly.com/forum.php 本章节为大家讲解如何采用 SVC 中断方式调用用户函数. 当用户将 RTX 任务设置为工作在非特权级模式 ...

随机推荐

  1. HDU 4292 Food (拆点最大流)

    题意:N个人,F种食物,D种饮料,给定每种食物和饮料的量.每个人有自己喜欢的食物和饮料,如果得到自己喜欢的食物和饮料才能得到满足.求最大满足的人数. 分析:如果只是简单地N个人选择F种食物的话可以用二 ...

  2. 筛选最新生成的报告——sort

    筛选出最新报告发送,返回报告路径 import os def filePath(path): return os.path.join(os.path.abspath(os.path.dirname(o ...

  3. mapreduce 运行-指定各种运行参数

    mapreduce指定参数 mapreduce在运行的时候可以指定各种参数,这样可以根据实际的应用场景做一下相关的调整 1.指定运行时cpu的个数 hadoop jar hadoop-core-0.1 ...

  4. J.U.C之AQS

    AQS是J.U.C的核心 AQS(AbstractQueuedSynchronizer)队列同步器,AQS是JDK下提供的一套用于实现基于FIFO等待队列的阻塞锁和相关的同步器的一个同步框架. 同步器 ...

  5. 通过自动回复机器人学Mybatis:OGNL+log4j.properties

    imooc视频学习笔记 ----> URL:http://www.imooc.com/learn/154 OGNL规则: 从哪里取?(作用域.取值范围,例如封装入一个对象,该对象就是取值范围) ...

  6. Luogu-3648 [APIO2014]序列分割

    Luogu-3648 [APIO2014]序列分割 题目链接 题解: 首先要发现一个重要的性质:分割的顺序是不会影响答案的 证明: 首先对于没有交的两段区间,显然先后顺序改变不会有影响 而对于在同一段 ...

  7. java父类调用被子类重写的方法

    [转][原文]  1.如果父类构造器调用了被子类重写的方法,且通过子类构造函数创建子类对象,调用了这个父类构造器(无论显示还是隐式),就会导致父类在构造时实际上调用的是子类覆盖的方法(你需要了解jav ...

  8. MQ 个人小结

    在PCS项目: talking 发送队列1.1 创建@Beanpublic Queue orderTakingQueue() { return createQueue(orderTakingQueue ...

  9. Search a 2D Matrix,在有序矩阵查找,二分查找的变形; 行有序,列有序查找。

    问题描述:矩阵每一行有序,每一行的最后一个元素小于下一行的第一个元素,查找. 算法分析:这样的矩阵其实就是一个有序序列,可以使用折半查找算法. public class SearchInSortedM ...

  10. 支付宝app支付java后台流程、原理分析(含nei wang chuan tou)

    java版支付宝app支付流程及原理分析 本实例是基于springmvc框架编写     一.流程步骤         1.执行流程           当手机端app(就是你公司开发的app)在支付 ...