STM32G070RBT6基于STM32CubeMX创建EXTI外部中断工程

Posted perseverance52

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了STM32G070RBT6基于STM32CubeMX创建EXTI外部中断工程相关的知识,希望对你有一定的参考价值。

STM32G070RBT6基于STM32CubeMX创建外部中断工程


📝工程概要

📜使用STM32CubeMX配置一个外部中断工程。通过外部两个按键分别接到PC0PC1引脚上,使用按键来触发,分别来点亮接在PC2PC3上的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外部中断工程

STM32G070RBT6基于Arduino框架下点灯程序

STM32G070RBT6基于Arduino框架GPIO外部中断

STM32G070RBT6基于STM32CubeMX创建定时器中断控制LED闪烁