hal库学习笔记(三):外部中断

目录

硬件知识

一、中断

二、按键中断的配置

函数库知识

外部中断回调函数

代码编写

一、用外部中断开关灯

二、两键控两灯

硬件知识

一、中断

①基本概念

中断就是芯片运行程序时,停一下,去干别的

有些功能很重要,但是放在主程序里面占位置

故可以放在中断函数中,需要的时候,停一下,来做这个比较重要的事情

②优先级

当中断不止一个的时候,设置优先级来排运行先后

  • 抢占优先级
    • 优先级高可打断优先级低的
      • 1级优先>2级优先  
      • 主程序优先级为最低      
    • 相同不打断

  • 子优先级
    • 两个中断(抢占优先级相同)都在等待执行,优先处理子优先级高的

  • 芯片用四位二进制存储优先级
    • 用2位表示抢占优先级,则中断优先级为0~3
      • 00~11 →0~2^2 - 1
    • 用3位表示抢占优先级,则中断优先级为0~7
      • 000~111 →0~2^3 - 1
    • 用4位表示抢占优先级,则中断优先级为0~15
      • 000~111 →0~2^4 - 1
    • 有部分中断优先级大于15,应该是系统自己存到别的地方了

二、按键中断的配置

外部中断一般指由GPIO引脚电平变化产生的中断

按键中断是我自己喜欢这么叫

①参数配置如下

hal库学习笔记(三):外部中断_第1张图片

B0调至外部中断模式

hal库学习笔记(三):外部中断_第2张图片

有六种触发方式,我们先关注前三种

  • Rising触发:就是电平升高时触发中断
  • falling触发:就是电平降低时触发中断
  • 第三个都触发

注:前面两个词都是我念的顺口编出来的

回忆笔记二中按键设置hal库学习笔记(三):外部中断_第3张图片

我们共地解法,B0调为上拉,按下后B0变为低电平

因此我们选择Falling触发,当B0电平降低(按键按下后)触发中断

②优先级设置hal库学习笔记(三):外部中断_第4张图片

函数库知识

外部中断回调函数

函数来源于"stm32f1xx_hal_gpio.c"

①概念

重中之重了,值得单用一个大写数字

这个函数表示你外部中断是为了干啥

由左边的函数界面快速找到这个函数原型hal库学习笔记(三):外部中断_第5张图片

  • __weak void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin);
    • __weak :弱定义,意思就是你可以写个新函数把他替掉
    • 看名字也知道这是外部中断专属了
      • EX:external

 ②如何编写

继续扒官方例程hal库学习笔记(三):外部中断_第6张图片

hal库学习笔记(三):外部中断_第7张图片

官方给的例程如下

void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
  if (GPIO_Pin == GPIO_PIN_0)
  {
    /* Toggle LED3 */
    BSP_LED_Toggle(LED3);
  }
}

这个程序流程图也很简单,目的一看便知

是不是0号引脚,是就翻转

此外中断回调函数不需要声明(因为弱定义的时候已经声明过了,问题不大)

再然后我们写个模板让keil5记住吧

void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
  if (GPIO_Pin == GPIO_PIN_0)
  {
    /* 中断后做点什么 */
   
  }
}

hal库学习笔记(三):外部中断_第8张图片

 hal库学习笔记(三):外部中断_第9张图片

最后注意关闭文件时不要保存,别把人家例程搞乱了

还有这个过程就是让A5闪烁,如果你担心灯或者板子坏了什么的,就直接下这个工程检测

代码编写

一、用外部中断开关灯

①初始化配置

配好一个按键&一个灯

②文件配置

hal库学习笔记(三):外部中断_第10张图片

③代码编写

在主函数中找到他给你留的位置,模板套进去

再写个翻转函数进去

void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
  if (GPIO_Pin == GPIO_PIN_0)
  {
    /* 中断后做点什么 */

    Red_Toggle();
  }
}

 二、两键控两灯

①先初始化

A1,A5小灯

(手快点错了,问题不大)

hal库学习笔记(三):外部中断_第11张图片

 B0,B1按键hal库学习笔记(三):外部中断_第12张图片

开启中断hal库学习笔记(三):外部中断_第13张图片

 ②编写程序

 回调函数

void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
  if (GPIO_Pin == GPIO_PIN_0)
  {
    /* 中断后做点什么 */

		Green_Toggle() ;

    
  }
	 else if (GPIO_Pin == GPIO_PIN_1)
  {
    /* 中断后做点什么 */
		Green_Toggle();
  }

}

你可能感兴趣的:(32学习笔记,学习)