原创 关于NVIC更深入的一点理解

2011-7-3 15:20 5337 6 7 分类: MCU/ 嵌入式

NVIC是矢量嵌入中断控制,包括:1) ISER2) ICER; 3) ISPR; 4) ICPR; 5) IABR; 6IPR 这几个寄存器。<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

typedef struct
{
  vu32 ISER[2];
  u32  RESERVED0[30];
  vu32 ICER[2];
  u32  RSERVED1[30];
  vu32 ISPR[2];
  u32  RESERVED2[30];
  vu32 ICPR[2];
  u32  RESERVED3[30];
  vu32 IABR[2];
  u32  RESERVED4[62];
  vu32 IPR[15];
} NVIC_TypeDef;
  首先分析为什么定义。这是因为ISER的地址是从E000E100开始的,ICER是从E000E180开始的,依次类推;可见从0xE000E1000xE000E180间隔1288位,也就是3232位的数据;这就是vu32 XXX[2]+u32 RESERVED0[30]总的位数。

  1

  ISER包括ISER[0]ISER[1],它们的每位值依次对应一个中断的开启和关闭。例如ISER[0]中的第0位对应

WWDG 窗口定时器中断;第25位对应TIM1_UP TIM1更新中断。---用来开中断

  ICER写响应的位为1则对应的中断禁止,默认全0,读如果该位为1则相应的中断允许--用来关中断。

  2

  ISPR中某位为1则挂起相应中断;

  ICPR中某位为1则清除挂起的中断;

  3

  IABR只读用来指示是否有中断发生或要处理;

  4

  IPR用来设置优先级别

下面是参考手册的理解

顺便把参考手册上传到这里pdf.gifDDI0337G_cortex_m3_r2p0_trm.pdf

 

搞了一天,才知道原子的程序中的一段

void MY_NVIC_PriorityGroupConfig(u8 NVIC_Group) 
{
 u32 temp,temp1;  
 temp1=(~NVIC_Group)&0x07;//取后三位

为什么NVIC_Group要求反,

 

#define NVIC_PriorityGroup_0         ((uint32_t)0x700) /* 0 bits for pre-emption priority
                                                          4 bits for subpriority */
#define NVIC_PriorityGroup_1         ((uint32_t)0x600) /* 1 bits for pre-emption priority
                                                          3 bits for subpriority */
#define NVIC_PriorityGroup_2         ((uint32_t)0x500) /* 2 bits for pre-emption priority
                                                          2 bits for subpriority */
#define NVIC_PriorityGroup_3         ((uint32_t)0x400) /* 3 bits for pre-emption priority
                                                          1 bits for subpriority */
#define NVIC_PriorityGroup_4         ((uint32_t)0x300) /* 4 bits for pre-emption priority
                                                          0 bits for subpriority */

在固件库中找到了答案,其实权威指南中说得很好

通过让优先级以MSB 对齐,可以简化程序的跨器件移植。比如,如果一个程序早先在
支持4 位优先级的器件上运行,在移植到只支持3 位优先级的器件后,其功能不受影响。但
若是对齐到LSB,则会使MSB 丢失,导致数值大于7 的低优先级一下子升高了,甚至会反转
小于等于7 的高优先级。如,8 号优先级因为损失了MSB,现在反而变成0 号了!

发现参考固件库是个不错的方法。

文章评论1条评论)

登录后参与讨论

用户414196 2012-1-29 14:29

good
相关推荐阅读
Crystal_oscillator 2012-06-06 11:39
我的一些与研究生生涯的相关资料
如题。...
Crystal_oscillator 2012-06-02 19:42
EDA--IPCore的使用
很清晰地讲解了如何在EDA中使用IPCore,推荐在这里,如附件: ...
Crystal_oscillator 2012-05-21 14:12
c#与MySql连接
如附件:...
Crystal_oscillator 2012-04-01 20:41
关于搜索的一点思考
  现在的搜索引擎,仍然面对的一个现实就是:它依然找不到客户所需要的东西。   这里面有两个原因:   (1)现有的东西没有被归类,而是分散在浩如烟海的网络中,各种博客,微博等等。  ...
Crystal_oscillator 2012-04-01 12:00
有趣的加1电路
  在上一篇博客,我介绍了并行加法。在这里,我将带大家学习并行加一电路,并且,我们会发现结 论相当简单有趣。     我们知道对于一位加法电路,假设A,B是参与运算的两个位变量,C_1...
Crystal_oscillator 2012-03-21 17:53
【博客大赛】VHDL实现并行8位加法
  要实现8位加法,先要从1位开始。假设A,B,C_1分别为两个输入值和进位输入,S是和值,C为进位输出值,于是便有以下表达式:   S=A xor B xor C_1;   C=AB+BC_...
我要评论
1
6
关闭 站长推荐上一条 /2 下一条