2015-07-07 3 views
2

Я использую 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, если это имеет значение)

Благодарен за любые подсказки!

+0

Возможно, это как-то связано с часами LowPower (LP)? Насколько я понимаю, они должны быть включены по умолчанию, не так ли? –

+0

Согласно документации, WFI переводит процессор просто в спящий режим, и любое прерывание, особенно EXT, должно разбудить его. Плюс Я использую PC13, который для этого чипа является штырем WKUP. Но для использования этой функции мне пришлось бы настраивать вывод как AlternativeFunction, а не на вход Gpio, и когда я это делаю, я вообще не получаю прерываний (даже с циклом while) –

ответ

1

Моя проблема была фактически решена путем уменьшения скорости ФАПЧ. Моя конфигурация является:

/* HCLK = SYSCLK /1*/ 
RCC->CFGR |= (uint32_t)RCC_CFGR_HPRE_DIV1; 

/* PCLK2 = HCLK /1*/ 
RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE2_DIV1; 

/* PCLK1 = HCLK /1*/ 
RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE1_DIV1; 

/* PLL configuration */ 
RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_PLLSRC | RCC_CFGR_PLLMUL | 
            RCC_CFGR_PLLDIV)); 
RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLSRC_HSI | RCC_CFGR_PLLMUL6 | RCC_CFGR_PLLDIV3); 

И убедитесь, что проблема решена, когда я заменяю RCC_CFGR_PLLMUL6 с RCC_CFGR_PLLMUL3. Я не могу это объяснить, я не знаю, связано ли это с скоростью отладчика или чем-то еще.

+0

Каков источник сигнала, идущего на контакт? Если это кнопка или переключатель, возможно, вам нужно дебютировать. –

+0

Нет, это был другой процессор. Но в любом случае прерывание запускалось с while (1), и даже некорректная кнопка запускала бы его, возможно, много раз вместо одного. –