STM32G0学习手册——使用HAL库进行EXTI中断实验

目录

G0外部中断框图

中断来源

GPIO 中断线定义

 EXTI 类型

外部中断实验

代码讲解


G0外部中断框图

STM32G0学习手册——使用HAL库进行EXTI中断实验_第1张图片

扩展中断和事件控制器可以生成中断和事件,并将处理器从停止模式唤醒。 

中断来源

可配置事件(Configurable events)来自GPIO,PVD以及比较器COMP1和COMP2的外部中断关联。

直接事件(Direct events)来自RTC,Tamper,I2C1,USARTS 1和2,CEC,LPUART1,LPTIM 1、2,LSE,UCPD 1、2。

GPIO 中断线定义

GPIOA~D有16条,GPIOF有4条。EXTI多路复用器输出可独立于EXTI_IMR和EXTI_EMR寄存器中定义的任何掩码使用。

STM32G0学习手册——使用HAL库进行EXTI中断实验_第2张图片

 EXTI 类型

EXTI LINE LINE SOURCE LINE TYPE
0-15 GPIO configurable
16 PVD configurable
17 COMP1 configurable
18 COMP2 configurable
19 RTC direct
20 Reserved direct
21 TAMP direct
22 Reserved direct
23 I2C1 WAKEUP direct
24 Reserved direct
25 USART1 WAKEUP direct
26 USART2 WAKEUP direct
27 CED WAKEUP direct
28 LPUART1 WAKE direct
29 LPTIM1 direct
30 LPTIM2 direct
31 LSE_CSS direct
32 UCPD1 WAKEUP direct
33 UCPD2 WAKEUP direct

外部中断实验

  • 新建芯片工程,找到对应的芯片,这里是G071C8T6;
  • SYS设置“Serial Wire”调试接口,RCC设置使用HSE;
  • 设置时钟树,使用HSE、PLLCLK、HCLK=64(MHz),保持激活CSS;

STM32G0学习手册——使用HAL库进行EXTI中断实验_第3张图片

  • 设置PC6引脚为GPIO_Output,默认电平为低电平、开漏输出、不上下拉、速率低;

STM32G0学习手册——使用HAL库进行EXTI中断实验_第4张图片

STM32G0学习手册——使用HAL库进行EXTI中断实验_第5张图片

  • 设置 PA0为外部中断GPIO_EXTI0,外部中断模式上升沿响应、下拉;

STM32G0学习手册——使用HAL库进行EXTI中断实验_第6张图片

  •  在NVIC选项卡中,使能EXTI 0&1中断,设置优先级为2;

STM32G0学习手册——使用HAL库进行EXTI中断实验_第7张图片

  • 在project manager中,project里设置好工程名称,IDE软件为MDK-ARM,版本为V5;
  • code generator,设置如下(如何设置参考),生成代码,使用mdk软件打开工程;

STM32G0学习手册——使用HAL库进行EXTI中断实验_第8张图片

  •  在MDK软件debug中,勾上Reset and Run;

代码讲解

  • 在startup_stm32g071xx.s启动文件中可以看到,中断线0和1(PA0属于中断线0)使用EXTI0_1_IRQHandler函数;
  • stm32g0xx_it.c中我们可以找该函数原型void EXTI0_1_IRQHandler(void),编译后,烧录到芯片就能工作。我们可以在原型函数中编写代码,但是这样不利移植;
void EXTI0_1_IRQHandler(void)
{
  /* USER CODE BEGIN EXTI0_1_IRQn 0 */
    HAL_Delay(10);
    if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0)==GPIO_PIN_SET)
    {
      HAL_GPIO_TogglePin(GPIOA,GPIO_PIN_1);
      HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_6);
    }
  /* USER CODE END EXTI0_1_IRQn 0 */
  HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_0);
  /* USER CODE BEGIN EXTI0_1_IRQn 1 */
  /* USER CODE END EXTI0_1_IRQn 1 */
}
  • 复原我们刚才写的代码,理清HAL库中函数之间的调用,中断函数原型调用HAL_GPIO_EXTI_IRQHandler(),这个函数用来清除中断标志位和判断是什么电平变化边沿调用对应的回调函数,所以需要我们手动编写回调函数;

       STM32G0学习手册——使用HAL库进行EXTI中断实验_第9张图片

  •  在main.c文件中,int main(){ }代码后面写上自己的HAL_GPIO_EXTI_Rising_Callback()回调函数,因为我们是上升沿触发,所以用上升沿回调函数;
  • 在stm32g0xx_hal_gpio.c文件中找到回调函数,复制到main.c文件中,修改一下
/*
*stm32g0xx_hal_gpio.c文件中的代码
*/
__weak void HAL_GPIO_EXTI_Rising_Callback(uint16_t GPIO_Pin)
{
  /* Prevent unused argument(s) compilation warning */
  UNUSED(GPIO_Pin);

  /* NOTE: This function should not be modified, when the callback is needed,
           the HAL_GPIO_EXTI_Rising_Callback could be implemented in the user file
   */
}
  • 手动写的回调函数如下,最后编译,烧录即可。
/* USER CODE BEGIN 4 */
void HAL_GPIO_EXTI_Rising_Callback(uint16_t GPIO_Pin)
{
  /* Prevent unused argument(s) compilation warning */
  UNUSED(GPIO_Pin);
  HAL_Delay(10);                                    //延时10ms,去抖动
/*判断是不是PA0引脚中断并且PA0引脚处于高电平*/
  if(GPIO_Pin==GPIO_PIN_0&&HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0)==GPIO_PIN_SET)
  {
    HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_6);           //翻转PC6引脚电平,达到闪烁效果
  }
}
/* USER CODE END 4 */
  • 中断初始化代码,被放在MX_GPIO_Init()中 
  /*Configure GPIO pin : PA0 */
  GPIO_InitStruct.Pin = GPIO_PIN_0;
  GPIO_InitStruct.Mode = GPIO_MODE_IT_RISING;
  GPIO_InitStruct.Pull = GPIO_PULLDOWN;
  HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

  /* EXTI interrupt init*/
  HAL_NVIC_SetPriority(EXTI0_1_IRQn, 2, 0);
  HAL_NVIC_EnableIRQ(EXTI0_1_IRQn);
  • 硬件原理图

STM32G0学习手册——使用HAL库进行EXTI中断实验_第10张图片


开发板链接:https://item.taobao.com/item.htm?ft=t&id=617799679179

你可能感兴趣的:(stm32,STM32G0,STM32CubeMX)