smt32中断大致了解(定时器和外部中断)

tm32的中断比起51丰富很多,部分如下

https://images2015.cnblogs.com/blog/1104670/201707/1104670-20170705154537675-1961976416.jpg

关于外部中断:

GPIO 的管教 GPIOx.0~GPIOx.15(x=A,B,C,D,EF,G)分别对应中断线 0~15。这样每个中
断线对应了最多 7 IO 口,以线 0 为例:它对应了 GPIOA.0GPIOB.0GPIOC.0GPIOD.0
GPIOE.0GPIOF.0GPIOG.0。中断线每次只能连接到 1 IO 口上,另外外部中断需要使能AFIO时钟(也算是端口映射的操作),其中5-910-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文件)中知道其操作的是NVICIPISER寄存器,首先来找一下NVIC是如何定义的(在core_cm3.h中)

https://images2015.cnblogs.com/blog/1104670/201707/1104670-20170705170734894-291662341.jpg

以上可知其地址为0xE000E100开始,接下来看《Cortex™-M3技术参考手册》如下图

https://images2015.cnblogs.com/blog/1104670/201707/1104670-20170705171123034-1493197841.jpg

可以看到SetEnableRegister正好是从0xE000E100开始,而NVIC是指向结构体的指针,这个结构体的成员就是从ISER寄存器开始的有关NVIC的几个寄存器,如下

https://images2015.cnblogs.com/blog/1104670/201707/1104670-20170705171949831-1171326728.jpg

如图,832位的寄存器作使能中断用,其余位没用到所以有个RESERVED024】,这里reserved[24]和上面的地址对映好像有点问题,。。。先放着吧。。。。。。。。。。。。。。。。。

 

 

猜你喜欢

转载自blog.csdn.net/sinat_30457013/article/details/89383264