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框架GPIO外部中断
STM32G070RBT6基于Arduino框架下串口数据接收使用示例