【STM32 LL库编程】外部中断与中断管理

0x01 > 什么是中断

         所谓中断就是指CPU正处于工作状态时,外部发生了某一事件(按键按下),请求CPU进行处理,于是 CPU暂时中断当前的工作,转而处理所发生的的事件,处理完毕在回到原来被中断的地方继续工作,这样的过程被称为中断

中断示意图

中断包括以下几部分

  • 中断源
  • 中断申请
  • 开放中断
  • 保护现场
  • 中断服务
  • 恢复现场
  • 中断返回

我们知道 传统的51单片机一共有 5 个中断源,它们分别为:

  1. 外部中断0
  2. 定时器0
  3. 外部中断1
  4. 定时器1

现在正在学习的 STM32 有多少中断呢?

0x02 > STM32 中断基础知识

  • Cortex-m3支持256个中断,其中包含了16个内核中断,240个外部中断。
  • STM32 只有84个中断,包括16个内核中断和68个可屏蔽中断
  • STM32 上只有60个可屏蔽中断,f107上才有68个中断
  • 先占优先级也就是抢占优先级,概念等同于51单片机中的中断。假设有两中断先后触发,已经在执行的中断先占优先级如果没有后触发的中断 先占优先级更高,就会先处理先占优先级高的中断。也就是说又有较高的先占优先级的中断可以打断先占优先级较低的中断。这是实现中断嵌套的基础。
  • 次占优先级,也就是响应优先级,只在同一先占优先级的中断同时触发时起作用,先占优先级相同,则优先执行次占优先级较高的中断。次占优先级不会造成中断嵌套。 如果中断的两个优先级都一致,则优先执行位于中断向量表中位置较高的中断。

  0x001 >> 嵌套向量中断控制器 (NVIC)

    STM32 的中断既然有这么多,那么要怎么管理呢?
ST也给了我们一些解决方案就是 使用 嵌套中断向量控制器 NVIC,NVIC属于内核级的寄存器,所以当我们需要查询 NVIC 相关定义 应该到 core_cm3.h 中(这里讲解的芯片是 STM32F103ZE 是基于 Coretex-M3)

/* 访问嵌套向量中断控制器 (NVIC)的结构类型 */
typedef struct
{
  __IOM uint32_t ISER[8U];               /* 中断使能寄存器 */
        uint32_t RESERVED0[24U];
  __IOM uint32_t ICER[8U];               /* 中断清除寄存器 */
        uint32_t RSERVED1[24U];
  __IOM uint32_t ISPR[8U];               /* 中断悬起寄存器 */
        uint32_t RESERVED2[24U];
  __IOM uint32_t ICPR[8U];               /* 中断清空悬起寄存器 */
        uint32_t RESERVED3[24U];
  __IOM uint32_t IABR[8U];               /* 中断有效位寄存器 */
        uint32_t RESERVED4[56U];
  __IOM uint8_t  IP[240U];               /* 中断优先级寄存器(8Bit wide) */
        uint32_t RESERVED5[644U];
  __OM  uint32_t STIR;                   /* 软件触发中断寄存器 */
}  NVIC_Type;

  0x002 >> 中断优先级定义 ☆

中断优先级设定寄存器

coretex-M3 内核的中断定义寄存器的宽度是8位的,在上图中,我们能看到ST在设计中断的时候只使用了高4位 [7:4]

The processor implements only bits[7:4] of each field, bits[3:0] read as zero and ignore writes.
处理器只实现每个字段的位[7:4],位[3:0]读为零,忽略写。

ST在上述分组中,ST还将中断分成了主优先级(抢占优先级)和子优先级(响应优先级)。对应的寄存器


优先级分组寄存器

优先级组

上图就是,优先级分组寄存器和对应的优先级分组,下面来简单的总结一下优先级分组怎么用。


优先级分组
/* LL 库中断优先级分组,选项和实现 */

#define NVIC_PRIORITYGROUP_0         ((uint32_t)0x00000007) /*!< 0 bit  for pre-emption priority,
                                                                 4 bits for subpriority */
#define NVIC_PRIORITYGROUP_1         ((uint32_t)0x00000006) /*!< 1 bit  for pre-emption priority,
                                                                 3 bits for subpriority */
#define NVIC_PRIORITYGROUP_2         ((uint32_t)0x00000005) /*!< 2 bits for pre-emption priority,
                                                                 2 bits for subpriority */
#define NVIC_PRIORITYGROUP_3         ((uint32_t)0x00000004) /*!< 3 bits for pre-emption priority,
                                                                 1 bit  for subpriority */
#define NVIC_PRIORITYGROUP_4         ((uint32_t)0x00000003) /*!< 4 bits for pre-emption priority,
                                                                 0 bit  for subpriority */

/**
  \brief   Set Priority Grouping
  \details Sets the priority grouping field using the required unlock sequence.
           The parameter PriorityGroup is assigned to the field SCB->AIRCR [10:8] PRIGROUP field.
           Only values from 0..7 are used.
           In case of a conflict between priority grouping and available
           priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set.
  \param [in]      PriorityGroup  Priority grouping field.
 */
__STATIC_INLINE void __NVIC_SetPriorityGrouping(uint32_t PriorityGroup)
{
  uint32_t reg_value;
  uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL);             /* only values 0..7 are used          */

  reg_value  =  SCB->AIRCR;                                                   /* read old register configuration    */
  reg_value &= ~((uint32_t)(SCB_AIRCR_VECTKEY_Msk | SCB_AIRCR_PRIGROUP_Msk)); /* clear bits to change               */
  reg_value  =  (reg_value                                   |
                ((uint32_t)0x5FAUL << SCB_AIRCR_VECTKEY_Pos) |
                (PriorityGroupTmp << SCB_AIRCR_PRIGROUP_Pos) );               /* Insert write key and priority group */
  SCB->AIRCR =  reg_value;
} 

假设我们有两个外设 外设A 和外设B 我们将 两个外设的主优先级都配置为 0,将外设 A 的子优先级配置为 1,外设 B 的子优先级配置为 2,。当它们的中断请求同时到来时,内核将如何执行?

内核将比较两个外设的主优先级,如果外设的主优先级相等,就会对子优先级进行比较,子优先级越高,子优先级的数字就越小。

令人头痛的问题,如果外设的主优先级、子优先级都相同,怎么判断?

如果外设的主优先级和子优先级都相等,那么将会对硬件中断编号进行比较

硬件编号在哪?

硬件编号 位于 《STM32 中文参考手册_V10》第九章 中断和事件 第9.1.2小节 中断和异常向量表

0x03 > 总结

以上就是 关于 STM32F103ZE 的外部中断与中断管理的理论部分。这篇文章可能会让你感到晦涩难懂,或者有漏洞,那是在所难免的问题。
如有错误,欢迎指正,对您有帮助,点个赞再走 (>..<)

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,277评论 6 503
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,689评论 3 393
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,624评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,356评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,402评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,292评论 1 301
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,135评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,992评论 0 275
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,429评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,636评论 3 334
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,785评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,492评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,092评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,723评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,858评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,891评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,713评论 2 354

推荐阅读更多精彩内容