最近使用STM32时希望将systick的中断优先级降低,但是CMSIS里给出的例子都是类似

    NVIC_InitStructure.NVIC_IRQChannel = TIM1_UP_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&NVIC_InitStructure);

还是没有配置systick。

后来阅读CM3的技术参考手册,讲解了NVIC的配置。

中断分为内核中断和芯片的中断,配置的寄存器位置不同。芯片的中断配置在NVIC的IP内,内核的中断配置在SCB内。

可以直接调用core_cm3.h里的函数

static __INLINE void NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority)
{if(IRQn < 0) {SCB->SHP[((uint32_t)(IRQn) & 0xF)-4] = ((priority << (8 - __NVIC_PRIO_BITS)) & 0xff); } /* set Priority for Cortex-M3 System Interrupts */else {NVIC->IP[(uint32_t)(IRQn)] = ((priority << (8 - __NVIC_PRIO_BITS)) & 0xff);    }        /* set Priority for device specific Interrupts  */
}

这个函数实现了两类中断优先级的配置。

但是直观上来看看不到抢先式优先级与子优先级。

首先,配置优先级组,可以使用固件库的程序,也可以用core_cm3.h的函数。

void NVIC_PriorityGroupConfig(uint32_t NVIC_PriorityGroup)
{/* Set the PRIGROUP[10:8] bits according to NVIC_PriorityGroup value */SCB->AIRCR = AIRCR_VECTKEY_MASK | NVIC_PriorityGroup;
}

static __INLINE void NVIC_SetPriorityGrouping(uint32_t PriorityGroup)
{uint32_t reg_value;uint32_t PriorityGroupTmp = (PriorityGroup & 0x07);                         /* only values 0..7 are used          */reg_value  =  SCB->AIRCR;                                                   /* read old register configuration    */reg_value &= ~(SCB_AIRCR_VECTKEY_Msk | SCB_AIRCR_PRIGROUP_Msk);             /* clear bits to change               */reg_value  =  (reg_value                       |(0x5FA << SCB_AIRCR_VECTKEY_Pos) | (PriorityGroupTmp << 8));                                     /* Insert write key and priorty group */SCB->AIRCR =  reg_value;
}

参数范围为0~7,具体如下

随后配置各个中断的优先级,对于外设的中断可以使用固件库的程序,比较直观。如最前面所给出的例子,但是根据其实现,是不能够用来配置内核中断的,例如

    NVIC_InitStructure.NVIC_IRQChannel = SysTick_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&NVIC_InitStructure);

这是错误的,因为内部使用IRQn寻址,而SysTick_IRQn为-1.

所以对于Sysick使用core_cm3.h的函数

NVIC_SetPriority(SysTick_IRQn, 4);

这时不能显式的看出抢先式优先级与子优先级,写入的优先级需要根据优先级组的配置来选择。

NVIC_SetPriority(SysTick_IRQn, n);
n=0x00~0x03 设置Systick为抢占优先级0
n=0x04~0x07 设置Systick为抢占优先级1
n=0x08~0x0B 设置Systick为抢占优先级2
n=0x0C~0x0F 设置Systick为抢占优先级3  

NVIC_SetPriority函数指定中断优先级的寄存器位(STM32只用4位来表示优先级)的数据,例如中断优先级组设置为了2,即高2位用于指定抢占式优先级,低2位用于指定响应优先级,0x00~0x03高2位为0,所以抢占优先级为0;0x04~0x07高2位为1,所以抢占优先级为1,以此类推。

stm32 设置systick中断抢先式优先级相关推荐

  1. STM32设置闹钟中断

    最近在试验中想用RTC闹钟做低STM32单片机的低功耗唤醒,在设置闹钟中断时很走了一段弯路.网上搜到到资料基本也没得到太多帮助,遇到问题其实很简单,现在整理一下,发出来,希望对遇到这问题的朋友有帮助. ...

  2. 【 FPGA 】抢占式优先级译码器电路

    今天看用选择器实现总线设计的程序中([ FPGA ]总线实现形式之选择器),选择器控制信号部分用到了抢占式优先级译码器,这里单独把这个抢先式优先级译码器抽出来讲讲看: 高位优先,下面是Verilog ...

  3. STM32中断分配——抢占优先级与响应优先级

    <原创声明:本文属博主原创,禁止一切形式的转载.抄袭> 在用单片机做数据采集或者控制的时候,有时候需要一个工程开好几个中断,去同时控制舵机.电机.串口数据收发等等,这时候就需要对这若干个中 ...

  4. STM32的中断优先级说明(抢占式与响应式优先级)

    注:查看寄存器请看<ARM Cortex-M4权威指南>,由于本人采用库开发,所以就不深究寄存器了.总结资料来源于原子的<STM32F4库开发指南>,总结于此,方便查找. ST ...

  5. STM32 EXTI外部中断及NVIC的抢占优先级和响应优先级解释

    1.中断类型 从之前的串口实验可以看出,STM32总共分为内部中断和外部中断,内部和外部的配置差别不是很大,外部中断只是多了一步,需要通过 GPIO_EXTILineConfig(uint8_t GP ...

  6. 将STM32设置睡眠模式(使用中断唤醒)之小白学习笔记

    #include "bsp_exti.h" #include "Led_Key.h" #include "bsp_SysTick.h" in ...

  7. STM32基础-外部中断与优先级

    一,中断引脚 STM32F407有23个外部中断检测器,芯片多达 140 个 GPIO(STM32F405xx/07xx 和 STM32F415xx/17xx)通过以下方式连接到 16 个外部中断/事 ...

  8. 深入浅出地理解STM32中的中断系统——从原理到简单工程示例——保姆级教程

    深入浅出地理解STM32中的中断系统 一.什么是中断?什么是异常? 二.如何管理中断? 三.NVIC 1 NVIC 特点 2 中断优先级 (1) 优先级分组 3 中断向量表 4 中断服务函数 (1)中 ...

  9. 【STM32】FreeRTOS中断配置

    00. 目录 文章目录 00. 目录 01. 概述 02. 中断管理 03. 优先级分组 04. 优先级设置 05. 特殊寄存器 06. FreeRTOS中断配置宏 07. FreeRTOS开关中断 ...

最新文章

  1. vue从其它页面返回_vue---详细页点返回列表页,停留在原先位置
  2. 【爬虫】爬取百度贴吧数据
  3. mysql 自身参照自身_mysql个人散乱笔记,慎重参考
  4. 【转】深入浅出PageRank算法
  5. CentOS HarBor安装与配置
  6. Struts2从一个action转到另一个action的两种方法
  7. HDFS-HA的配置-----自动Failover
  8. NET 连接池救生员
  9. PHP实现时间轴函数(个性化时间)
  10. python数字转英文_GitHub - Ailln/en2an: 快速转化「英文数字」和「阿拉伯数字」
  11. numpy矩阵升维,拼接
  12. cobbler简单入门
  13. linux网络编程相关函数(一)
  14. Android HorizontalScrollView 水平滑动 在listview上面动态添加图片
  15. 项目管理——软件文档分类简介
  16. COLMAP: Structure-from-Motion Revisited 论文阅读
  17. Maven基础——什么是Maven
  18. 1、pinpoint-简介
  19. 不到 20 人的互联网公司,该去吗?
  20. saltstack批量查看linux信息,Saltstack 命令行:批量发送命令,返回执行结果

热门文章

  1. Java程序员 面试如何介绍项目经验? Java程序员应该如何介绍自己的项目经验和自我介绍?面试如何突出自己
  2. KCF算法(相关滤波算法) 跟踪目标
  3. “地表最贵iPhone”到货,iPhone XS 系列手机等你来测!
  4. 信道估计(channel estimation)图解——从SISO到MIMO原理介绍
  5. 嵌入式Linux--根文件系统(一)简介
  6. matlab 215卷积码,基于matlab的卷积码的分析与应用
  7. 3dmax骨骼的绑定
  8. SEAndroid安全机制框架分析
  9. ui设计需要会html吗,高逼格UI设计需要从何入手?
  10. 台式计算机虚拟内存怎么设置,教你怎么设置电脑的虚拟内存