欢迎光临散文网 会员登陆 & 注册

EXTI中断使用

2023-08-06 14:24 作者:赵青云灬  | 我要投稿


EXTI中断初始化

  1. GPIO端口初始化(使用输入模式)。

  2. 打开AFIO时钟。AFIO的时钟接在APB2上,使用函数RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE)打开时钟。

  3. EXTI初始化。

  • 选择GPIO端口作为EXTI的线路。使用函数GPIO_EXTILineConfig(uint8_t GPIO_PortSource, uint8_t GPIO_PinSource) 。例如:    


      函数说明


  • 定义结构体变量。与GPIO的初始化类似,EXTI的初始化也需要定义结构体变量。结构    体名为EXTI_InitTypeDef,一般命名为EXTI_InitStruct。同样,该结构体变量里有四个成员,  对四个成员分别进行赋值即可。例如图。


注意, .EXTI_Trigger 该成员控制中断的触发条件,有三个可选项:上升沿触发、下降沿触发、上升下降沿触发


  • EXTI初始化。直接使用函数 EXTI_Init(&EXTI_InitStruct); 对EXTI进行初始化。

NVIC

  1. 选定NVIC的优先级模式。NVIC的优先级分为抢占优先级响应优先级。抢占优先级高的中断程序先执行,若抢占优先级相同,则比较响应优先级。优先级寄存器有四位,存在四种分配模式,按需选择。

       优先级可选模式:

2.定义结构体变量与GPIO、EXTI类似,定义一个结构体变量以便进行初始化。

其中.NVIC_IRQChannelPreemptionPriority与.NVIC_IRQChannelSubPriority分别为抢占优先级与响应优先级。不同的模式存在不同的赋值,但数字越小优先级越高。

3.初始化。

中断函数

中断函数的定义可以在startup文件中找到。由于在起始文件中有所定义,所以在模块化编程时可以不在头文件中声明即可在主函数中使用。

  1. 找到对应中断函数。例如EXTI_Line0对应的中断函数为EXTI0_IRQHandler()。以此类推。

    注意:

    (1)中断函数的名字不可变更。

    (2)中断函数没有返回值,括号内也没有参数。

    (3)10~15号端口使用同一个中断函数 EXTI15_10_IRQHandler() 。

  2. 进行 if 判断(有时可有可无)。主要针对 EXTI15_10_IRQHandler() 。对于10~15号端口引起的中断,避免不同端口进入同一程序造成混乱,可以进行 if 判断。如果对应端口的标志位为SET,证明时该端口引发的中断,可以进入相应的程序。

其中 EXTI_GetITStatus(uint32_t EXTI_Line); 用于检测中断标志位,返回值为 SET或RESET

注意:该函数只能在中断函数中使用。

同时 EXTI_GetFlagStatus(uint32_t EXTI_Line); 有相同的功能,但在外部或中断函数内都可使用。建议在外部时使用该函数,在中断内部时用 EXTI_GetITStatus(uint32_t EXTI_Line); 

3.标志位清除。用软件对标志位进行清除,防止中断永远进行下去。

说明:

1.对于不同GPIO的相同端口(如GPIOA的Pin1和GPIOB的Pin1),不能同时使用中断函数。

EXTI中断使用的评论 (共 条)

分享到微博请遵守国家法律