STM32G070RBT6基于Arduino框架GPIO外部中断

Posted perseverance52

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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);

  • 串口打印

通过实验,设置了2个外部中断函数,只能响应最下面的中断服务函数,前面的中断服务函数并不能触发和响应。

总结在使用过程中,只能定义一个外部中断服务函数.

以上是关于STM32G070RBT6基于Arduino框架GPIO外部中断的主要内容,如果未能解决你的问题,请参考以下文章

STM32G070RBT6基于Arduino框架下点灯程序

STM32G070RBT6基于Arduino框架GPIO外部中断

STM32G070RBT6基于Arduino框架下串口数据接收使用示例

STM32G070RBT6基于Arduino串口的使用

STM32G070RBT6基于Arduino框架下eeprom使用示例

STM32G070RBT6基于STM32CubeMX创建ADC DMA多通道采样工程