tm32的中断比起51丰富很多,部分如下
关于外部中断:
GPIO 的管教 GPIOx.0~GPIOx.15(x=A,B,C,D,E,F,G)分别对应中断线 0~15。这样每个中
断线对应了最多 7 个 IO 口,以线 0 为例:它对应了 GPIOA.0、GPIOB.0、GPIOC.0、GPIOD.0、
GPIOE.0、GPIOF.0、GPIOG.0。中断线每次只能连接到 1 个 IO 口上,另外外部中断需要使能AFIO时钟(也算是端口映射的操作),其中5-9,10-15中断线分别在两个中断服务函数中,其余0-4各自一个中断服务函数
使用某个中断大致分三步,首先打开相应的时钟,再设置本次中断产生源的参数(如定时器的参数 、外部中断触发方式等),最后设置NVIC
关于NVIC,在《Cortex™-M3技术参考手册》里才有详细介绍,stm32参考手册没怎么说。
NVIC即“嵌套向量中断控制器:Nested Vectored Interrupt Controller (NVIC)”,大概就是管理中断响应及优先级的系统。相应中断若没有在NVIC里使能便不能得到处理器的执行
我们只稍微看一个寄存器的设置,意思一下,目前没必要全部了解,知道大概过程就行了。
以下为定时器中断设置NVIC,我们重点看下具体是操作了什么寄存器
NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn; //指明中断名称 在stm32f10x.h中定义
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //先占优先级0级,即抢占优先级,是对抢占时的优先级的划分,高优先级(数字小的)能打断低优先级,能有嵌套关系
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //从优先级3级,相同抢占优先级时,不能相互打断,但同时发生时根据响应优先级来决定谁先,且不能有嵌套关系,另外两个优先级都相同时谁先就谁先执行
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能,操作ISER寄存器,这是在NVIC中断控制器中允许
NVIC_Init(&NVIC_InitStructure); //根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器
可以在NVIC_Init函数(misc.c文件)中知道其操作的是NVIC的IP和ISER寄存器,首先来找一下NVIC是如何定义的(在core_cm3.h中)
以上可知其地址为0xE000E100开始,接下来看《Cortex™-M3技术参考手册》如下图
可以看到SetEnableRegister正好是从0xE000E100开始,而NVIC是指向结构体的指针,这个结构体的成员就是从ISER寄存器开始的有关NVIC的几个寄存器,如下
如图,8个32位的寄存器作使能中断用,其余位没用到所以有个RESERVED0【24】,这里reserved[24]和上面的地址对映好像有点问题,。。。先放着吧。。。。。。。。。。。。。。。。。