STM32L0 GPIO 中断不起作用
STM32L0 GPIO Interrupt does not work
我试图在每次单击 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);
}
此致,
HAL_Delay() 将不起作用,直到您将 exti irq 的优先级更改为高于 systick irq 的优先级。在您的实现中,我假设,两者的默认优先级均为 0,并且 HAL_Delay()
挂起,因为您以相同的 isr 优先级使用它。尝试将 exti irq 优先级更改为 1。
我不明白你想做什么。
如果你想在每个按钮事件上改变你的 LED 状态,你不需要在 HAL_GPIO_EXTI_Callback.这不是固件开发的好习惯。 IRQ 应该可以快速管理事件。它们的进程比程序执行(这里是您的主程序)具有更高的优先级。
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
if(GPIO_Pin == GPIO_PIN_13)
{
HAL_GPIO_TogglePin (GPIOA, GPIO_PIN_5);
}
}
如果您想 start/stop 根据按钮事件使 LED 闪烁,您需要使用定时器(例如按钮启动定时器,每个 定时器过去 irq 切换 PA5).
在MX_GPIO_Init函数中,PA5初始化后需要调用HAL_GPIO_WritePin(HAL_GPIO_Init).
在 PA13 上设置上拉之前先检查一下您的硬件。
我建议你下载STM32Cube。他们有很多代码示例。一个示例显示了如何配置外部中断线以在按钮事件上闪烁 LED(存储库路径:...\STM32Cube\Repository\STM32Cube_FW_L0_V1.8.0\Projects\STM32L073RZ-Nucleo\Examples\GPIO\GPIO_EXTI).
我试图在每次单击 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);
}
此致,
HAL_Delay() 将不起作用,直到您将 exti irq 的优先级更改为高于 systick irq 的优先级。在您的实现中,我假设,两者的默认优先级均为 0,并且 HAL_Delay()
挂起,因为您以相同的 isr 优先级使用它。尝试将 exti irq 优先级更改为 1。
我不明白你想做什么。
如果你想在每个按钮事件上改变你的 LED 状态,你不需要在 HAL_GPIO_EXTI_Callback.这不是固件开发的好习惯。 IRQ 应该可以快速管理事件。它们的进程比程序执行(这里是您的主程序)具有更高的优先级。
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) { if(GPIO_Pin == GPIO_PIN_13) { HAL_GPIO_TogglePin (GPIOA, GPIO_PIN_5); } }
如果您想 start/stop 根据按钮事件使 LED 闪烁,您需要使用定时器(例如按钮启动定时器,每个 定时器过去 irq 切换 PA5).
在MX_GPIO_Init函数中,PA5初始化后需要调用HAL_GPIO_WritePin(HAL_GPIO_Init).
在 PA13 上设置上拉之前先检查一下您的硬件。
我建议你下载STM32Cube。他们有很多代码示例。一个示例显示了如何配置外部中断线以在按钮事件上闪烁 LED(存储库路径:...\STM32Cube\Repository\STM32Cube_FW_L0_V1.8.0\Projects\STM32L073RZ-Nucleo\Examples\GPIO\GPIO_EXTI).