OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4074|回复: 4

STM32中按键中断分析(附源码)--备忘

[复制链接]

80

主题

103

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
406
金钱
406
注册时间
2018-11-20
在线时间
25 小时
发表于 2019-8-19 16:25:23 | 显示全部楼层 |阅读模式
  在按键学习中,我们有用到查询的方法来判断按键事件是否发生,这种查询按键事件适用于程序工作量较少的情况下,一旦程序中工作量较大较多,则势必影响程序运行的效率,为了简化程序中控制的功能模块的执行时间,引入中断控制就很有必要,,一旦有中断时间发生,则程序立马跳转到中断向量的执行程序中,执行完成后就恢复到正常的程序状态。
  在STM32F中采用中断控制器NVIC来设定中断。按照中断初始化配置的结构体文件,我们需要在NVIC初始化结构体配置如下:

  1.  void EXti_PB12_Config(void)

  2.   {

  3.   //定义结构体

  4.   GPIO_InitTypeDef GPIO_InitStructure;

  5.   EXTI_InitTypeDef EXTI_InitStructure;

  6.   //开启外设时钟

  7.   RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO, ENABLE);

  8.   NVIC_Configuration();

  9.   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;

  10.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;

  11.   GPIO_Init(GPIOB, &GPIO_InitStructure);

  12.   // 中断向量模式(PB12)

  13.   GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource12);

  14.   //给中断向量成员赋值,这是因为PB12连接到EXTI_Line12;

  15.   EXTI_InitStructure.EXTI_Line = EXTI_Line12;

  16.   //设置中断触发模式,通过这个来不断查询相应的寄存器

  17.   EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;

  18.   //设置触发模式为下降沿触发

  19.   EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;

  20.   //使能

  21.   EXTI_InitStructure.EXTI_LineCmd = ENABLE;

  22.   //调用库函数

  23.   EXTI_Init(&EXTI_InitStructure);

  24.   }

  25.   static void NVIC_Configuration(void)

  26.   {

  27.   //定义结构体

  28.   NVIC_InitTypeDef NVIC_InitStructure;

  29.   //把NVIC中断优先级分组设置为第一组

  30.   NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);

  31.   //PB12配置为EXT1第10-15线的中断向量

  32.   NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQn;

  33.   //设置抢占优先级为0

  34.   NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;

  35.   //设置响应优先级为0

  36.   NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;

  37.   //使能

  38.   NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;

  39.   //调用库函数

  40.   NVIC_Init(&NVIC_InitStructure);

  41.   }
复制代码

  从代码可以看出,我们可以创建两个文件,一个是EXTI_KEY.C和EXTI_KEY.H文件,将上述代码放置于EXTI_KEY.C文件中。我们在配置中断时,需要做以下工作:
  1、使能EXTIx线的时钟和第二功能时钟,前者是具体某个GPIO口的时钟,这里代码是PB12的时钟;
  2、配置EXTIx的中断优先级;主要体现在优先级分组,响应优先级,抢占优先级,优先级分组取值意味着设定了抢占优先级和响应优先级的个数,最大支持16个,也就是说他们之和是16,抢占优先级和响应优先级取值越低,意味着优先级越高,一般来说,优先级高的优先执行。
  3、选定要配置的EXTI的I/0线和I/O的工作模式,这里主要GPIO的初始化配置,以及该引脚挂靠的EXTI线。这里挂靠线为LINE12。
  4、配置EXTI中断线工作模式。这里主要是配置中断触发模式(如上升沿触发,下降沿触发等等)
  在做完初始化工作后,我们发现,其实中断配置的模式很固定化,一般修改值为工作2和3,可以实现不同GPIO口的中断配置和中断优先级配置。
  完成中断初始化配置后,我们需要写入中断服务函数。在这里就要涉及到中断标志位,触发中断和清除中断标志位。其中断服务函数如下:
  1. <p>  void EXTI15_10_IRQHandler(void)</p>
  2. <p>  {</p>
  3. <p>  IF (EXTI_GetITStatus(EXTI_Line12) != RESET) //确保是否产生了中断</p>
  4. <p>  {</p>
  5. <p>  写入要控制的功能;</p>
  6. <p>  EXTI_ClearITPendingBit(EXTI_Line12); //清除中断标志位</p>
  7. <p>  }</p>
  8. <p>  }</p>
复制代码

  在中断服务函数中,我们发现这个模板很固定,其采用的配置和中断配置很相似,唯一的区别就是采用哪个功能引脚配置。
  在这一节中,我们主要是学习如何使用中断。虽说在中断没有学习之前,都想象的难度很大。但是在使用STM32F的库函数编程后,我们发现,类似于这种复杂的编程机器用库函数轻松驾驭。所采用的的模板和格式都可以在官方的库函数中找到原型,方便了程序的编写。
  最后总结一下,中断时打破当前程序的运行,直接执行中断服务函数里面的功能,在中断执行完之后一定要清除中断,这样才能跳出中断,回到之前程序运行的阶段。

32的一些资料供大家餐参考


1小时彻底掌握STM32中断

http://www.makeru.com.cn/live/3523_1666.html?s=45051
游客,如果您要查看本帖隐藏内容请回复


正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

0

主题

17

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
334
金钱
334
注册时间
2020-6-3
在线时间
83 小时
发表于 2020-12-14 20:19:23 | 显示全部楼层
回复 支持 反对

使用道具 举报

0

主题

4

帖子

0

精华

新手上路

积分
22
金钱
22
注册时间
2020-7-6
在线时间
5 小时
发表于 2020-12-20 14:06:10 | 显示全部楼层
谢谢大佬.......
回复 支持 反对

使用道具 举报

0

主题

25

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1324
金钱
1324
注册时间
2011-8-9
在线时间
461 小时
发表于 2020-12-21 11:23:19 | 显示全部楼层
謝謝分享
回复 支持 反对

使用道具 举报

3

主题

23

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1964
金钱
1964
注册时间
2019-11-2
在线时间
305 小时
发表于 2021-11-29 17:57:44 | 显示全部楼层
22222222
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-14 15:05

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表