stm32定时器优先级

发布时间:2024-02-27  

什么是优先级

  优先级是具有高抢占式优先级的中断可以在具有低抢占式优先级的中断处理过程中被响应,即中断嵌套,或者说高抢占式优先级的中断可以嵌套低抢占式优先级的中断。


  当两个中断源的抢占式优先级相同时,这两个中断将没有嵌套关系,当一个中断到来后,如果正在处理另一个中断,这个后到来的中断就要等到前一个中断处理完之后才能被处理。如果这两个中断同时到达,则中断控制器根据他们的响应优先级高低来决定先处理哪一个;如果他们的抢占式优先级和响应优先级都相等,则根据他们在中断表中的排位顺序决定先处理哪一个。


stm32定时器优先级

  STM32 可以支持的 68 个外部中断通道,已经固定的分配给相应的外部设备。每个中断通道都具备自己的中断优先级控制字节 PRI_n(8 位,但在 STM32 中只使用 4 位,高 4 位有效),每 4 个通道的 8 位中断优先级控制字(PRI_n)构成一个 32 位的优先级寄存器(PriorityRegister)。68 个通道的优先级控制字至少构成 17 个 32 位的优先级寄存器,它们是 NVIC寄存器中的一个重要部分。

  对于这 4bit 的中断优先级控制位还必须分成 2 组看:从高位开始,前面是定义抢先式优先级的位,后面用于定义子优先级。4bit 的分组组合可以有以下几种形式:

  第0组:所有4位用于指定响应优先级

  第1组:最高1位用于指定抢占式优先级,最低3位用于指定响应优先级

  第2组:最高2位用于指定抢占式优先级,最低2位用于指定响应优先级

  第3组:最高3位用于指定抢占式优先级,最低1位用于指定响应优先级

  第4组:所有4位用于指定抢占式优先级

如何设置stm32定时器的优先级

  由于我们使用STM32的库函数,所以这里介绍如何使用库函数设置需要的优先级

  可以通过调用STM32的固件库中的函数NVIC_PriorityGroupConfig()选择使用哪种优先级分组方式

  这个函数在帮助文件的标准外设驱动的CMSISCMSIS_Expord_Function下;

  这个函数的参 数有下列5种:

  NVIC_PriorityGroup_0 =》 选择第0组

  NVIC_PriorityGroup_1 =》 选择第1组

  NVIC_PriorityGroup_2 =》 选择第2组

  NVIC_PriorityGroup_3 =》 选择第3组

  NVIC_PriorityGroup_4 =》 选择第4组

  这里要注意的是 ,在系统复位初始化之后,默认使用的是第0组优先级分组

  接下来就是指定中断源的优先级,下面以一个简单的例子说明如何指定中断源的抢占式优先级和响应优先级:

  如果应用程序储存在ROM中,并且不需要改变异常服务程序,则我们可以把整个向量表编码到ROM的起始区域(从0 地址开始的那段)。在这种情况下,向量表的偏移量将一直为0, 并且中断向量一直在ROM中,因此上例可以大大简化,只需3 步:

  1. 建立优先级组

  2. 为该中断指定优先级

  3. 使能该中断

  // 选择使用优先级分组第1组

  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);

  // 使能EXTI0中断 初始化采用和GPIO一样的结构体形参

  NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQChannel;

  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; // 指定抢占式优先级别1

  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; // 指定响应优先级别0

  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;

  NVIC_Init(&NVIC_InitStructure);

  // 使能EXTI9_5中断

  NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQChannel;//这里指的是外部中断9-5线

  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; // 指定抢占式优先级别0

  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; // 指定响应优先级别1

  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;

  NVIC_Init(&NVIC_InitStructure);

  要注意的几点是:

  1)如果指定的抢占式优先级别或响应优先级别超出了选定的优先级分组所限定的范围,将可能得到意想不到的结果;这里的范围是指第4组抢占式优先级0~15, 第二组抢占式优先级范围0~3,响应优先级0~3;剩下几组同理

  2)抢占式优先级别相同的中断源之间没有嵌套关系;

  3)如果某个中断源被指定为某个抢占式优先级别,又没有其它中断源处于同一个抢占式优先级别,则可以为这个中断源指定任意有效的响应优先级别。也就是说抢占式优先级高的一定可以中断中断优先级低的

  开关总中断:

  在STM32/Cortex-M3中是通过改变CPU的当前优先级来允许或禁止中断。

  PRIMASK位:只允许NMI和hard fault异常,其他中断/异常都被屏蔽(当前CPU优先级=0)。

  FAULTMASK位:只允许NMI,其他所有中断/异常都被屏蔽(当前CPU优先级=-1)。

  在STM32固件库中(stm32f10x_nvic.c和stm32f10x_nvic.h) 定义了四个函数操作PRIMASK位和FAULTMASK位,改变CPU的当前优先级,从而达到控制所有中断的目的。

  新库中下面两个函数等效于关闭总中断:

  void__disable_irq (void);

  void __disable_fault_irq (void);

  下面两个函数等效于开放总中断:

  void __enable_irq (void);

  void __enable_fault_irq (void);

  上面两组函数要成对使用,不能交叉使用。

  例如:

  第一种方法:

  PRIMASK 用于除能在NMI 和硬fault 之外的所有异常,它有效地把当前优先级改为0(可编程优先级中的最高优先级)。

  void__disable_irq (void);//关闭总中断

  void __enable_irq (void);//开放总中断

  __set_PRIMASK(1);

  __set_PRIMASK(0);

  第二种方法:

  FAULTMASK 更绝,它把当前优先级改为‐ 1 。这么一来,连硬fault 都被掩蔽了。使用方案与PRIMASK 的相似。但要注意的是,FAULTMASK 会在异常退出时自动清零。

  void __disable_fault_irq (void); //关闭总中断

  void __enable_fault_irq (void);//开放总中断

  __set_FAULTMASK(1);

  __set_FAULTMASK(0);

  常常使用

  void__disable_irq (void);//关闭总中断

  void __enable_irq (void);//开放总中断

  库函数中提到的PreemptionPriority含义是抢占式优先级,subPriority含义是响应优先级,也叫亚优先级。何为抢占式优先级?

  顾名思义,是指在抢占式优先级不同时,抢占式优先级高的可以中断抢占式优先级低的,也就是所谓的嵌套!相同的抢占式优先级之间是不可以中断嵌套的。打个比方,如果系统采用的是第4组优先级分组方式,就意味着所有的4位都被用来指定抢占式优先级,也就是说,这样一来抢占式优先级就有16个等级,通过你对需要的中断源进行中断优先级赋值,就可以实现你所希望的高优先级中断函数在低优先级中断函数未执行完之前就开始执行,即中断嵌套,该分组方式最多可以完成1个中断和15级嵌套。


文章来源于:电子工程世界    原文链接
本站所有转载文章系出于传递更多信息之目的,且明确注明来源,不希望被转载的媒体或个人可与我们联系,我们将立即进行删除处理。

相关文章

    (16个内部+68个外部),还有16级可编程的中断优先级的设置,仅使用中断优先级设置8bit中的高4位。 STM32可支持68个中断通道,已经固定分配给相应的外部设备,每个中断通道都具备自己的中断优先级......
    使用Cortex_M3全部的中断源,那么STM32也没有256级的中断优先级编程范围。STM32的各个中断源的中断优先级设置寄存器也并没有8位全部使用,而是只使用了高4位。详情如下图所示:↓ ※ 注:对于......
    = EXTI2_IRQChannel; //选择中断通道2 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; //抢占中断优先级设置为1......
    中断优先级的设置STM32目前支持的中断共84个(16个内部+68个外部),还有16级可编程的中断优先级的设置,仅使用中断优先级设置8Bit中的高4位。   STM32可支持68个中断通道,已经......
    ,240个外部中断和可编程的256级中断优先级的设置STM32目前支持的中断共84个(16个内部+68个外部),还有16级可编程的中断优先级的设置,仅使用中断优先级设置8bit中的高4位......
    ,仅使用中断优先级设置8bit中的高4位。 STM32可支持68个中断通道,已经固定分配给相应的外部设备,每个中断通道都具备自己的中断优先级控制字节PRI_n(8位,但是STM32中只使用4位......
    ,仅使用中断优先级设置8bit中的高4位。 STM32可支持68个中断通道,已经固定分配给相应的外部设备,每个中断通道都具备自己的中断优先级控制字节PRI_n(8位,但是STM32中只使用4位,高4......
    考虑以下几个方面:1.中断嵌套和优先级STM32支持中断嵌套和优先级设置中断嵌套是指当一个中断正在处理时,如果有更高优先级的中断发生,CPU会暂停当前中断的处理,去处理新的中断中断优先级设置可以灵活控制中断......
    STM32中断设置以及中断优先级设置三步曲;  中断作为stm32中必不可少的一个功能,其重要性是不言而喻的因此把中断学习好是根本。   所以今天就来好好啃一下中断配置的知识,俗话说:磨刀......
    STM32中断优先级谁更高 主要根据两个方面来判断;一:综述 STM32 目前支持的中断共为 84 个(16 个内核+68 个外部), 16 级可编程中断优先级设置(仅使用中断优先级设置......

我们与500+贴片厂合作,完美满足客户的定制需求。为品牌提供定制化的推广方案、专属产品特色页,多渠道推广,SEM/SEO精准营销以及与公众号的联合推广...详细>>

利用葫芦芯平台的卓越技术服务和新产品推广能力,原厂代理能轻松打入消费物联网(IOT)、信息与通信(ICT)、汽车及新能源汽车、工业自动化及工业物联网、装备及功率电子...详细>>

充分利用其强大的电子元器件采购流量,创新性地为这些物料提供了一个全新的窗口。我们的高效数字营销技术,不仅可以助你轻松识别与连接到需求方,更能够极大地提高“闲置物料”的处理能力,通过葫芦芯平台...详细>>

我们的目标很明确:构建一个全方位的半导体产业生态系统。成为一家全球领先的半导体互联网生态公司。目前,我们已成功打造了智能汽车、智能家居、大健康医疗、机器人和材料等五大生态领域。更为重要的是...详细>>

我们深知加工与定制类服务商的价值和重要性,因此,我们倾力为您提供最顶尖的营销资源。在我们的平台上,您可以直接接触到100万的研发工程师和采购工程师,以及10万的活跃客户群体...详细>>

凭借我们强大的专业流量和尖端的互联网数字营销技术,我们承诺为原厂提供免费的产品资料推广服务。无论是最新的资讯、技术动态还是创新产品,都可以通过我们的平台迅速传达给目标客户...详细>>

我们不止于将线索转化为潜在客户。葫芦芯平台致力于形成业务闭环,从引流、宣传到最终销售,全程跟进,确保每一个potential lead都得到妥善处理,从而大幅提高转化率。不仅如此...详细>>