关于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 上的中断标志位
}
}

完成了中断服务函数方面的书写,中断方面也就基本没有问题了。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

服务函数

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 



原文地址:https://www.cnblogs.com/6F3BUK/p/14370211.html