硬件开发板:STM32G0B1RET6
软件平台:cubemax+keil+VScode
1 新建cubemax工程
1.1 配置系统时钟树
1.2 配置相关GPIO引脚
①LED由PC13引脚控制
选择PA5引脚,GPIO_Output模式
GPIO模式配置:
②按键开关由PC13引脚控制
选择PC13引脚,GPIO_EXTIx模式,其中13表示13号中断线
GPIO模式配置:按键设置为下降沿触发中断(LED)
1.3 配置NVIC中断
勾上Enabled (G0系列相比于F1系列没有优先级Group配置)
1.4 导出工程
…略
2 中断处理流程
① main.c 中的 MX_GPIO_Init() 函数调用HAL库里的使能中断函数和设置中断优先级函数
② 在 HAL_NVIC_EnableIRQ() 中调用 NVIC_EnableIRQ()
③ 当触发中断时,处理器查表跳转到位于 stm32g0xx.it.c 里的中断服务程序 EXTIx_IRQHandler(void) 【这里的x指中断线】;中断服务程序 EXTIx_IRQHandler (void) 中调用外部中断通用处理函数HAL_GPIO_EXTI_IRQHandler (uint16_t GPIO_Pin) ,该函数作为HAL库提供的外部中断接口函数,参量为触发中断的引脚
④相比较于F系列,G0系列的HAL_GPIO_EXTI_IRQHandler (uint16_t GPIO_Pin)里所调用的中断回调函数分成了上升沿和下降沿两部分
G0系列:
F1/F4系列:
⑤在stm32g0xx.it.c 中重写对应类型的中断回调函数,并补全中断所需要执行的任务函数
3 代码
重写下降沿中断回调函数
//微秒级的延时
void delay_us(uint32_t delay_us)
{volatile unsigned int num;volatile unsigned int t;for (num = 0; num < delay_us; num++){t = 11;while (t != 0){t--;}}
}//毫秒级的延时
void delay_ms(uint16_t delay_ms)
{volatile unsigned int num;for (num = 0; num < delay_ms; num++){delay_us(1000);}
}//下降沿回调函数
void HAL_GPIO_EXTI_Falling_Callback(uint16_t GPIO_Pin)
{if (GPIO_Pin==BUTTON_Pin){delay_ms(20); /*消抖*/if (GPIO_Pin==BUTTON_Pin){HAL_GPIO_TogglePin(LED_GPIO_Port,LED_Pin);while (BUTTON_Pin==0);}}
}