打印
[STM32F0]

关于STM32F中按键中断分析

[复制链接]
1641|30
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
cr315|  楼主 | 2023-6-8 10:16 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
在按键学习中,我们有用到查询的方法来判断按键事件是否发生,这种查询按键事件适用于程序工作量较少的情况下,一旦程序中工作量较大较多,则势必影响程序运行的效率,为了简化程序中控制的功能模块的执行时间,引入中断控制就很有必要,,一旦有中断时间发生,则程序立马跳转到中断向量的执行程序中,执行完成后就恢复到正常的程序状态。
       在STM32F中采用中断控制器NVIC来设定中断。按照中断初始化配置的结构体文件,我们需要在NVIC初始化结构体配置如下:
      void EXti_PB12_Config(void)
{
  //定义结构体
  GPIO_InitTypeDef GPIO_InitStructure;
        EXTI_InitTypeDef EXTI_InitStructure;
  //开启外设时钟
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB |         RCC_APB2Periph_AFIO, ENABLE);
  NVIC_Configuration();
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
  GPIO_Init(GPIOB, &GPIO_InitStructure);      
  //   中断向量模式(PB12)
  GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource12);
//给中断向量成员赋值,这是因为PB12连接到EXTI_Line12;
EXTI_InitStructure.EXTI_Line = EXTI_Line12;
//设置中断触发模式,通过这个来不断查询相应的寄存器
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
//设置触发模式为下降沿触发
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
//使能
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
//调用库函数
EXTI_Init(&EXTI_InitStructure);
}


static void NVIC_Configuration(void)
{
      //定义结构体
         NVIC_InitTypeDef NVIC_InitStructure;
      //把NVIC中断优先级分组设置为第一组
         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
     //PB12配置为EXT1第10-15线的中断向量
         NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQn;
     //设置抢占优先级为0
         NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
     //设置响应优先级为0
         NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
    //使能
         NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    //调用库函数
         NVIC_Init(&NVIC_InitStructure);
}
        从代码可以看出,我们可以创建两个文件,一个是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口的中断配置和中断优先级配置。
    完成中断初始化配置后,我们需要写入中断服务函数。在这里就要涉及到中断标志位,触发中断和清除中断标志位。其中断服务函数如下:
void EXTI15_10_IRQHandler(void)  

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

使用特权

评论回复
沙发
saservice| | 2023-6-10 17:03 | 只看该作者
STM32中为什么按键中断程序响应很慢

使用特权

评论回复
板凳
ulystronglll| | 2023-6-10 17:43 | 只看该作者
按键通常是机械式的,会产生一些抖动,因此建议使用软件去除抖动。

使用特权

评论回复
地板
AloneKaven| | 2023-6-10 23:04 | 只看该作者
saservice 发表于 2023-6-10 17:03
STM32中为什么按键中断程序响应很慢

软件去抖延时加多了?

使用特权

评论回复
5
claretttt| | 2023-6-13 22:09 | 只看该作者
外部中断 如何防抖动?               

使用特权

评论回复
6
Stahan| | 2023-6-13 22:54 | 只看该作者
还是硬件消抖比较好用

使用特权

评论回复
7
everyrobin| | 2023-6-14 13:09 | 只看该作者
在STM32的代码中,需要先初始化相应的GPIO口,并配置它为输入模式。然后在代码中使能中断,并设置中断优先级和触发方式。最后,在中断处理函数中编写相应的代码实现中断功能。

使用特权

评论回复
8
maqianqu| | 2023-6-14 18:04 | 只看该作者
在程序中,需要对外部中断进行初始化和配置。可以通过HAL库中提供的相关函数来完成,例如:HAL_NVIC_SetPriority()、HAL_NVIC_EnableIRQ()等函数。

使用特权

评论回复
9
abotomson| | 2023-6-16 12:31 | 只看该作者
如果按键需要进行消抖处理,可以在电路中添加滤波电容或者利用软件延时来实现。

使用特权

评论回复
10
1988020566| | 2023-6-16 12:38 | 只看该作者
在使用外部中断检测按键时,需要合理设置中断优先级、清除中断标志位等操作,以保证按键正常工作。

使用特权

评论回复
11
lzbf| | 2023-6-16 22:08 | 只看该作者
STM32如何实现连续按键              

使用特权

评论回复
12
Undshing| | 2023-6-16 22:29 | 只看该作者
saservice 发表于 2023-6-10 17:03
STM32中为什么按键中断程序响应很慢

是你程序写的有问题吧

使用特权

评论回复
13
AloneKaven| | 2023-6-17 23:23 | 只看该作者
saservice 发表于 2023-6-10 17:03
STM32中为什么按键中断程序响应很慢

是不是按键延时的问题啊

使用特权

评论回复
14
Jacquetry| | 2023-6-18 22:33 | 只看该作者
加个软件延时就可以了

使用特权

评论回复
15
robertesth| | 2023-6-19 13:44 | 只看该作者
在STM32中,可以通过外部中断来实现按键的检测和处理。

使用特权

评论回复
16
lzbf| | 2023-6-19 13:51 | 只看该作者
两个按键怎么用同一个外部中断?              

使用特权

评论回复
17
kkzz| | 2023-6-19 14:37 | 只看该作者
stm32单片机如何实现一个按键切换两个程序

使用特权

评论回复
18
Henryko| | 2023-6-19 22:56 | 只看该作者
Stahan 发表于 2023-6-13 22:54
还是硬件消抖比较好用

硬件消抖会增加成本

使用特权

评论回复
19
1988020566| | 2023-6-21 13:14 | 只看该作者
在处理按键中断时,建议使用低优先级任务或者直接在中断处理函数中完成,以免影响其他任务的执行。

使用特权

评论回复
20
febgxu| | 2023-6-21 14:29 | 只看该作者
需要将按键与STM32的相应IO口连接起来,并设置相应的引脚模式(输入模式或者上拉/下拉输入模式),以保证按键正常工作。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1392

主题

4445

帖子

0

粉丝