STM32G070RBT6基于STM32CubeMX创建EXTI外部中断工程
Posted perseverance52
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了STM32G070RBT6基于STM32CubeMX创建EXTI外部中断工程相关的知识,希望对你有一定的参考价值。
STM32G070RBT6基于STM32CubeMX创建外部中断工程
- 相关篇《【硬件开源电路】STM32G070RBT6开发板》
- 🌻STM32CubeMX配置EXTI外部中断过程演示
📝工程概要
📜使用
STM32CubeMX
配置一个外部中断工程。通过外部两个按键分别接到PC0
和PC1
引脚上,使用按键来触发,分别来点亮接在PC2
和PC3
上的LED灯。
- 📑实现效果:通过按键(
PC0
)控制接在PC3
引脚上的led灯,通过按键(PC1
)控制接在PC2
引脚上的led灯,
📗业务代码完善内容
在
main.c
文件中添加下面的重写回调函数内容:
//重写回调函数
void HAL_GPIO_EXTI_Falling_Callback(uint16_t GPIO_Pin)
static uint32_t tick = 0;
/* 非阻塞消抖 */
if(HAL_GetTick() - tick < 300)
return;
tick = HAL_GetTick();
/*判断是中断引脚*/
if(GPIO_Pin == GPIO_PIN_1)
HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_2);//状态翻转
if(GPIO_Pin == GPIO_PIN_0)
HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_3);//状态翻转
通过
STM32CubeMX
工具来配置工程可以有效的提高项目的部署到实现的时间。寄存器配置工作,软件都帮我们完成了,我们只要专注于代码的编写即可。
- ⏳中断执行流程
📖中断向量表
🔖没找到对应的
Cortex-M0
的寄存器内容,这里参考M3的。
📋在HAL库的启动文件(startup_stm32g070xx.s
)各中断服务函数
编写中断服务函数在启动文件
startup_stm32g070xx.s
中,预先为每个中断都写了一个中断服务函数,只是这些中断函数都是为空,为的只是初始化中断向量表。实际的中断服务函数都需要重新编写
,中断服务函数都统一生成在stm32g0xx_it.c
源文件中,这个需要根据STM32CubeMX
配置,才会生成对应的中断服务函数。
; External Interrupts
DCD WWDG_IRQHandler ; Window Watchdog
DCD 0 ; Reserved
DCD RTC_TAMP_IRQHandler ; RTC through EXTI Line
DCD FLASH_IRQHandler ; FLASH
DCD RCC_IRQHandler ; RCC
DCD EXTI0_1_IRQHandler ; EXTI Line 0 and 1
DCD EXTI2_3_IRQHandler ; EXTI Line 2 and 3
DCD EXTI4_15_IRQHandler ; EXTI Line 4 to 15
DCD 0 ; Reserved
DCD DMA1_Channel1_IRQHandler ; DMA1 Channel 1
DCD DMA1_Channel2_3_IRQHandler ; DMA1 Channel 2 and Channel 3
DCD DMA1_Ch4_7_DMAMUX1_OVR_IRQHandler ; DMA1 Channel 4 to Channel 7, DMAMUX1 overrun
DCD ADC1_IRQHandler ; ADC1
DCD TIM1_BRK_UP_TRG_COM_IRQHandler ; TIM1 Break, Update, Trigger and Commutation
DCD TIM1_CC_IRQHandler ; TIM1 Capture Compare
DCD 0 ; Reserved
DCD TIM3_IRQHandler ; TIM3
DCD TIM6_IRQHandler ; TIM6
DCD TIM7_IRQHandler ; TIM7
DCD TIM14_IRQHandler ; TIM14
DCD TIM15_IRQHandler ; TIM15
DCD TIM16_IRQHandler ; TIM16
DCD TIM17_IRQHandler ; TIM17
DCD I2C1_IRQHandler ; I2C1
DCD I2C2_IRQHandler ; I2C2
DCD SPI1_IRQHandler ; SPI1
DCD SPI2_IRQHandler ; SPI2
DCD USART1_IRQHandler ; USART1
DCD USART2_IRQHandler ; USART2
DCD USART3_4_IRQHandler ; USART3, USART4
-
🎉本工程定义的PC0和PC1在
EXTI0
线上,中断服务函数的函数名对应的是:EXTI0_1_IRQHandler
-
📚所有中断源定义在
stm32g070xx.h
头文件当中。
/*!< Interrupt Number Definition */
typedef enum
/****** Cortex-M0+ Processor Exceptions Numbers ***************************************************************/
NonMaskableInt_IRQn = -14, /*!< 2 Non Maskable Interrupt */
HardFault_IRQn = -13, /*!< 3 Cortex-M Hard Fault Interrupt */
SVCall_IRQn = -5, /*!< 11 Cortex-M SV Call Interrupt */
PendSV_IRQn = -2, /*!< 14 Cortex-M Pend SV Interrupt */
SysTick_IRQn = -1, /*!< 15 Cortex-M System Tick Interrupt */
/****** STM32G0xxxx specific Interrupt Numbers ****************************************************************/
WWDG_IRQn = 0, /*!< Window WatchDog Interrupt */
RTC_TAMP_IRQn = 2, /*!< RTC interrupt through the EXTI line 19 & 21 */
FLASH_IRQn = 3, /*!< FLASH global Interrupt */
RCC_IRQn = 4, /*!< RCC global Interrupt */
EXTI0_1_IRQn = 5, /*!< EXTI 0 and 1 Interrupts */
EXTI2_3_IRQn = 6, /*!< EXTI Line 2 and 3 Interrupts */
EXTI4_15_IRQn = 7, /*!< EXTI Line 4 to 15 Interrupts */
DMA1_Channel1_IRQn = 9, /*!< DMA1 Channel 1 Interrupt */
DMA1_Channel2_3_IRQn = 10, /*!< DMA1 Channel 2 and Channel 3 Interrupts */
DMA1_Ch4_7_DMAMUX1_OVR_IRQn = 11, /*!< DMA1 Channel 4 to Channel 7 and DMAMUX1 Overrun Interrupts */
ADC1_IRQn = 12, /*!< ADC1 Interrupts */
TIM1_BRK_UP_TRG_COM_IRQn = 13, /*!< TIM1 Break, Update, Trigger and Commutation Interrupts */
TIM1_CC_IRQn = 14, /*!< TIM1 Capture Compare Interrupt */
TIM3_IRQn = 16, /*!< TIM3 global Interrupt */
TIM6_IRQn = 17, /*!< TIM6 global Interrupts */
TIM7_IRQn = 18, /*!< TIM7 global Interrupt */
TIM14_IRQn = 19, /*!< TIM14 global Interrupt */
TIM15_IRQn = 20, /*!< TIM15 global Interrupt */
TIM16_IRQn = 21, /*!< TIM16 global Interrupt */
TIM17_IRQn = 22, /*!< TIM17 global Interrupt */
I2C1_IRQn = 23, /*!< I2C1 Interrupt (combined with EXTI 23) */
I2C2_IRQn = 24, /*!< I2C2 Interrupt */
SPI1_IRQn = 25, /*!< SPI1/I2S1 Interrupt */
SPI2_IRQn = 26, /*!< SPI2 Interrupt */
USART1_IRQn = 27, /*!< USART1 Interrupt */
USART2_IRQn = 28, /*!< USART2 Interrupt */
USART3_4_IRQn = 29, /*!< USART3, USART4 globlal Interrupts */
IRQn_Type;
📑HAL库 GPIO函数库
在文件
stm32g0xx_hal_gpio.h
中:
/** @defgroup GPIO_Exported_Functions_Group1 Initialization/de-initialization functions
* @brief Initialization and Configuration functions
* @
*/
/* Initialization and de-initialization functions *****************************/
void HAL_GPIO_Init(GPIO_TypeDef *GPIOx, GPIO_InitTypeDef *GPIO_Init);//GPIO初始化
void HAL_GPIO_DeInit(GPIO_TypeDef *GPIOx, uint32_t GPIO_Pin);//复位GPIO到初始值
/**
* @
*/
/** @defgroup GPIO_Exported_Functions_Group2 IO operation functions
* @brief IO operation functions
* @
*/
/* IO operation functions *****************************************************/
GPIO_PinState HAL_GPIO_ReadPin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin);//读取引脚的电平状态、函数返回值为0或1
void AL_GPIO_WritePin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState);//写0或1
void HAL_GPIO_TogglePin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin);//状态翻转
HAL_StatusTypeDef HAL_GPIO_LockPin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin);//锁定GPIO引脚状态
void HAL_GPIO_EXTI_IRQHandler(uint16_t GPIO_Pin);//外部中断服务函数,并执行清除中断标志位
void HAL_GPIO_EXTI_Rising_Callback(uint16_t GPIO_Pin);//上升沿中断回调函数
void HAL_GPIO_EXTI_Falling_Callback(uint16_t GPIO_Pin);//下降沿中断回调函数
🛠GPIO初始化函数内容
/** Configure pins as
* Analog
* Input
* Output
* EVENT_OUT
* EXTI
*/
void MX_GPIO_Init(void)
GPIO_InitTypeDef GPIO_InitStruct = 0;
/* GPIO Ports Clock Enable */
__HAL_RCC_GPIOF_CLK_ENABLE();
__HAL_RCC_GPIOC_CLK_ENABLE();
__HAL_RCC_GPIOA_CLK_ENABLE();
/*Configure GPIO pin Output Level */
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_2|GPIO_PIN_3, GPIO_PIN_SET);
/*Configure GPIO pin Output Level */
HAL_GPIO_WritePin(LED_GPIO_Port, LED_Pin, GPIO_PIN_RESET);
/*Configure GPIO pins : PC0 PC1 */
GPIO_InitStruct.Pin = GPIO_PIN_0|GPIO_PIN_1;
GPIO_InitStruct.Mode = GPIO_MODE_IT_FALLING;
GPIO_InitStruct.Pull = GPIO_PULLUP;
HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
/*Configure GPIO pins : PC2 PC3 */
GPIO_InitStruct.Pin = GPIO_PIN_2|GPIO_PIN_3;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_PULLUP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
/*Configure GPIO pin : PtPin */
GPIO_InitStruct.Pin = LED_Pin;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(LED_GPIO_Port, &GPIO_InitStruct);
/* EXTI interrupt init*/
HAL_NVIC_SetPriority(EXTI0_1_IRQn, 0, 0);
HAL_NVIC_EnableIRQ(EXTI0_1_IRQn);
📚工程源码
链接:https://pan.baidu.com/s/17l1dmfQ9-LrShkFbEPuSeA
提取码:ksc2
以上是关于STM32G070RBT6基于STM32CubeMX创建EXTI外部中断工程的主要内容,如果未能解决你的问题,请参考以下文章
STM32G070RBT6基于STM32CubeMX创建串口中断接收数据
STM32G070RBT6基于STM32CubeMX创建ADC DMA多通道采样工程
STM32G070RBT6基于STM32CubeMX创建EXTI外部中断工程