1

每次单击 PC13 按钮时,我都会尝试闪烁 GPIO PA5 端口上的 LED。但是,它不起作用。能否请您指教,我该如何解决这个问题?

main.c - 主程序

#include "main.h"
#include "stm32l0xx_hal.h"

void SystemClock_Config(void);
static void MX_GPIO_Init(void);

int main(void)
 {
   HAL_Init();
   SystemClock_Config();
   MX_GPIO_Init();

   while (1)
    {
    }
  }

GPIO 端口配置部分。PA5 和 PC13 端口已配置。EXTI13 上的中断已启用。

static void MX_GPIO_Init(void)
  {

    GPIO_InitTypeDef GPIO_InitStruct;

   /* GPIO Ports Clock Enable */
    __HAL_RCC_GPIOC_CLK_ENABLE();
    __HAL_RCC_GPIOA_CLK_ENABLE();

   /*Configure GPIO pin Output Level */
   HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_RESET);

  /*Configure GPIO pin : PC13 */
  GPIO_InitStruct.Pin = GPIO_PIN_13;
  GPIO_InitStruct.Mode = GPIO_MODE_IT_FALLING;
  GPIO_InitStruct.Pull = GPIO_PULLUP;
  HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);

  /*Configure GPIO pin : PA5 */
  GPIO_InitStruct.Pin = GPIO_PIN_5;
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

  /* EXTI interrupt init*/
  HAL_NVIC_SetPriority(EXTI4_15_IRQn, 0, 0);
  HAL_NVIC_EnableIRQ(EXTI4_15_IRQn);
}

stm32l0xx_it.c - 中断文件。定义了 IRQ 处理程序和回调函数。

void EXTI4_15_IRQHandler(void)
 {
    HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_13);
 }

void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin){
    HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_5);
    HAL_Delay(500);
}

此致,

4

2 回答 2

0

我不明白你想做什么。

  • 如果您想在每个按钮事件上更改 LED 的状态,则无需在HAL_GPIO_EXTI_Callback中设置延迟。这不是固件开发的好习惯。IRQ 应该快速管理事件。他们的进程比程序执行具有更高的优先级(这里是你的主进程)。

    无效 HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
    {
        如果(GPIO_Pin == GPIO_PIN_13)
        {
            HAL_GPIO_TogglePin (GPIOA, GPIO_PIN_5);
        }
    }
    
  • 如果您想根据按钮事件开始/停止闪烁 LED,您需要使用计时器(例如,按钮启动计时器,每个计时器经过irq 切换 PA5)。

MX_GPIO_Init函数中,您必须在 PA5 初始化(HAL_GPIO_Init )之后调用HAL_GPIO_WritePin

在 PA13 上设置上拉之前查看您的硬件。

我建议你下载STM32Cube。它们是很多代码示例。一个示例显示了如何配置外部中断线以在按钮事件上闪烁 LED(存储库路径:...\STM32Cube\Repository\STM32Cube_FW_L0_V1.8.0\Projects\STM32L073RZ-Nucleo\Examples\GPIO\GPIO_EXTI)。

于 2018-09-14T06:59:21.910 回答
-1

在您将 exti irq 的优先级更改为高于 systick irq 的优先级之前,HAL_Delay() 将不起作用。我假设在您的实现中,两者的默认优先级均为 0 并HAL_Delay()挂起,因为您以相同的 isr 优先级使用它。尝试将 exti irq 优先级更改为 1。

于 2018-05-10T06:32:36.687 回答