• STM32G070RBT6基于Arduino框架GPIO外部中断


    STM32G070RBT6基于Arduino框架GPIO外部中断


    📚外部中断线与IO引脚对应关系

    📗STM32供IO使用的中断线只有16个,但是STM32G070RBT6系列的IO口多达59个,那么中断线怎么跟IO口对应上呢?下图就是STM32的外部中断线和IO口的对应关系:

    在这里插入图片描述

    • 📖对于每个中断线,我们可以设置相应的触发方式(上升沿触发,下降沿触发,边沿触发)以及使能。
    • 🎈相关中断线在Arduino中定义在:C:\Users\Administrator\AppData\Local\Arduino15\packages\STMicroelectronics\hardware\stm32\2.3.0\system\Drivers\STM32G0xx_HAL_Driver\Inc\stm32g0xx_ll_exti.h头文件中。
    #define LL_EXTI_CONFIG_LINE0               ((0uL << LL_EXTI_REGISTER_PINPOS_SHFT)  | 0U)  /*!< EXTI_POSITION_0  | EXTICR[0] */
    #define LL_EXTI_CONFIG_LINE1               ((8uL << LL_EXTI_REGISTER_PINPOS_SHFT)  | 0U)  /*!< EXTI_POSITION_8  | EXTICR[0] */
    #define LL_EXTI_CONFIG_LINE2               ((16uL << LL_EXTI_REGISTER_PINPOS_SHFT) | 0U)  /*!< EXTI_POSITION_16 | EXTICR[0] */
    #define LL_EXTI_CONFIG_LINE3               ((24uL << LL_EXTI_REGISTER_PINPOS_SHFT) | 0U)  /*!< EXTI_POSITION_24 | EXTICR[0] */
    #define LL_EXTI_CONFIG_LINE4               ((0uL << LL_EXTI_REGISTER_PINPOS_SHFT)  | 1U)  /*!< EXTI_POSITION_0  | EXTICR[1] */
    #define LL_EXTI_CONFIG_LINE5               ((8uL << LL_EXTI_REGISTER_PINPOS_SHFT)  | 1U)  /*!< EXTI_POSITION_8  | EXTICR[1] */
    #define LL_EXTI_CONFIG_LINE6               ((16uL << LL_EXTI_REGISTER_PINPOS_SHFT) | 1U)  /*!< EXTI_POSITION_16 | EXTICR[1] */
    #define LL_EXTI_CONFIG_LINE7               ((24uL << LL_EXTI_REGISTER_PINPOS_SHFT) | 1U)  /*!< EXTI_POSITION_24 | EXTICR[1] */
    #define LL_EXTI_CONFIG_LINE8               ((0uL << LL_EXTI_REGISTER_PINPOS_SHFT)  | 2U)  /*!< EXTI_POSITION_0  | EXTICR[2] */
    #define LL_EXTI_CONFIG_LINE9               ((8uL << LL_EXTI_REGISTER_PINPOS_SHFT)  | 2U)  /*!< EXTI_POSITION_8  | EXTICR[2] */
    #define LL_EXTI_CONFIG_LINE10              ((16uL << LL_EXTI_REGISTER_PINPOS_SHFT) | 2U)  /*!< EXTI_POSITION_16 | EXTICR[2] */
    #define LL_EXTI_CONFIG_LINE11              ((24uL << LL_EXTI_REGISTER_PINPOS_SHFT) | 2U)  /*!< EXTI_POSITION_24 | EXTICR[2] */
    #define LL_EXTI_CONFIG_LINE12              ((0uL << LL_EXTI_REGISTER_PINPOS_SHFT)  | 3U)  /*!< EXTI_POSITION_0  | EXTICR[3] */
    #define LL_EXTI_CONFIG_LINE13              ((8uL << LL_EXTI_REGISTER_PINPOS_SHFT)  | 3U)  /*!< EXTI_POSITION_8  | EXTICR[3] */
    #define LL_EXTI_CONFIG_LINE14              ((16uL << LL_EXTI_REGISTER_PINPOS_SHFT) | 3U)  /*!< EXTI_POSITION_16 | EXTICR[3] */
    #define LL_EXTI_CONFIG_LINE15              ((24uL << LL_EXTI_REGISTER_PINPOS_SHFT) | 3U)  /*!< EXTI_POSITION_24 | EXTICR[3] */
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    📝触发模式

    中断触发方式定义在:C:\Users\Administrator\AppData\Local\Arduino15\packages\STMicroelectronics\hardware\stm32\2.3.0\cores\arduino\wiring_constants.h头文件当中。

    #define LOW     0x0
    #define HIGH    0x1
    #define CHANGE  0x2
    #define FALLING 0x3
    #define RISING  0x4
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • HIGH:高电平触发。
    • LOW:低电平触发
    • CHANGE:当引脚改变值时触发中断-例如从HIGH到LOW或LOW到HIGH;
    • FALLING:当触发信号从高电平到低电平是触发;
    • RISING:当引脚从低电平到高电平时触发。

    📑中断相关函数

    > 相关中断线在Arduino中定义在:C:\Users\Administrator\AppData\Local\Arduino15\packages\STMicroelectronics\hardware\stm32\2.3.0\cores\arduino\interrupt.h头文件当中。

    stm32_interrupt_enable(GPIO_TypeDef *port, uint16_t pin, callback_function_t callback, uint32_t mode);
      void stm32_interrupt_enable(GPIO_TypeDef *port, uint16_t pin, void (*callback)(void), uint32_t mode);
      void stm32_interrupt_disable(GPIO_TypeDef *port, uint16_t pin);
    
    • 1
    • 2
    • 3

    📢说明:以上两个函数在测试中编译没有问题,但是并没有触发中断。

    • 📌文件位置:C:\Users\Administrator\AppData\Local\Arduino15\packages\STMicroelectronics\hardware\stm32\2.3.0\cores\arduino\WInterrupts.h头文件当中。
    void attachInterrupt(uint32_t pin, void (*callback)(void), uint32_t mode);//使能中断
    
    void detachInterrupt(uint32_t pin);//取消中断
    
    • 1
    • 2
    • 3

    📚中断示例

    #define led1  PC2
    #define led2  PC3
    
    
    #define interruptPin1  PC0
    #define interruptPin2  PC1
    
    uint16_t Val_0 = 0; //设置变量Val_0,计数
    uint16_t Val_1 = 0; //设置变量Val_1,计数
    
    
    void count() {
     Val_0 += 1;
    }
    
    void count2() {
     Val_1 += 1;
    }
    // the setup function runs once when you press reset or power the board
    void setup() {
      HardwareSerial(PA10, PA9);
      Serial.begin(115200);
      // initialize digital pin LED_BUILTIN as an output.
      pinMode(led1, OUTPUT);
       pinMode(led2, OUTPUT);
       digitalWrite(led1, LOW);
       digitalWrite(led2, HIGH);
       pinMode(interruptPin1, INPUT_PULLUP);
       pinMode(interruptPin2, INPUT_PULLUP);
    attachInterrupt(digitalPinToInterrupt(interruptPin1), count, FALLING);   //创建中断
    attachInterrupt(digitalPinToInterrupt(interruptPin2), count2, FALLING);   //创建中断
    //  LOW 当引脚为低电平时,触发中断
    // HIGH 高电平触发
    //CHANGE 当引脚电平发生改变时,触发中断
    //RISING 当引脚由低电平变为高电平时,触发中断
    //FALLING 当引脚由高电平变为低电平时,触发中断.
    //   stm32_interrupt_enable(GPIOC, GPIO_PIN_0, count, FALLING);   //创建中断
    //   stm32_interrupt_enable(GPIOC, GPIO_PIN_1, count2, FALLING);   //创建中断
    }
    
    // the loop function runs over and over again forever
    void loop() {
     digitalToggleFast(PC_2);   // turn the LED on (HIGH is the voltage level)
      digitalToggle(led2);
      delay(1000);                       // wait for a second
    //  Serial.println("Perseverance51");
      digitalWriteFast(PC_2, !digitalReadFast(PC_2)) ;   // turn the LED off by making the voltage LOW
      digitalWrite(led2, !digitalRead(led2)) ;
      delay(1000);                       // wait for a second
    //  Serial.println("Arduino STM32G070RBT6");
      Serial.printf("count=%u,count2=%u \n",Val_0,Val_1);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 📜串口打印
      在这里插入图片描述
    ✅可以设置多路外部中断,以及不同的触发方式,相比轮询方式,中断可以有效的节省主循环时间开销。
  • 相关阅读:
    打造更懂投资人的发展模式 锦江酒店(中国区)属地化深耕赋能
    用 VS Code 搞 Qt6:信号、槽,以及QObject
    wallet connect简单使用
    【澎峰科技的朋友圈·年终总结】芯来科技
    著名书法家傅成洪在香港第八届“一带一路”高峰论坛上展示艺术与合作的融合
    S/4HANA(本地部署或云版)跟 SAP 家族系统以及非SAP系统的集成,到底什么是推荐的方式?
    C++ inline函数
    瑞吉外卖 —— 5、菜品管理
    115.Kerberos的安装配置与启用
    Windows操作系统基础-第01课-基础介绍与安装
  • 原文地址:https://blog.csdn.net/weixin_42880082/article/details/127436441