收藏 分享(赏)

STM32 NVIC中断向量表设置以及EXTI中断寄存器设置.pdf

上传人:精品资料 文档编号:9262246 上传时间:2019-07-31 格式:PDF 页数:9 大小:694.46KB
下载 相关 举报
STM32 NVIC中断向量表设置以及EXTI中断寄存器设置.pdf_第1页
第1页 / 共9页
STM32 NVIC中断向量表设置以及EXTI中断寄存器设置.pdf_第2页
第2页 / 共9页
STM32 NVIC中断向量表设置以及EXTI中断寄存器设置.pdf_第3页
第3页 / 共9页
STM32 NVIC中断向量表设置以及EXTI中断寄存器设置.pdf_第4页
第4页 / 共9页
STM32 NVIC中断向量表设置以及EXTI中断寄存器设置.pdf_第5页
第5页 / 共9页
点击查看更多>>
资源描述

1、NVIC 中断向量表设置以及 EXTI 中断寄存器设置 一、开始 中断 的步 骤 A. 端口设 置。 这里 包括 了输 入引脚 的设 置, 务必 记得 打开 GPIO 的时钟 和 AFIO 的时钟 信号 B. 中断寄 存器 的设 置 C. NVIC 中断 向量 寄存 器的 设 置。 这 里关 键点 有优 先级 分组设 置以 及中 断入 口地 址的设 置 D. 中断函 数的 书写 二、 具体设 置 1 、 端口设 置 void GPIOA_init(void) GPIO_DeInit(GPIOA); RCC-APB2ENR |= 0X00000005; GPIOA-CRL GPIOA-CRL |

2、= 0x00000038; GPIOA-ODR = 0X00000000; GPIOA-ODR |= 0X00000001; AFIO-EXTICR0 |= 0X00; a. 在对端口进行任何 操作之 前,必须打开对应 的时钟 信号,其设置才能 生效。 这里使 用了 GPIOA.00 端口 作为 中断 0 输入 , 作为 输入 时一 般我们 设置 为上 拉输入, 如 果 要 设置成 浮空 输 入的 话, 外 部一定 要加 上拉 电阻 , 这 样对于 过滤 输入 波动 很有 益处( 假 设 在 电压在 3.3-2.0 之 间进行 波 动, 时 间上 没尝 试按键 操 作, 因 为一 旦有 按键,

3、 就应 该为 0 , 那么 接了 上拉 的 话,除 非产 生了 低电 平, 否则小 波动 都会 被拉 高过 滤掉) b. 复用端 口时 钟信 号的 开启 这里需要特别注意 的是因 为我们要对复用端 口寄存 器进行操作,所以 必须打 开复用 端口寄 存器 时钟 c. AFIO-EXTICR0 |= 0X00 ,EXTICR(External interrupt configuration register)即外 部中 断 配置寄 存器 。 因为 所有 的 外部中 断输 入来 源都 是经 由 GPIO 口输 入的 , 所 以我 们需要 选择哪 一个 中断 是经 由那 个 IO 口输 入的 。 我所

4、 写的 这条代 码的 意思 是 EXTI0 的中断 来 源为 GPIOX_0 口输 入。 图 1 从寄存 器配 置中 我们 可以 看到每 个中 断由 四位 配置 ,那么 STM32 总计 有 16 个外部 中断( 具 体参照 STM32 参考手 册 P133 页),因此 EXTIR 有四组 ,在 书写 时要 注意 。 具体对 应关 系如 下: 0000: PAx pin , 0001: PBx pin , 0010: PCx pin , 0011: PDx pin 0100: PEx pin ,0101: PFx pin ,0110: PGx pin。假设 我 们需 要设 定外 部中断 0 由

5、 GPIOB_0 来 控制 ,那 么我就 可 以写成 AFIO-EXTIR0 |=0X01; 2 、 中断寄 存器 的设 置 A. 首先我 们可 以观 察一 下下 图 图 2 从图中,我们可以看到和中断相关的寄存器总共有 6 个,他们分别是 1.EXTI_IMR(Interrupt mask register ) 中断 屏蔽 寄存 器。 图 3 该寄存 器复 位值 为 0,往对 应 寄存 器内写 1 则 打开中 断 2. EXTI_EMR( Event mask register )中断 事件 屏蔽 寄存器 图 4 3. EXTI_RTSR(Rising trigger selection r

6、egister) 上升 沿触 发寄存 器 图 5 4. EXTI_FTSR (Falling trigger selection register)下降 沿触发 器 图 6 需要说 明的 是, 作为 外部 唤醒线 是边 沿触 发的 ,这 些线上 不能 出现 毛刺 信号 。 5. EXTI_SWIER (Software interrupt event register) 软件 中断事 件寄 存器 图 7 我们可 以通 过对 相应 位置 写 1, 来 软件 触发 中断 , 对响 应 PR 位写 1 , 清除 软件 中断。 该寄存 器复 位值 为 0 6. EXTI_PR (Pending Reg

7、ister) 中断 挂起 寄存 器 图 8 该寄存器复位值 是不确定 的,如果某个激 活了某个 中断,则对应的 挂起位会 置 1 , 如果要 手动 清除 挂起 ,则 我们需 要往对 应位写 1. 这里需 要说 明一 下, 就是 中断和 中断 事件 不是 同一 个概念 。从图 2 中我 们可以 看 到 两者的 来源 都是 一致 的, 但 是中 断是 需要 CPU 参 与的, 需要软 件的 中断 服务 函数 才能 完 成中断 后产生 的结 果; 但是 事件,是靠 脉冲发 生器 产生 一个脉 冲, 进而由 硬件 自动 完 成这个事件产生的 结果,当 然相应的联动部件 需要先 设置好,比如引起 DMA

8、 操作,AD 转换等 。 分析程 序 void EXTI_Inition(void) EXTI-IMR = 0X0001; / EXTI-EMR = 0X0001; EXTI-FTSR = 0X0001; / EXTI-RTSR = 0X0001; 第一条 语句 , 我们 打开 了 中断 0 的使 能信 号, 第二句 是 打开 中断 事件 寄存 器( 在软件 仿真我 们选 择关 闭) ,第 三 、四行 选择 触发 方式 。 3 、 NVIC 中 断向 量寄 存器 设置 该部分 在 STM32 参 考手 册里 没 有详 细的 介绍, 关于这 部 分我 们可 以从 Cortex M3 的 编程 手

9、册里 了解 到。 涉及 到的 寄存器 如下 图 图 9 我们需 要操 作的 寄存 器有 a. ISER(Interrupt Set-Enable Register)- 中 断使 能寄 存器,该寄 存 器通 过写 1 来使 能中断 , 写 0 无效 b. ICER(Interrupt Clear-Enable Register)- 中断 失能 寄存 器, 通过对 相应 位 写 1 , 失能 中断 , 写 0 无效 c. ISPR(Interrupt Set- Pending Register)- 中 断挂 起寄 存器, 写 0,无 效, 但当 中断处 于 中断时, 写 1 无 效, 否则写 1

10、则将 该中 断挂 起。 读寄 存器,1- 中 断挂 起,0-中断未 挂 起 d. ICPR(Interrupt Clear-Pending Register)- 清 除中 断挂 起寄 存 器。写 0 无效 ,写 1 则清除 当前中 断挂 起状 态, 但是 如果该 中断 正在 执行 ,则 写 1 也无 效。 读寄 存器 ,1-中断 挂起,0- 中 断未 挂起 e. IABR(Interrupt Active Bit Register)-中断 激活 寄存 器。只 读 寄存 器,1-对应 中断激 活, 0-对应 中断 未激 活 f. IPR/IP(Interrupt Priority Registe

11、r)- 中 断优 先级 寄存 器 。这是 个很 关键 的寄 存器 ,这里 在 STM32F10XX 系列 中, 每个字 的高 4 位用 于设 定 优先级 ,需 要配 合优 先级 分组寄 存器使 用 SCB-AIRCR 。 如下 图 10 所示 图 10 比如 IP6 对应 着中 断 0( 应为 中断 0 的 中断 号为 6, 具体 参考 STM32 参考 手册 英文 版 P203) ,其 中有 8 个 bit , 但是在 设置 优先 级时 STM32 只使 用了高 4 位, 由这高 四 位 决定了抢占优先级 和响应 优先级的级别。具 体抢占 优先级和响应优先 级的分 配位数 怎么确 定的 即由

12、 优先 级分 组寄存 器控 制 SCB-AIRCR g. 关于中 断优 先级 具体 设置 中, 还有 几个 地方 需要 特 别注意 。 那就 是 AMR 内置 的基本 部 件 的优 先级 设定, 如 SysTick、 PendSV 等。 这些部分的 优先级设定, 需要对 SCB-SHPRx 进行设置。具体信息如下图: 这一部 分内 容可 以参 考 Cortex-M3 编程 手册 P138 的 4.4.8。需 要特 别注 意的 是, 在 STM32 3.5 的库 函数 中, 对应的 操作 位为 SCB-SHP0-11 。可 以查看 core_cm3.h 第 347 行。 h. SCB_AIRCR

13、(Application interrupt and reset control register )- 中 断应 用复 位寄 存器 ,其中 关系到 分组 的为 其 8-10 位 寄存器 。 图 11 图 11 具体的 分组 信息 如下 图 12 所示。Cortex-M3 中 必须强调的是必须保证有一 个抢 占优 先级 图 12-01 图 12-02 i.图中的 bit7 :4 即 对应着 IP0 的高 4 位。 需要特别强调的 是这里所 提及的中断号是 其位置号 。如中断 0 ,在中断向 量 表中位 置 号为 6 ,位置 号为 0 对 应的中 断是 窗口 定时 器中 断。 在对 SCB-AI

14、RCR 进行 操 作是, 如果 要使 写入 的数 据有效 ,则 必须 向其 高 4 字写入 0X05FA 才 能生 效, 比如 SCB-AIRCR=0X05FA0000|0X0500, 这里 0X05FA 就像 开门的 要 是 , 这一 点要 注意. 还 有就 是一旦 设置 了, 中途 则不 能改变 , 且 所有 的可 设置 的中断 都选择 了同 样的 组别 。 图 12-01 是 STM32 对 应的组 别 ,而图 12-02 是 Cortex M3 定 义的,这两 者有 差别的 。 因为优 先级 组的 是 MSB 对 其的, 而 STM32 的优 先级 由高四 位决 定, 那么由 Cort

15、ex M3 转 移到 STM32 上 ,则 是直 接保留 高四 位, 如 下表 1 所示 Group Name Priority Group High 4 bit Low 4 bit 0 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 0 0 2 1 1 1 1 1 0 0 0 4 3(011) 1 1 1 1 0 0 0 0 3 4(100) 1 1 1 0 0 0 0 0 2 5(101) 1 1 0 0 0 0 0 0 1 6(110) 1 0 0 0 0 0 0 0 0 7(111) 0 0 0 0 0 0 0 0 表 1 这样就 可以 对比 看出 共同 点就是 分组 ,0

16、-无抢 占优先 级 ,1- 一 个抢 占优 先级。 因 此在 STM32 中, 写入 SCB-AIRCR10-8 的数 字,0 组对 应 的写入 111 。 j. Vector table offset register (SCB_VTOR)- 向量 表漂 移寄 存器 图 13 第 29 位, 写入 1-对 应中 断向 量 表位于 CODE 区-内置 Flash,写 0- 中 断向 量表 位于 SRAM , 即 外部 RAM 区 写入漂 移的 地址 有 如下 要求: 必须 先求 出系 统中 共有 多少个 向量 , 再 把这 个数 字向上 “ 圆整” 到2 的 整次 幂, 而起 始 地址 必须

17、对齐 到后 者的 边 界上。 例如, 如 果一共 有32 个中断 , 则 共有32+16 (系 统异常 ) =48 个向 量, 向上 圆整 到2 的整 次幂 后值 为64 , 因此向 量表 重定 位的 地址 必须能 被 64*4=256 整 除 ,从而 合法 的起 始地 址可 以是: 0x0, 0x100, 0x200 等。(这 里为 什么 要乘 4,是 由于 CM3 规定向量 占用 4 字节 , 因此需 要 256 字节) 可以通 过看 头函 数, 在库 函数版 本 3.5 中, 提供 的 初始化 函数 已经 自动 将向 量漂移 地址设 置好 了。 使用 语句 如下 #ifdef VECT_

18、TAB_SRAM SCB-VTOR = SRAM_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal SRAM. */ #else SCB-VTOR = FLASH_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal FLASH. */ #endif 库 函 数名称 void NVIC_SetVectorTable(uint32_t NVIC_VectTab, uint32_t Offset) 接下 来看 例程 void NVIC_interrup

19、t_init() SCB-AIRCR=0X05FA0500; NVIC-ISER0=(0X01IP6 = 0xA0; 第 1 行 我们 写入 信息 为, 设 定 优先 级组 别为组 2 , 即有 抢 占优 先级 和响 应优 先级 各有两 位 控制 ,分级 0-3. 第 2 行意 思是 打开中 断 编号为 6 的 中断 ,即允 许 外部 中断 0 第 3 行 意思 即设 定中 断编号 为 6 的中 断优 先级 具体分 配 情况 ,0XA01010 0000 ,即 抢占优 先级 和响 应优 先级 都设置 为 2. 这里需要注意,我并没有 设置中断偏移,采用了默 认设置,如果有需要时, 则要对 SC

20、B-VOTR 进行 相关 设置 4 、 中断函 数的 书写 A. 中断函数名的书写有要求,否则会找不到中断入口。在 3.5 库函数之前,在 stm32f10x_it.c 中 就预 先写 好了个 外部 中断 的函 数名 称, 我 们只要 将对 应的 执 行过程 填 充 进去 就可 以;但 3.5 库函数 里没 有给 出, 因此 我们参 考之 前的 。比 如例 程中我 写的中 断函 数名 称就 为 void EXTI0_IRQHandler(void) 。 B. 在进入 中断 后我 们需 要做 的动 作有 2 部, 一次 执行中 断 过程 ,2 是 清除 中断 挂起标 识,因 为执 行完 毕了 。如 果不清 除中 断挂 起标 识, 则无法 再次 进入 中断 。 看例程 void EXTI0_IRQHandler(void) delayMs(10); if(GPIOA-IDR) GPIOA-ODR = (GPIOA-ODR EXTI-PR=1; 这里 EXTI-PR=1 ,即 想中 断 挂起 寄存 器中写 1 ,清 除 中断

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报