#c #stm32 #interrupt #firmware
Вопрос:
Предпосылка
Я использую STM32G071KBU .. Я хочу использовать pin — код с аппаратными прерываниями для анализа быстрого импульса.
Для своих тестов я подключил кнопку, которая при нажатии соединяет вывод с VCC, и настроил GPIO в раскрывающемся меню с «Режимом GPIO» в «Режиме внешнего прерывания с обнаружением триггера с падающим краем» и сохранил уровень приоритета на 0.
тест
В основном я обмениваюсь статусом светодиода при перехвате события кнопки ….
проблема
Когда я нажимаю кнопку 1 раз из 10, есть вероятность, что программа перейдет в 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(amp;EXTI_InitStruct);
/**/
LL_GPIO_SetPinPull(BUTTON_GPIO_Port, BUTTON_Pin, LL_GPIO_PULL_DOWN);
/**/
LL_GPIO_SetPinMode(BUTTON_GPIO_Port, BUTTON_Pin, 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, amp;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 amp; 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 !!
Спасибо за чтение.
Комментарии:
1. Вы задавали этот же вопрос час или около того назад? Я помню, что видел точно такое же название раньше. Если это так, пожалуйста, не повторяйте один и тот же вопрос снова, отредактируйте вопрос, который у вас есть, чтобы улучшить его.
2. Старый пост был удален администрацией, я не смог его улучшить
3. Довольно сложно отладить жесткую ошибку, посмотрев на исходный код. Хорошо, довольно сложно отладить жесткую ошибку вообще 🙂 Возможно, некоторые из приведенных здесь предложений помогут вам? interrupt.memfault.com/blog/cortex-m-fault-debug