zoukankan      html  css  js  c++  java
  • cortex-m3内核的芯片截图,以及内核学习

    以下几张是lpc的nvic截图,需要开启在线仿真后再截图~

    从中可以看出,编号2-16的异常是cm3内核独有的,不是外设芯片的,也就是说,只要是cm3内核就必须有这些异常。

    2和3的异常的优先级是固定为-2,-1的不能更改的,见下表的4.8的框图,这个是f10x的内核技术手册,是cm3技术手册的部分摘录说明的,因此也是很不错的参考资料。中文翻译就是:系统异常优先级寄存器吧,并且是字节访问的,SHPR1-SHPR3 are byte accessible.通常情况下,我们可以更该部分优先级的,比如PendSV 和SysTick,尤其是在有rtos的情况下,就需要根据情况来更改两者的优先级。

    lpc1768中,我配置systick=31,因为在lpc的参考手册中是使用了5个bit来表示优先级分组或子优先级的。

    来看看是怎么分配31的,这里的配置函数:等价于NVIC_SetPriority (-1,31);

     

    这里等价于:SCB->SHP[11] = ((31<<3)&0xff)=0xF8,如此就将这个字节的高5位填充为1,lpc的优先级是比stm32多一位的,stm32只用了4位。

    细看,这里的优先级分组是配置SCB_AIRCR的值=0xfa050000,

     

    在Cortex™ -M3 r2p0 Technical Reference Manual手册中是这么描述的。0b000对应了128抢占优先级和2个子优先级,但是我找不到lpc的内核手册,所以无法明确具体的分组情况。因此保留了复位的值,0xfa050000,

    另外外设的优先级我配置了9,来看看怎么配置的,

    /* preemption = 1, sub-priority = 1 */
    NVIC_SetPriority(TIMER1_IRQn, ((0x01 << 3) | 0x01));

    ===等价于

    /* preemption = 1, sub-priority = 1 */
    NVIC_SetPriority(2, ((0x01 << 3) | 0x01));

    转到:下面的语句

    NVIC->IP[(uint32_t)(IRQn)] = ((priority << (8 - __NVIC_PRIO_BITS)) & 0xff);    } 

    ===等价于

    NVIC->IP[2] = 0x48,cm3内核规定的总共240个优先级寄存器,0x48就是他的优先级使用的高五位的。

    下面是stm32的nvic截图,systick中断优先级=240,其实之用了高4位,就是0xf=15

     

      

  • 相关阅读:
    android cocos2d-x视频
    Android OpenGL 学习笔记 --开始篇
    Nginx配置详解
    扩展RBAC用户角色权限设计方案
    几种序列化与Get、Set方法的关系
    Kettle大量数据快速导出的解决方案(利用SQL导出百万级数据,挺快的)
    SpringBoot 标准集成MyBatis的2种方式
    Apache Commons io FileUtils 详解
    SpringBoot在工具类中读取配置文件(ClassPathResource)
    利用guava封装RateLimiter 令牌桶算法(AOP实现)
  • 原文地址:https://www.cnblogs.com/CodeWorkerLiMing/p/14137050.html
Copyright © 2011-2022 走看看