Я использую STM32L151 (Cortex-M3) и настройки внешнего прерывания на GPIO штифтом:STM32 ВДИ не вызывает
/* Enable clocks */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI3, ENABLE);
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOB, ENABLE);
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOC, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM9, ENABLE);
/* ExtInt Input */
GPIO_InitTypeDef GPIO_InitStr;
GPIO_InitStr.GPIO_Speed = GPIO_Speed_40MHz;
GPIO_InitStr.GPIO_Mode = GPIO_Mode_IN;
GPIO_InitStr.GPIO_PuPd = GPIO_PuPd_DOWN;
GPIO_InitStr.GPIO_Pin = GPIO_Pin_13;
GPIO_Init(GPIOC, &GPIO_InitStr);
/* Interrupts on EXTINT */
SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOC, EXTI_PinSource13);
EXTI_InitTypeDef ExtiInitStr = {EXTI_Line13, EXTI_Mode_Interrupt, EXTI_Trigger_Rising, ENABLE};
EXTI_Init(&ExtiInitStr);
NVIC_InitTypeDef NvicInitStr = {EXTI15_10_IRQn, 0, 0, ENABLE};
NVIC_Init(&NvicInitStr);
Мой main.c в конце концов достигает точки, где у меня есть:
__enable_irq();
//...program related code..
__ASM volatile ("wfi");
На данный момент процессор НЕ просыпается от внешнего штыря, идущего высоко. Если я вместо этого заменить WFI линию
while(1);
прерывание корректно срабатывает. Я пытался следовать примерам, но не нашел что-то другое. (Я использую отладчик ST-Link/V2, GNU Tools для ARM Embedded Processors Toolchain & Плагины Eclipse с gdb и openOCD, если это имеет значение)
Благодарен за любые подсказки!
Возможно, это как-то связано с часами LowPower (LP)? Насколько я понимаю, они должны быть включены по умолчанию, не так ли? –
Согласно документации, WFI переводит процессор просто в спящий режим, и любое прерывание, особенно EXT, должно разбудить его. Плюс Я использую PC13, который для этого чипа является штырем WKUP. Но для использования этой функции мне пришлось бы настраивать вывод как AlternativeFunction, а не на вход Gpio, и когда я это делаю, я вообще не получаю прерываний (даже с циклом while) –