关于stm32系统中断理解
作者:互联网
stm32具有很强大的中断系统,一般开发板上自带的内部中断系统,RTC、USART、定时器中断比较常用,而更强大的在于,stm32可通过不同的IO,连接外设产生中断
而由于,IO中断的不常用,也往往会使初学者迷惑。首先要知道的是IO与中断线的对应关系.
不同的开发板可根据阅读不同的参考手册,但基本理解上都是大同小异,了解对应关系后就是对函数的理解与使用了。具体如何通过一个中断线控制多个IO也是在具体函数中表现出来的。
一、首先是对中断初始化
1 void EXTIX_Init(void) 2 { 3 EXTI_InitTypeDef EXTI_InitStrue; 4 NVIC_InitTypeDef NVIC_InitStrue; 5 6 RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);//ÍⲿÖжÏÐèҪʹÄÜAFIOʱÖÓ 7 8 //B1 PA0-EXTI0 PA0¶Ë¿ÚÖжÏÏß¼°Öжϳõʼ»¯ÅäÖà 9 GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource0); 10 11 EXTI_InitStrue.EXTI_Line=EXTI_Line0; 12 EXTI_InitStrue.EXTI_Mode=EXTI_Mode_Interrupt; 13 EXTI_InitStrue.EXTI_Trigger=EXTI_Trigger_Falling;//ϽµÑØ´¥·¢ 14 EXTI_InitStrue.EXTI_LineCmd=ENABLE; 15 EXTI_Init(&EXTI_InitStrue); 16 17 NVIC_InitStrue.NVIC_IRQChannel=EXTI0_IRQn;//ʹÄÜ°´¼üËùÔÚµÄÍⲿÖжÏͨµÀ 18 NVIC_InitStrue.NVIC_IRQChannelPreemptionPriority=2;//ÇÀÕ¼ÓÅÏȼ¶2 19 NVIC_InitStrue.NVIC_IRQChannelSubPriority=2;//×ÓÓÅÏȼ¶2 20 NVIC_InitStrue.NVIC_IRQChannelCmd=ENABLE;//ʹÄÜÍⲿÖжÏͨµÀ 21 NVIC_Init(&NVIC_InitStrue); 22 }
这里是通过IO_PA0所带按键控制中断产生。
这里主要调用了三个函数
1.void GPIO_EXTILineConfig(uint8_t GPIO_PortSource, uint8_t GPIO_PinSource) 代码实现第9行 前一个参数IO接口组,后一个参数是具体接口。
2.EXTI_Init(); 来看看结构体所需要配置的参数
1 typedef struct 2 { 3 uint32_t EXTI_Line; /*!< Specifies the EXTI lines to be enabled or disabled. 4 This parameter can be any combination of @ref EXTI_Lines */ 5 6 EXTIMode_TypeDef EXTI_Mode; /*!< Specifies the mode for the EXTI lines. 7 This parameter can be a value of @ref EXTIMode_TypeDef */ 8 9 EXTITrigger_TypeDef EXTI_Trigger; /*!< Specifies the trigger signal active edge for the EXTI lines. 10 This parameter can be a value of @ref EXTIMode_TypeDef */ 11 12 FunctionalState EXTI_LineCmd; /*!< Specifies the new state of the selected EXTI lines. 13 This parameter can be set either to ENABLE or DISABLE */ 14 }EXTI_InitTypeDef;
第一个参数是中断线的标号,取值范围为EXTI_Line0~EXTI_Line15,第二个参数是中断模式, 可选值为中断 EXTI_Mode_Interrupt 和事件 EXTI_Mode_Event,第三个参数是触发方式,可以是下降沿触发 EXTI_Trigger_Falling,上升沿触发 EXTI_Trigger_Rising,或者任意电平(上升沿和下降沿) 触发EXTI_Trigger_Rising_Falling。最后一个参数就是使能中断线了。
3.NVIC_Init(); 设置好了中断的触发模式等初始化参数。 既然是外部中断, 涉及到中断我们当然还要设置 NVIC 中断优先级。 这个在前面已经讲解过.
具体的内置参数不再介绍,谈谈所配置时所要注意的事项。
1.第一个参数,对于外部中断 对应关系不再像上一个函数与中断线是一一对应,而USART、RTC、定时器更是需要单独记忆。下面给出一些总结
对于外部中断 可选择为EXTI0_iRQn、EXTI1_IRQn、EXTI2_IRQn、EXTI3_IRQn、EXTI4_IRQn、EXTI9_5IRQn、EXTI15_10IRQn
通用定时器 TIM2_IRQn~TIM7_ TIM2_IRQn . RTC : RTCAlarm_IRQn . USART : USART1_IRQn USART2_IRQn USART3_IRQn .
其实开发板所带的库函数开发指南在STM32FXXXx.h 这种函数头文件应该都可以找到,或者直接查看 goto definition NVIC_Init() 然后继续 go to definition 第一个入口参数 然后再这个文件库里面找。
2. 第二第三的参数 抢占与子优先级应根据之前 中断优先级分组具体填写。
二.、中断服务函数
中断服务函数名称也是系统定义好的,学者可通过找Startup_stm32xx.s 知道了名称其实也就可以写出服务 只需要把中断名称中的 IRQn改成IRQHandler
举个例子 void EXTI1_IRQHandler(void) 这个就是 EXTI_IRQn的中断服务函数。
常用的中断服务函数格式为:
void EXTI3_IRQHandler(void)
{
if(EXTI_GetITStatus(EXTI_Line3)!=RESET)// 判断某个线上的中断是否发生
{
中断逻辑…
EXTI_ClearITPendingBit(EXTI_Line3); // 清除 LINE 上的中断标志位
}
}
。
完成了中断服务函数方面的书写,中断方面也就基本没有问题了。
服务函数
标签:NVIC,中断,InitStrue,stm32,理解,IRQn,参数,EXTI 来源: https://www.cnblogs.com/6F3BUK/p/14370211.html