zoukankan      html  css  js  c++  java
  • STM32 NVIC

    这个概念查了半天也没弄清楚,后来看正点原子资料里的一篇文章弄明白了。现将理解的加以纪录,以备忘。

    首先说一下优先级分组  这个概念应该是直译的英文。这个词本身就不对。准确的说是组织形式。分组给人感觉同时有好多人,分成好多组,大家选一组。。实质上分组的形式。也就是怎么分,分的方式,所以你只能选一种,这并非让我们选一个分组,而是选一个分组的方法。

    以嵌入式而言,这个选的过程,肯定就是一个对寄存器赋值的过程。

    首先,给出CORTEX-M3权威指南里的一个图,这个图原汁原味!

    这个图的意思是如果

    赋值为0   则8位里面第0位是亚优先级 1~7位是抢占优先级   128级抢断式优先级  每个抢断优先级里2个平等优先级   以下类推

    0           [7:1] [0:0]==>  128   2

    1           [7:2] [1:0]==>   64    4

    2           [7:3] [2:0]==>    32   8

    3           [7:4] [3:0]==>    16   16

    4           [7:5] [4:0]==>      8   32

    5           [7:6] [5:0]==>      4   64

    6           [7:7] [6:0]==>      2   128

    7           [     ] [7:0]==>      1   256

    根本不存在分组,只是要我们选哪种分组模式而已,这个词很容易让人产生误会!!!

    从图里可以看出 至少有一个亚优先级,也即平等优先级,也即平等优先级至少占1位

    上面是CORTEX-M3自己规定的东西,但是STM32说了,它搞不定这么复杂的东西,它说它只用4位表示优先级,不用8位

    按道理说,它应该设计成如下左边这样, 实际设计成了右边这样

                                                                                           4           [3:0] [     ]==>    16     1

    0           [3:1] [0:0]==>      8   2                                        3           [3:1] [0:0]==>      8     2

    1           [3:2] [1:0]==>      4   4                                        2           [3:2] [1:0]==>      4     4

    2           [3:3] [2:0]==>      2   8                                        1           [3:3] [2:0]==>      2     8

    3           [     ] [3:0]==>      1   16                                      0           [     ] [3:0]==>      1     16

    它打破了至少有1位平等优先级的约定,实际上这样才好,这是很可取的一点。

    STM32设计成这样,它们有解释权,CORTEX-M3规定7号分组方式无抢断优先级位  6号分组方式1个抢断优先级位。

    STM解释为0号分组方式无抢断优先级位 1号分组方式1个抢断优先级位。

    我们再看实际情况,CORTEX-M3里面7号分组方式的时候3位全1。

    对应的STM32 0号分组方式时3位全1。这中间就差了一个取反。

    所以正点原子有如下代码

     1 void MY_NVIC_PriorityGroupConfig( u8 NVIC_Group )
     2 {
     3     u32 temp, temp1;
     4     temp1 = ( ~NVIC_Group ) & 0x07; //取后三位
     5     temp1 <<= 8;
     6     temp = SCB->AIRCR; //读取先前的设置
     7     temp &= 0X0000F8FF; //清空先前分组
     8     temp |= 0X05FA0000; //写入钥匙
     9     temp |= temp1;
    10     SCB->AIRCR = temp; //设置分组
    11 }

    中间这个取反,向上STM32自圆其说,向下暗合CORTEX-M3规范。这应该也是STM32库函数里的东西,具体没看过,不作评论。

    这篇文章仅为个人备忘,至少能解释的通。但错误难免。

  • 相关阅读:
    python 正则表达式
    python -- 程序异常与调试(程序调试)
    python -- 程序异常与调试(异常处理)
    python -- 程序异常与调试(识别异常)
    python -- 日期与时间
    python -- 模块与类库
    python -- 面向对象编程(继承、重写)
    python -- 面向对象编程(属性、方法)
    python -- 面向对象编程(类、对象)
    python -- 函数
  • 原文地址:https://www.cnblogs.com/javado/p/4759162.html
Copyright © 2011-2022 走看看