K60芯片NVIC模块中断相关寄存器配置以及应用举例

上传人:德****1 文档编号:1089139 上传时间:2017-05-27 格式:PDF 页数:6 大小:402.04KB
返回 下载 相关 举报
K60芯片NVIC模块中断相关寄存器配置以及应用举例_第1页
第1页 / 共6页
K60芯片NVIC模块中断相关寄存器配置以及应用举例_第2页
第2页 / 共6页
K60芯片NVIC模块中断相关寄存器配置以及应用举例_第3页
第3页 / 共6页
K60芯片NVIC模块中断相关寄存器配置以及应用举例_第4页
第4页 / 共6页
K60芯片NVIC模块中断相关寄存器配置以及应用举例_第5页
第5页 / 共6页
点击查看更多>>
资源描述

《K60芯片NVIC模块中断相关寄存器配置以及应用举例》由会员分享,可在线阅读,更多相关《K60芯片NVIC模块中断相关寄存器配置以及应用举例(6页珍藏版)》请在金锄头文库上搜索。

1、飞思卡尔 Kinetis芯片 中 NVIC模块 的 中断寄存器 的介绍及其应用 举例 喻宁宁 IMM 现场应用工程师 飞思卡尔半导体 一、 NVIC 模块 的 中断寄存器 简介 嵌套式向量中断控制器( NVIC)是 Cortex内核不可分割的一部分,它与 CPU紧密结合,可对系统异常和外设中断进行控制。如图 1所示, NVIC右端连接到各个外围模块,负责对外设中断进行处理;左端连接到内核,负责对内核系统异常进行处理 。 本文重点介绍 NVIC对外围模块的中断控制。通常,在 配置某个 外围 模块的中断 功能 时,除了 需要 设置 此 模块 本身的 寄存器中的 中断使能位外,还需要配置 NVIC模

2、块 中 对应的中断 控制 寄存器, 系统 才会响应 此 外围模块 的中断请求。 图 1 NVIC的连接框图 ARM Cotex-M4的 NVIC模块中相关 寄存器 的 地址、名称、功能描述如图 2所示 , 它们可 分为两种类型:非 优先级 中断 寄存器 ( non-IPR register) 和 优先级 中断 寄存器 ( IPR register) 。 其中, 非优先级中断寄存器 有 以下几种 : NVICISERx:中断使能设置寄存器; NVICICERx:中断使能清除寄存器; NVICISPRx:中断挂起设置寄存器; NVICICPRx:中断挂起清除寄存器; NVICIABRx;中断激活

3、状态 寄存器 ; 其中 x为 0 - 7,称为寄存器的组号,表示每种寄存器都有 8个。这些寄存器都是 32位的。因此,如果每一位控制一个中断源,则可以 分别 控制 256个中断源。 通常,NVICISERx(中断使能 设置 寄存器 ) 用于去使能 某 个中断, 而 NVICICPRx(中断挂起清除 寄存器 ) 用于 配合 NVICISERx寄存器来使能 这 个中断 ; NVICIABRx(中断激活状态 寄存器 ) 为只读寄存器 ,用于判断 某个 中断 是否处于 激活 的状态 。 图 2 NVIC寄存器描述 而优先级 中断 寄存器只有一种: NVICIPRx,用于设定 每个中断源 的优先级。 从

4、图 3可以看到,每个中断源 的优先级控制字 要占用 4位,再加上保留位,则每个 32位的寄存器可以配置 4个中断源的优先级。因此,如果要配置 256个中断源的优先级,则需要 256 4 = 64个 32位的寄存器。但是 Kinetis系列 MCU的中断源一般都没有这么多,也就不需要这么多的寄存器。 图 3 中断优先级控制寄存器位域分布 下面 以 K60为例进行 具体 说明。 K60支持 16级中断控制,所以在 NVIC中 , 对应于 不同的 中断源,在优先级 中断 寄存器 NVICIPRx中都有 4个 相应的位来控制其优先级, 另外还有 4位 是保留位, 如图 3所示。 从图 2 可以看出 ,

5、每种 非 优先级 中断 寄存器 都是一个包含 8个 32 位寄存器的 寄存器 组 。那么在应用过程中,对应 于 K60的 90多 种 不同的中断源, 应该配置 这些 寄存器组 中 的哪一个寄存器 (组号) 和该 32位寄存器的那一位 (位号) 呢?简单来说,就是 组号和位号的确定 。 例如 NVICICER221,它的组号就是 2,位号就是 21。这就需要借助 芯片厂商在CPU中为 不同中断源 定义 的 中断请求号 IRQ。 需要特别 注意的是,中断向量号和 中断请求号 IRQ号 不同, 中断请求号 IRQ = 中断向量号 -16,因为有 16个 ARM内核 中断 请求 是 没有分配 IRQ号

6、的 。 在 K60的 Reference Manual 的 P74页可以看到 CPU中断向量分配 表,定义了各种不同的中断源 所 对应的中断入口地址、中断向量号、中断请求号、寄存器号以及彼此之间的关系 ,如图 4所示。 图 4 LPTMR中断向量的分配 这里结合 K60的 中断向量分配表,以 LPTMR(低功耗定时器) 模块为例介绍一下NVIC寄存器的配置 。 LPTMR模块的中断向量分配 如 图 4所示,可以看 到 LPTMR中断入口地址为 0x0000_0194,中断向量号为 101, 中断请求号 IRQ为 85。 那么 如何确定 配置LPTMR中断 所 对应 的 NVIC寄存器 的组号和

7、位号呢?即 LPTMR使用 NVIC寄存器 组中的哪 一个 寄存器 ,以及 该寄存器的哪个 位呢? 它们又和中断向量号 IRQ有什么关系呢,下面分 非优先级 中断 寄存器 和优先级 中断 寄存器分别介绍。 对于非优先级 中断 寄存器,如上面提到的 NVICISERx、 NVICICERx、 NVICSPRx、NVICCPRx以及 NVICABRx,组号的计算公式为 IRQ / 32,所以可以得到 LPTMR的NVIC非优先级 中断 寄存器 的 组号为 85 / 32 = 2,从而得到 LPTMR需要使用的非优先级 中断 寄存器为 NVICISER2、 NVICICER2、 NVICISPR2、

8、 NVICICPR2、 NVICIABR2。这些寄存器都是 32位 的, 所以 对应 于 LPTMR的位号计算公式为 IRQ % 32,得到 85 % 32 = 21。确定完了组号和位号,便得到了需要设置的 LPTMR的非优先级中断控制寄存器 及相应的位为: NVICISER221、 NVICICER221、 NVICISPR221、 NVICICPR221、NVICIABR221。 对于优先级 中断 寄存器 IPR, 如上所述,因为每一个 IPR寄存器可以设置 4个中断源的优先级,所以 组号计算公式为 IRQ / 4 = 21。 下面确定位号,前面讲到优先级控制需要 4位,另外还有 4位 保

9、留位,所以每个中断源需要 8位,因此位起始号的计算公式为 8 * (IRQ % 4) + 4,得到 LPTMR的位起始号为 8 * (85 % 4) + 4 = 12。确定完了组号和位号,便得到了 LPTMR的优先级 中断 寄存器 及相应的 位为: NVICIPR2115:12。 二、应用举例 通常, 中断 程序 的处理 流程为:关闭 系统 总中断、开 启 外设 模块并 使能 该外设 模块中断、 配置 NVIC模块 中的 中断 寄存器 、开总中断 等 几个过程。 第一步, 关闭 系统 总中断 。 一般 采用 宏定义 DisableInterrupts,其本质是在内部调用一句汇编代码“ CPSI

10、D i”。同样,打开总中断 一般 采用 EnableInterrupts,本质是在内部调用一句汇编代码“ CPSIE i”。 第二步, 开启 外设 模块 并 使能 其中断 。 需要设置 外设 模块 的寄存器中的 中断使能 位。对于 LPTMR,需要置位控制状态寄存器 LPTMRx_CSR的 TIE位。 SIM_SCGC5|=SIM_SCGC5_LPTIMER_MASK; /开 LPT模块时钟 LPTMR0_CSR|=LPTMR_CSR_TIE_MASK; /使能 LPT定时器中断 第三步, 配置 NVIC模块 的 中断 寄存器 。 需要设置 NVIC中 相关的中断控制寄存器,如上面提到的 NV

11、ICISERx、 NVICICERx、 NVICSPRx、 NVICCPRx、 NVICABRx以及NVICIPRx。 值得注意的是, 使能一个 外设的 中断 需要完成两个步骤 , 首先 置位NVICICPRx(中断 挂起 清除 寄存器 ) ,然后 再 置位 NVICISERx(中断使能设置 寄存器 ) 。其原因在于,在完成第二步开启并使能外设模块中断后,外设模块便可以被触发产生中断请求, 这时如果 置位 NVICISERx(中断使能设置寄存器) ,程序便 可以 进入中断服务程序, 而 这 并 非程序编写者的本意 。 所以为避免出现这种情况 ,需要首先 置位 NVICICPRx(中断 挂起 清

12、除寄存器) , 清除已经挂 起 的中断 ,然后再置位 NVICISERx(中断使能设置寄存器), 等待下一个中断的发生。 代码 实现 如下 : void enable_ irq (int irq_num) /使能 IRQ中断请求 int div; if (irq_num 91) irq_num =91; /确定 IRQ号是否有效 div = irq_num /32; /确定 NVIC中断控制寄存器的组号 (0、 1、 2) switch (div) case 0x0: NVICICPR0 = 1 91) irq=91; /确定 IRQ号是否有效 div = irq_num /32; /确定 N

13、VIC中断控制寄存器的组号 (0、 1、 2) switch (div) case 0x0: NVICICER0 = 1 91) irq_number =91; /确定 IRQ号是否有效 if (irq_prior 15) irq_prior =15; /确定中断优先级设置是否在范围内 prio_reg = (uint8 *)(uint32)&NVICIP0) + irq_number); /设置 IRQ对应 的 NVICx *prio_reg = ( (irq_prior &0xF) 4 ); 另外, 对于一个完整的 中断 程序代码, 用户还需 编写 中断 服务 程序 代码 以及 定义中断服

14、务函数 , 并 在 Vector.h文件中声明自定义的中断服务函数,并 将 中断向量表 中 的宏定义修改 为 此 中断服务程序的 函数 名 ,指定中断服务程序的入口地址 。 void default_isr(void); /默认的中断服务程序 extern void lptmr_isr(void); /自定义的终端服务程序 . #define VECTOR_101 lptmr_isr / 定义 LPTMR的中断向量函数 #endif 中断 服务程序 示例代码 如下: void lptmr_isr(void) DisableInterrupts; /关闭总中断 LPTMR0_CSR|=LPTMR

15、_CSR_TCF_MASK; / 清除 LPTMR比较标志 LPTMR_Count+; / LPTMR定时器中断次数 计数 EnableInterrupts; /开放总中断 需要注意的是, 由于在本示例程序中 只 应用到 LPTMR中断 , 所以在以上中断 服务程序 中使用了关闭总中断和开放总中断操作。 用户 如果需要 在程序中 设置中断嵌套,则不能够关闭总的中断。 三、 总结 本文介绍了飞思卡尔 Kinetis系列 MCU的 嵌套式向量中断控制器( NVIC) 模块 的 相关寄存器 , 以及 中断向量请求号 IRQ与 NVIC寄存器组号和位号的对应关系,并以 Kinetis K60的 LPTMR低功耗定时器 模块为例给出了程序示例代码 。 参考文献 : 1、 Cortex-M4 Devices Generic User Guide: http:/ 2、 K60 Sub-Family Refer

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 中学教育 > 教学课件 > 高中课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号