问题描述
前提
我正在使用 STM32G071KBU ..
我想使用带有硬件中断的引脚来分析快速脉冲。
对于我的测试,我连接了一个按钮,该按钮在按下时将引脚连接到 VCC,并在“具有下降沿触发检测的外部中断模式”中将 GPIO 配置为“GPIO 模式”,并将优先级保持在0.
测试
在我的主要内容中,当拦截按钮事件时,我会交换 LED 的状态......
问题
当我按 10 次中的 1 次按钮时,程序有可能进入 HardFault_Handler。
EXTI2_3_IRQHandler : 中断管理
/**
* @brief This function handles EXTI line 2 and line 3 interrupts.
*/
void EXTI2_3_IRQHandler(void)
{
/* USER CODE BEGIN EXTI2_3_IRQn 0 */
/* USER CODE END EXTI2_3_IRQn 0 */
if (LL_EXTI_IsActiveFallingFlag_0_31(LL_EXTI_LINE_2) != RESET)
{
LL_EXTI_ClearFallingFlag_0_31(LL_EXTI_LINE_2);
/* USER CODE BEGIN LL_EXTI_LINE_2_FALLING */
m_led_status++;
}
/* USER CODE BEGIN EXTI2_3_IRQn 1 */
/* USER CODE END EXTI2_3_IRQn 1 */
}
GPIO 设置
void MX_GPIO_Init(void)
{
LL_EXTI_InitTypeDef EXTI_InitStruct = {0};
LL_GPIO_InitTypeDef GPIO_InitStruct = {0};
/* GPIO Ports Clock Enable */
LL_IOP_GRP1_EnableClock(LL_IOP_GRP1_PERIPH_GPIOB);
LL_IOP_GRP1_EnableClock(LL_IOP_GRP1_PERIPH_GPIOA);
/**/
LL_GPIO_ResetoutputPin(LED1_GPIO_Port,LED1_Pin);
/**/
LL_EXTI_SetEXTISource(LL_EXTI_CONfig_PORTB,LL_EXTI_CONfig_LINE2);
/**/
EXTI_InitStruct.Line_0_31 = LL_EXTI_LINE_2;
EXTI_InitStruct.LineCommand = ENABLE;
EXTI_InitStruct.Mode = LL_EXTI_MODE_IT;
EXTI_InitStruct.Trigger = LL_EXTI_TRIGGER_FALLING;
LL_EXTI_Init(&EXTI_InitStruct);
/**/
LL_GPIO_SetPinPull(BUTTON_GPIO_Port,BUTTON_Pin,LL_GPIO_PULL_DOWN);
/**/
LL_GPIO_SetPinMode(BUTTON_GPIO_Port,LL_GPIO_MODE_INPUT);
/**/
GPIO_InitStruct.Pin = LED1_Pin;
GPIO_InitStruct.Mode = LL_GPIO_MODE_OUTPUT;
GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_LOW;
GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL;
GPIO_InitStruct.Pull = LL_GPIO_PULL_NO;
LL_GPIO_Init(LED1_GPIO_Port,&GPIO_InitStruct);
/* EXTI interrupt init*/
NVIC_SetPriority(EXTI2_3_IRQn,0);
NVIC_EnableIRQ(EXTI2_3_IRQn);
}
主要管理
// GENERAL MACRO
#define GPIO_PIN_SET(a,b) (((GPIO_TypeDef*)(a))->BSRR = b)
#define GPIO_PIN_CLR(a,b) (((GPIO_TypeDef*)(a))->BRR = b)
#define LED1_L() GPIO_PIN_SET(LED1_GPIO_Port,LED1_Pin)
#define LED1_H() GPIO_PIN_CLR(LED1_GPIO_Port,LED1_Pin)
volatile static uint8_t m_led_status;
void app_main_loop(void) {
if (m_led_status & 0x01) {
LED1_H();
} else {
LED1_L();
}
}
int main(void)
{
LL_APB2_GRP1_EnableClock(LL_APB2_GRP1_PERIPH_SYSCFG);
LL_APB1_GRP1_EnableClock(LL_APB1_GRP1_PERIPH_PWR);
LL_SYSCFG_disableDBATT(LL_SYSCFG_UCPD1_STROBE);
SystemClock_Config();
MX_GPIO_Init();
while (1)
{
app_main_loop();
}
}
我试过同时使用 LL 和 HAL 库!!
感谢阅读。
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)