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] */

📝触发模式

中断触发方式定义在: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
  • 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);

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

  • 📌文件位置: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);//取消中断

📚中断示例

#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
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
STM32G070是意法半导体公司推出的一款32位微控制器系列,适用于低功耗应用场景。而HAL库是STM32系列微控制器开发中常用的硬件抽象层,可以提供方便易用的API接口,简化了对微控制器外设的驱动和控制。 STM32G070 HAL库为开发者提供了丰富的功能组件,包括GPIO(通用输入输出)、UART(串行通信)、SPI(串行外设接口)、I2C(串行外设接口)、定时器等。开发者可以通过简单的函数调用来完成对这些外设的配置和操作。 HAL库使用起来非常方便。首先,开发者需要初始化相应的外设,例如使用HAL_GPIO_Init函数初始化GPIO引脚。然后,可以使用HAL_XXX_XXX函数进行读写操作,例如使用HAL_UART_Transmit函数发送数据。此外,HAL库还提供了一些中断处理函数,如HAL_UART_RxCpltCallback可以在接收到UART数据时自动调用,方便开发者编写中断服务程序。 使用STM32G070 HAL库的好处是,它提供了一系列简单易懂的API函数,降低了使用者的开发门槛。通过使用HAL库,开发者可以更高效地利用STM32G070的功能,提高开发效率。同时,HAL库是基于CMSIS(Cortex Microcontroller Software Interface Standard,Cortex微控制器软件接口标准)开发的,保证了代码的可移植性,可以方便地迁移至其他系列的STM32微控制器。 总之,STM32G070 HAL库是适用于STM32G070系列微控制器的硬件抽象层,为开发者提供了简便易用的API接口,方便配置和操作微控制器的外设。使用HAL库可以提高开发效率,降低开发门槛,并保证代码的可移植性。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值