HAL_GPIO_EXTI_Callback() 中的上升和下降触发边沿
Rising and Falling Trigger Edges in HAL_GPIO_EXTI_Callback()
我有一个数字输入 GPIO
线,只要输入发生变化,我就需要中断。在 STM32CubeMX
中,我将此引脚设置为 EXTI
线并将中断设置为在上升沿和下降沿触发。
当调用函数 HAL_GPIO_EXTI_Callback()
以响应上升沿或下降沿时,有没有办法知道触发中断的是上升沿还是下降沿?或者是否需要调用 HAL_GPIO_ReadPin()
来推断这一点?
回调原型为:
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin);
您必须致电 HAL_GPIO_ReadPin()
。
当你select在上升沿和下降沿都中断时,STM32CubeMX实际上设置了Rising trigger selection register (EXTI_RTSRx)
和Falling trigger selection register (EXTI_FTSRx)
中的相应位。
当发生中断时,在 Pending register (EXTI_PRx)
中只为该中断线设置一位,因此您不知道它是上升沿还是下降沿。
是的,我按照你说的做了。
但是代码无法区分上升沿和下降沿。
这是代码:
void HAL_GPIO_EXTI_Callback (uint16_t GPIO_Pin)
{
if (GPIO_PIN_SET! = HAL_GPIO_ReadPin (GPIOA, GPIO_PIN_11))
{// THIS CONNECTION IS ADDED. THEN THE SET TUSUNA CAN BE PERFORMED UP AND UP DOWN PRIOR.
if (GPIO_Pin == GPIO_PIN_4) // PA4 rising edge or falling edge cut.
{// Let's say the LCD is inverted. DOWN.
// if ((GPIO_PIN_RESET == HAL_GPIO_ReadPin (GPIOA, GPIO_PIN_5)) && (GPIO_PIN_SET == HAL_GPIO_ReadPin (GPIOA, GPIO_PIN_4)))
// {
// A UCU
if ((GPIO_PIN_RESET == HAL_GPIO_ReadPin (GPIOA, GPIO_PIN_5)) && (GPIO_PIN_SET == HAL_GPIO_ReadPin (GPIOA, GPIO_PIN_4))) // While rising edge on PA4.
{
//tsHandle.tsButtonVariables.bButton_A_DusenKenar_B_Logic0 = 0;
tsHandle.tsButtonVariables.bButton_A_YukselenKenar_B_Logic0 = 1;
//tsHandle.tsButtonVariables.bButton_B_DusenKenar_A_Logic0 = 0;
//tsHandle.tsButtonVariables.bButton_B_UpdateKenar_A_Logic0 = 0;
}
else if ((GPIO_PIN_RESET == HAL_GPIO_ReadPin (GPIOA, GPIO_PIN_5)) && (GPIO_PIN_RESET == HAL_GPIO_ReadPin (GPIOA, GPIO_PIN_4))) // PA4 when the falling edge is occurring.
{
tsHandle.tsButtonVariables.bButton_A_DusenKenar_B_Logic0 = 1;
//tsHandle.tsButtonVariables.bButton_A_YukselenKenar_B_Logic0 = 0;
//tsHandle.tsButtonVariables.bButton_B_DusenKenar_A_Logic0 = 0;
//tsHandle.tsButtonVariables.bButton_B_UpdateKenar_A_Logic0 = 0;
}
else
{
}
}
插入
__HAL_PWR_CLEAR_FLAG(PWR_FLAG_WU);
在 HAL_GPIO_EXTI_Callback 函数中。
我有一个数字输入 GPIO
线,只要输入发生变化,我就需要中断。在 STM32CubeMX
中,我将此引脚设置为 EXTI
线并将中断设置为在上升沿和下降沿触发。
当调用函数 HAL_GPIO_EXTI_Callback()
以响应上升沿或下降沿时,有没有办法知道触发中断的是上升沿还是下降沿?或者是否需要调用 HAL_GPIO_ReadPin()
来推断这一点?
回调原型为:
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin);
您必须致电 HAL_GPIO_ReadPin()
。
当你select在上升沿和下降沿都中断时,STM32CubeMX实际上设置了Rising trigger selection register (EXTI_RTSRx)
和Falling trigger selection register (EXTI_FTSRx)
中的相应位。
当发生中断时,在 Pending register (EXTI_PRx)
中只为该中断线设置一位,因此您不知道它是上升沿还是下降沿。
是的,我按照你说的做了。 但是代码无法区分上升沿和下降沿。 这是代码:
void HAL_GPIO_EXTI_Callback (uint16_t GPIO_Pin)
{
if (GPIO_PIN_SET! = HAL_GPIO_ReadPin (GPIOA, GPIO_PIN_11))
{// THIS CONNECTION IS ADDED. THEN THE SET TUSUNA CAN BE PERFORMED UP AND UP DOWN PRIOR.
if (GPIO_Pin == GPIO_PIN_4) // PA4 rising edge or falling edge cut.
{// Let's say the LCD is inverted. DOWN.
// if ((GPIO_PIN_RESET == HAL_GPIO_ReadPin (GPIOA, GPIO_PIN_5)) && (GPIO_PIN_SET == HAL_GPIO_ReadPin (GPIOA, GPIO_PIN_4)))
// {
// A UCU
if ((GPIO_PIN_RESET == HAL_GPIO_ReadPin (GPIOA, GPIO_PIN_5)) && (GPIO_PIN_SET == HAL_GPIO_ReadPin (GPIOA, GPIO_PIN_4))) // While rising edge on PA4.
{
//tsHandle.tsButtonVariables.bButton_A_DusenKenar_B_Logic0 = 0;
tsHandle.tsButtonVariables.bButton_A_YukselenKenar_B_Logic0 = 1;
//tsHandle.tsButtonVariables.bButton_B_DusenKenar_A_Logic0 = 0;
//tsHandle.tsButtonVariables.bButton_B_UpdateKenar_A_Logic0 = 0;
}
else if ((GPIO_PIN_RESET == HAL_GPIO_ReadPin (GPIOA, GPIO_PIN_5)) && (GPIO_PIN_RESET == HAL_GPIO_ReadPin (GPIOA, GPIO_PIN_4))) // PA4 when the falling edge is occurring.
{
tsHandle.tsButtonVariables.bButton_A_DusenKenar_B_Logic0 = 1;
//tsHandle.tsButtonVariables.bButton_A_YukselenKenar_B_Logic0 = 0;
//tsHandle.tsButtonVariables.bButton_B_DusenKenar_A_Logic0 = 0;
//tsHandle.tsButtonVariables.bButton_B_UpdateKenar_A_Logic0 = 0;
}
else
{
}
}
插入 __HAL_PWR_CLEAR_FLAG(PWR_FLAG_WU); 在 HAL_GPIO_EXTI_Callback 函数中。