1、中断类型从以前的串行端口实验可以看出,STM32共分为内部中断和外部中断,内部和外部配置差异不是很大,外部中断只是增加了一步,需要通过
gpio _ extilineconfig (uint8_ TGP io _ port source,uint8_t GPIO_PinSource )函数(在stm32f10x_gpio.h中)
将外部中断源挂载到中断线上即可。
2、外部中断配置流程1、开启时钟(必须开启复用时钟) )。
2、用于初始化的GPIO端口
3、将使用的GPIO端口挂载到中断线上的gpio _ extilineconfig (uint8_ TGP io _ port source,uint8_t GPIO_PinSource )函数上
4、配置exti_init(/中断线、中断的类型、触发方式
5、设置NVIC_Init ()//中断优先级
6、创建中断服务函数
3、外部中断主要配置说明1)NVIC
如果外部满足中断条件,开始执行中断服务函数,同时发生多个中断,则按照NVIC中设定的优先顺序开始执行中断函数。NVIC分组分析:NVIC的库函数和结构体定义都在misc文件中。
NVIC的组分为两个组,但优先级总数不变。 都是16组,号码越小优先顺序越高
=====================================nvic _ irqchannelsubpriority|description====================0 bitsforpre-emption priority|||4 bitsforsubpriority---------------------------- -。 IC _ priority group _1|0-1|0-7|1bitsforpre-emption priority|||3 bitsforsubpriority------------。 IC _ priority group _2|0-3|0-3|2bitsforpre-emption priority|||2 bitsforsubpriority---------------------- -。 IC _ priority group _3|0-7|0-1|3bitsforpre-emption priority|||1 bitsforsubpriority------------。 IC _ priority group _4|0- 15|0|4 bitsforpre-emption priority||0bitsforsubpriority========
第2列: nvic _ irqchannelpreemptionpriority优先权
列NVIC_IRQChannelSubPriority响应的优先级
)1) 3358www.Sina.com/)指该中断的抢占能力,假设为抢占优先级,则该中断为抢占优先级越高的函数两个抢占优先级这样的中断同时到达时,响应优先级被比较,越高越先反应; 两个抢占优先级这样的中断不能同时到达。 无论响应优先级如何,前一个中断都不会中断,并且在运行前一个中断之前不会运行下一个中断。
)2)打断优先级低)同时到达的中断的响应前后。 当两个响应优先级的中断同时到达时,响应的优先级越高,越早反应。
抢占优先级一样
因为中断服务函数已经在“startup_stm32f10x_hd.s”的第264-323行中声明,所以直接查找需要哪个中断就可以了。 要说配置EXTI时使用的中断线是哪一个,中断服务函数选择哪一个。
我个人建议您将所有中断服务函数都写在“stm32f10x_it.c”中,并对原来设置的. c文件进行注释。 这样,中断服务函数一目了然,每个子程序也可以看到注释。
4、代码示例/**main.c中需要添加*/nvic _ prioritygroupconfig (nvic _ priority group _2); NVIC中断包2:2位优先权、2位响应优先级LED_Init (; KEY_Init (; EXTI_Config (; /**EXTI和NVIC配置函数*/voidexti_config(void ) exti _ inittypedefexti _ init structure; nvic _ inittypedefnvic _ init structure; KEY_Init (; //配置先使用的密钥RCC _ AP B2 periphclockcmd (RCC _ AP B2 per iph _ afio,ENABLE )//必须复用时钟//KEY1 PE3的上升沿优先顺序21 gpio _ afio exti _ init structure.exti _ line=exti _ line 3; exti _ init structure.exti _ mode=exti _ mode _ interrupt; exti _ init structure.exti _ trigger=exti _ trigger _ rising; exti _ init (exti _ init结构; nvic _ init structure.nvic _ IRQ channel=ext i3 _ irqn; nvic _ init structure.nvic _ irqchannelpreemptionpriority=0x02; nvic _ init structure.nvic _ irqchannelsubpriority=0x 01; nvic _ init structure.nvic _ irqchannelcmd=enable; nvic _ init (nvic _ init结构; (/**中断服务函数(*///KEY1中断服务函数voidextI3_IRQHandler ) void ) Delay_ms ) 10; //消除抖动if(key1==1) {LED1=! LED1; } exti _ clearitpendingbit (exti _ line3); 清除LINE3的中断标志位}