STM32F1 HAL库中断

public:: true

  • NVIC

    • Nested vectored interrupt controller,嵌套向量中断控制器,属于Cortex-M3内核
    • NVIC支持:256个中断(16内核 + 240外部),支持:256个优先级,允许裁剪
  • [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nfcEe91L-1691055258639)(../assets/image_1690951619895_0.png)]{:height 143, :width 361}

  • [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eDyL7thP-1691055258642)(../assets/image_1690951646444_0.png)]

  • 中断向量表

    • 定义一块固定的内存,以4字节对齐,存放各个中断服务函数程序的首地址,其位置在启动文件.s中,发生中断时,CPU会自动执行中断函数
  • NVIC相关寄存器

    • 中断使能寄存器(ISER)Interrupt set-enable registers
      logseq.order-list-type:: number
    • 中断除能寄存器(ICER)Interrupt clear-enable registers
      logseq.order-list-type:: number
    • 应用程序中断及复位控制寄存器(AIRCR)
      logseq.order-list-type:: number
      • AIRCR为异常模型提供优先级分组控制,为数据访问提供端序状态,并对系统进行重置控制。
    • 中断优先级寄存器(IPR)Interrupt priority registers
      logseq.order-list-type:: number
    • [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DEwTqvEH-1691055258643)(../assets/image_1690952186761_0.png)]
  • STM32中断优先级概念

      1. 抢占优先级:高抢占优先级可以打断正在执行的低抢占优先级中断
    • 2.响应优先级:当抢占优先级相同时,响应优先级高的先执行,但是不能互相打断
      1. 抢占和响应都相同的情况下,自然优先级越高的,先执行
      1. 自然优先级:中断向量表的优先级
      1. 数值越小,表示优先级越高
    • [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1shVrGj3-1691055258644)(../assets/image_1690952998929_0.png)]
  • NVIC 的使用

    • 1、设置优先级分组(AIRCR[10:8]) [[$green]]^HAL_NVIC_SetPriorityGrouping^
    • 2、设置中断优先级(IPRx bit[7:4])[[$green]]^HAL_NVIC_SetPriority^
    • 3、使能中断(ISERx)[[$green]]^HAL_NVIC_EnableIRQ^
  • EXTI

  • External(Extended) interrupt/event Controller,外部(扩展)中断事件控制器

  • 包含20个产生事件/中断请求的边沿检测器,即总共:20条EXTI线(F1)

  • 中断:要进入NVIC,有相应的中断服务函数,需要CPU处理

  • 事件:不进入NVIC,仅用于内部硬件自动控制的,如:TIM、DMA、ADC
    在这里插入图片描述

  • EXTI工作原理

  • [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BNIiJqvD-1691055258646)(../assets/image_1690953768185_0.png)]

  • 1、中断屏蔽寄存器(EXTI_IMR)

    • [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-z8E5YiYb-1691055258647)(../assets/image_1690953933551_0.png)]
  • 2、事件屏蔽寄存器(EXTI_EMR)

    • [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HzYY6drt-1691055258647)(../assets/image_1690954035089_0.png)]
  • 3、上升沿触发选择寄存器(EXTI_RTSR)

    • [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-czndlOfa-1691055258648)(../assets/image_1690954078274_0.png)]
  • 4、下降沿触发选择寄存器(EXTI_FTSR)

    • [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0RqqR8u9-1691055258649)(../assets/image_1690954109619_0.png)]
  • 5、软件中断事件寄存器(EXTI_SWIER)

    • [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uCZLP1hC-1691055258650)(../assets/image_1690954179523_0.png)]
  • 6、挂起寄存器(EXTI_PR)

  • [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MZmOmwLw-1691055258651)(../assets/image_1690954222687_0.png)]

  • EXTI和IO映射关系

    • AFIO(F1)
      • Alternate Function IO,即复用功能IO,主要用于重映射和外部中断映射配置
  • AFIO_EXTICR14,配置EXTI中断线015对应具体哪个IO口

  • AFIO_EXTICR1(0-3)AFIO_EXTICR2(4-7)AFIO_EXTICR3(8-11)

  • 配置AFIO寄存器之前要使能AFIO时钟,方法如下:

  • __HAL_RCC_AFIO_CLK_ENABLE(); 对应RCC_APB2ENR寄存器 位0
    -在这里插入图片描述

  • [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kDKXvtdc-1691055258653)(../assets/image_1690954965407_0.png)]{:height 127, :width 96}
    在这里插入图片描述

  • 如何使用中断

  • [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4kUhNH5j-1691055258654)(../assets/image_1690955084839_0.png)]

  • 1、使能GPIO时钟_HAL_RCC_GPIOx_CLK_ENABLE

  • 2、设置GPIO口输入模式(上拉、下拉、浮空)

  • 3、使能AFIO或SYSCFG时钟

  • 4、设置EXTI与IO口对应关系

  • 5、设置EXTI屏蔽,上下沿触发(IMR、 RTSR/FTSR)

    • HAL_GPIO_Init,一步到位

      ```c
      
      /**
       *  description: 中断初始化
       *  return {*}
       */
      void exti_led_init(void)
      {
          GPIO_InitTypeDef gpio_init_structure;
          
          __HAL_RCC_GPIOA_CLK_ENABLE();
          gpio_init_structure.Pin = KEY_PIN;//KEY_PIN;
          gpio_init_structure.Mode = GPIO_MODE_IT_RISING;//中断上升沿触发
          gpio_init_structure.Pull = GPIO_PULLDOWN;//下拉
          HAL_GPIO_Init(KEY_PIN_PORT, &gpio_init_structure);//初始化
          HAL_NVIC_SetPriority(EXTI0_IRQn, 2, 2);//设置中断优先级
          HAL_NVIC_EnableIRQ(EXTI0_IRQn);//使能中断
      }
      ```
      
    1. 设置NVIC(设置优先级分组、设置优先级、使能中断)
    • HAL_NVIC_SetPriorityGrouping,此函数仅需设置一次!
    • HAL_NVIC_SetPriority
      -HAL_NVIC_EnableIRQ
    1. 设置中断服务函数(编写对应中断的中断服务函数!清中断标志!)
    • 编写:EXTIx_IRQHandler,中断服务函数,清中断标志!
    • 中断发生时,会先调用中断服务函数,中断服务函数调用中断处理函数,中断处理函数内部会清除中断标志位,然后调用中断回调函数。
    • /**
       *  description: 中断服务函数
       *  return {*}
       */
      void EXTI0_IRQHandler(void) //中断服务函数
      {
          HAL_GPIO_EXTI_IRQHandler(KEY_PIN);  //中断处理函数
         // HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_4);
          __HAL_GPIO_EXTI_CLEAR_IT(KEY_PIN);  /* HAL库默认先清中断再处理回调,退出时再清一次中断,避免按键抖动误触发 */
      }
      void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) //中断回调函数
      {
          
           if (HAL_GPIO_ReadPin(KEY_PIN_PORT, KEY_PIN) == GPIO_PIN_SET)
            {
                if (HAL_GPIO_ReadPin(KEY_PIN_PORT, KEY_PIN) == GPIO_PIN_SET)
                {
                    HAL_GPIO_TogglePin(LED_GPIO_Port, LED_Pin);
                    while (HAL_GPIO_ReadPin(KEY_PIN_PORT, KEY_PIN) == GPIO_PIN_RESET);
                }
            }
          
      }
      

-STM32仅有:EXTI0~4、EXTI9_5、EXTI15_10,7个外部中断服务函数

  • [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5qJBG0kP-1691055258654)(../assets/image_1691052423626_0.png)]{:height 213, :width 410}

  • 通用外设驱动模型(四步法)

  • 1、初始化 时钟设置、参数设置、IO设置、中断设置(开中断、设NVIC)(可选)

  • 2、读函数(可选) 从外设读取数据(可选)

  • 3、写函数(可选)往外设写入数据(可选)

  • 4、中断服务函数(可选)根据中断标志,处理外设各种中断事务(可选)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值