打印

GD32的中断和异常

[复制链接]
1917|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
sunmeat|  楼主 | 2015-3-11 15:10 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
本帖子的框架基于零死角玩转STM32,但是基于GD的内容。里面的截图都来自GD32的数据手册,于STM32无关。
沙发
sunmeat|  楼主 | 2015-3-11 15:17 | 只看该作者
Cortex 内核具有强大的异常响应系统,它把能够打断当前代码执行流程的事件分为异常(exception)和中断(interrupt),并把它们用一个表管理起来,编号为 0~15 的称为内核异常,而 16 以上的则称为外部中断(外,相对内核而言) ,这个表就称为中断向量表。Cortex-M3的中断向量表如下:

使用特权

评论回复
板凳
sunmeat|  楼主 | 2015-3-11 15:29 | 只看该作者
而GD32F103X的向量中断同M3内核的中断一样,从编号16开始的为外部中断,这些中断的优先级都是可以自行设置的。GD32F103x的向量中断表如下:

使用特权

评论回复
地板
sunmeat|  楼主 | 2015-3-11 15:55 | 只看该作者
上图中的这个表可以从GD32F103x的数据手册中找到,但是GD官方放出的手册,除GD32F103X外,其他的型号比如GD32F130,GD32F150都没有详细的寄存器版本的手册。因此,这个向量表可以从对应的STM32的芯片启动文件中找到,在启动文件中,已经有相应芯片可用的全部中断向量。而且在编写中断服务函数时,需要从启动文件中定义的中断向量表查找中断服务函数名。

使用特权

评论回复
5
sunmeat|  楼主 | 2015-3-11 16:52 | 只看该作者
STM32 的中断如此之多,配置起来并不容易,因此,我们需要一个强大而方便的中断控制器 NVIC (Nested Vectored Interrupt Controller)。 NVIC 是属于Cortex 内核的器件,不可屏蔽中断 (NMI)和外部中断都由它来处理,而SYSTICK 不是由 NVIC 来控制的。
NVIC 在内核中的位置图如下

使用特权

评论回复
6
sunmeat|  楼主 | 2015-3-12 10:19 | 只看该作者
本帖最后由 sunmeat 于 2015-3-12 10:23 编辑

当我们要使用 NVIC 来配置中断时,自然想到 ST 库肯定也已经把它封装成库函数了。查找库帮助文档,发现在 Modules->STM32F10x_StdPeriph_Driver->misc查找到一个 NVIC_Init()函数,对 NVIC 初始化,首先要定义并填充一个NVIC_InitTypeDef类型的结构体。

使用特权

评论回复
7
sunmeat|  楼主 | 2015-3-12 10:22 | 只看该作者
NVIC_InitTypeDef类型的结构体的成员为:

使用特权

评论回复
8
sunmeat|  楼主 | 2015-3-12 10:24 | 只看该作者
前面两个结构体成员都很好理解, 首先要用 NVIC_IRQChannel参数来选择将要配置的中断向量,用 NVIC_IRQChannelCmd参数来进行使能(ENABLE)或关闭(DISABLE) 该中断。在 NVIC_IRQChannelPreemptionPriority成员要配置中断向量的抢占优先级,在NVIC_IRQChannelSubPriority需要配置中断向量的响应优先级。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

208

主题

2132

帖子

13

粉丝