问题描述
首先我是基于STM32F412的程序移植到STM32U575,使用的是STM32 HAL库进行开发的。
所有功能移植完成后,发现GPIO无法进入中断回调函数 void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
中。
问题原因
在一些列硬件和软件的排查后,发现STM32F412中的外部中断回调函数名与STM32U575的函数名不同。
STM32F412外部中断处理函数
void HAL_GPIO_EXTI_IRQHandler(uint16_t GPIO_Pin)
{
/* EXTI line interrupt detected */
if(__HAL_GPIO_EXTI_GET_IT(GPIO_Pin) != RESET)
{
__HAL_GPIO_EXTI_CLEAR_IT(GPIO_Pin);
HAL_GPIO_EXTI_Callback(GPIO_Pin);
}
}
STM32U575外部中断处理函数
void HAL_GPIO_EXTI_IRQHandler(uint16_t GPIO_Pin)
{
/* EXTI line interrupt detected */
if (__HAL_GPIO_EXTI_GET_RISING_IT(GPIO_Pin) != 0U)
{
__HAL_GPIO_EXTI_CLEAR_RISING_IT(GPIO_Pin);
HAL_GPIO_EXTI_Rising_Callback(GPIO_Pin);
}
if (__HAL_GPIO_EXTI_GET_FALLING_IT(GPIO_Pin) != 0U)
{
__HAL_GPIO_EXTI_CLEAR_FALLING_IT(GPIO_Pin);
HAL_GPIO_EXTI_Falling_Callback(GPIO_Pin);
}
}
解决问题
从外部中断处理函数不难发现,STM32U5拆分了外部中断上升沿和下降沿两个回调函数。
需要将源 HAL_GPIO_EXTI_Callback
函数实体,根据上升沿或下降沿需求分别改为 HAL_GPIO_EXTI_Rising_Callback
或 HAL_GPIO_EXTI_Falling_Callback
函数。