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库函数里的东西,具体没看过,不作评论。

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

  • 相关阅读:
    『TensorFlow』模型保存和载入方法汇总
    『cs231n』作业2选讲_通过代码理解Dropout
    『cs231n』作业2选讲_通过代码理解优化器
    『科学计算』图像检测微型demo
    『cs231n』作业1选讲_通过代码理解KNN&交叉验证&SVM
    大数据技术之_16_Scala学习_13_Scala语言的数据结构和算法_Scala学习之旅收官之作
    IDEA 取消参数名称(形参名)提示
    大数据技术之_16_Scala学习_12_设计模式+泛型、上下界、视图界定、上下文界定、协变逆变不变
    大数据技术之_16_Scala学习_11_客户信息管理系统+并发编程模型 Akka+Akka 网络编程-小黄鸡客服案例+Akka 网络编程-Spark Master Worker 进程通讯项目
    大数据技术之_16_Scala学习_10_使用递归的方式去思考,去编程+作业07/08/09
  • 原文地址:https://www.cnblogs.com/javado/p/4759162.html
Copyright © 2011-2022 走看看