本帖最后由 szopenmcu 于 2015-4-9 16:02 编辑
第二章 金龙107——EXTI
2.1 EXTI简介:EXTI (External interrupt) 是指外部中断,通过 GPIO 检测输入脉冲,引起中断事件,打断原来的代码执行流程,进入到中断服务函数中进行处理,处理完后,再返回到中断之前的代码中执行。 对于互联型(107系列)产品,外部中断/事件控制器由20个产生事件/中断请求的边沿检测器组成,每个输入线可以独立地配置输入类型(脉冲或挂起)和对应的触发事件(上升沿或下降沿或者双边沿都触发)。每个输入线都可以独立地被屏蔽。挂起寄存器保持着状态线的中断请求。 首先,我们来了解一下什么是中断向量表,Cortex 内核具有强大的异常响应系统,它把能够打断当前代码执行流程的事件分为异常(exception)和中断(interrupt),并把它们用一个表管理起来,编号为 0~15 的称为内核异常,而 16 以上的则称为外部中断(外,相对内核而言),这个表就称为中断向量表。 2.2实验说明:在本实验中,通过按键触发外部中断,改变标志位,实现不同LED闪烁 主要跳线帽:JP4和JP7都接在2-3上 2.3硬件描述:该实验使用了按键S1和S2,以及LED灯
file:///C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp\ksohtml\wps22E.tmp.jpg 2.4程序说明:main函数中首先对系统时钟进行配置,和LED端口以及按键端口配置,接下来对中断进行初始化配置 按键端口配置时,要把按键所使用的端口配置为外部中断输入引脚。外部中断触发引脚需要说明的是STM32F107的所有引脚都可以被配置为外部中断输入引脚,但是在程序中一个外部中断通道上只能使用一个引脚,如果你对一个外部中断通道上配置了两个引脚,则前一个设置会被后面的设置所覆盖。 file:///C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp\ksohtml\wps22F.tmp.jpg 中断配置中,首先也是声明定义结构体,所使用到的函数可以到外设固件函数库中查看说明,详细了解函数的功能。其主要是配置其中断通道和中断优先级 file:///C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp\ksohtml\wps230.tmp.jpg 在NVIC_Configuration(void)函数中调用了NVIC_PriorityGroupConfig()库函数,把 NVIC 中断优先级分组设置为第2 组。我们可以看到NVIC使用中断优先级分组的概念来管理中断优先级,其最大可以可以给多达256个中断向量分配优先级。NVIC又给每个中断赋予先占优先级和次占优先级,关于先占优先级和次占优先级关系的描述如下: ① 拥有较高先占优先级的中断可以打断较低先占优先级的中断。 ② 若两个先占优先级的中断同时挂起,则优先执行次占优先级较高的中断 ③ 若两个挂起的中断两个优先级都一致,则优先执行位于中断向量表中位置较高的中断。 ④ 还有一点很重要,无论何时,次占优先级都不会造成中断嵌套,即是说中断嵌套完全是由先占优先级决定的。 接下来开始向 NVIC 初始化结构体写入参数 .NVIC_IRQChannel = EXTI15_10_IRQn,表示要配置的为 EXTI 第 15~10线的中断向量。这些可写入的参数可以在 stm32f10x.h 文件的 IRQn 类型定义中查找到。 然后配置先占优先级和次占优先级,因为这个工程简单,就直接把它设置 为最高级中断。填充完结构体,最后要调用 NVIC_Init() 函数来向寄存器写入参数。 接下来是外部中断的配置,配置相应的通道和相应的触发方式。 file:///C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp\ksohtml\wps231.tmp.jpg While中判断flag的这个标志位,实现不同的LED的闪烁。
file:///C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp\ksohtml\wps232.tmp.jpg 当按键按下时,程序会自动跳入中断服务程序中,相应的中断服务程序在stm32f10x_it.c中,STM32的中断服务函数也是在启动函数中定义的,分配相应的地址。 我们使用中断函数的时候只需要在stm32f10x_it.c中找到相应的函数,并在里面编写你所需要的程序。 中断服务程序中,首先要判断中断源,然后清除中断标志位(在这里要说的是控制器的一部分中断标志位是由硬件清除的,也就是一旦进入中断,硬件会自动清除相应的中断标志位,不需要代码干预,但是还有一些中断是需要我们编写代码来清除相应的中断标志位。所以具体还要查看参考手册的相关部分),再执行中断处理程序。 file:///C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp\ksohtml\wps233.tmp.jpg 我们在编写中断函数入口时要注意中断函数名的写法,其只有两种命名方法 1-> > EXTI0_IRQHandler ; EXTI Line 0 EXTI1_IRQHandler ; EXTI Line 1 EXTI2_IRQHandler ; EXTI Line 2 EXTI3_IRQHandler ; EXTI Line 3 EXTI4_IRQHandler ; EXTI Line 4 2-> > EXTI9_5_IRQHandler ; EXTI Line 9..5 从中断函数的命名可以看出,在中断线超过4之后都必须写成EXTI9_5_IRQHandler和EXTI15_10_IRQHandler,如果你把他写成EXTI5_IRQHandler、EXTI6_IRQHandler的话编译器不会报错,但是中断程序不能工作,如果你不知道,会让你搞半天也不知道问题出在哪 2.5实验现象:下载程序,复位,程序运行,LD1闪烁;按下S1,LD3闪烁,其它灭;按下S2,LD4闪烁,其它灭。
|