stm32——HAL库实现外部中断

学习目标:掌握EXIT实现LED灯的亮灭


学习内容:

初步掌握中断优先级的抢占优先级和次优先级


学习产出:

在学习过程中要正确配置按键和LED灯的初始化配置,尤其关注按键的初始化:按键开始时的状态是决定这个实验能否成功的重要关键

例:

        对这个按键而言:KEY0初始化时应设置为下降沿触发和上拉,KEY1.2.3初始化设置为上升沿触发和下拉。

配置好GPIO后应该配置NVIC设置所有中断的抢占优先级和次优先级:

这里配置为 2位抢占优先级,2位次优先级。具体配置如上图;

配置好后就可以生成代码了,软件会自动配置GPIO初始化、NVIC的配置和中断函数的配置,我们只需要实现中断回调函数(HAL_GPIO_EXTI_Callback())即可,这个函数库函数本身是有的,但是我们需要重新配置,所以函数名不能修改。__weak void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) 这是库函数中定义的函数,__weak是一个弱函数声明,表明这个函数如果用户没有重新定义,那么就使用这个函数,如果用户定义了,那么就使用用户定义的函数。

最后完成HAL_GPIO_EXTI_Callback()函数的配置就可以实现了

void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
	if( GPIO_Pin == KEY0_Pin)
		{
			HAL_GPIO_TogglePin(LED2_GPIO_Port, LED2_Pin);
			HAL_Delay(500);  // 延时是为了消除抖动
		}
		// 当按下按键2时使LED3反转
		else if(GPIO_Pin == KEY1_Pin)
		{
			
			HAL_GPIO_TogglePin(LED3_GPIO_Port, LED3_Pin);
			HAL_Delay(500);
		}
		// 当按下按键3时使LED2,LED3同时反转
		else if(GPIO_Pin == KEY2_Pin)
		{
			HAL_GPIO_TogglePin(LED2_GPIO_Port, LED2_Pin);
			HAL_GPIO_TogglePin(LED3_GPIO_Port, LED3_Pin);
			HAL_Delay(500);
		}
		// 当按下按键4时使LED2,LE3D同时关闭
		else if(GPIO_Pin == KEY3_Pin)
		{
			__HAL_GPIO_EXTI_GENERATE_SWIT(LED3_Pin);
            HAL_Delay(500);
		}
}

 这里实现后还有一个小问题:虽然我们在代码中使用延时函数进行了消抖,但是还是会有抖动,这是由于【void HAL_GPIO_EXTI_IRQHandler(uint16_t GPIO_Pin)】库函数本身的写法有些问题

void HAL_GPIO_EXTI_IRQHandler(uint16_t GPIO_Pin)
{
  /* EXTI line interrupt detected */
  if (__HAL_GPIO_EXTI_GET_IT(GPIO_Pin) != 0x00u)  // 检验中断挂起位
  {
    __HAL_GPIO_EXTI_CLEAR_IT(GPIO_Pin);  // 清除标志位
    HAL_GPIO_EXTI_Callback(GPIO_Pin);  // 执行回调函数
  }
}

这里先清除标志位再执行回调函数(这个在其他时候都是没问题的,是为了让硬件更快的响应操作),会出现执行后由于硬件抖动原因,标志位再次被置位,当延时结束后,NVIC检测到又出现中断,就会再次执行,所以在这里应该将这两句对调。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值