c - stm32 WFI没有触发

  显示原文与译文双语对照的内容
0 0

使用 STM32L151 ( Cortex-M3 ) 并在gpio引脚上配置外部中断:

/* 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链接/v2调试器,ARM嵌入式处理器工具链 & Eclipse Plug-Ins,使用gdb和 openOCD,如果有问题)

感谢你的提示 !

时间:原作者:3个回答

0 0

我的问题其实是通过降低PLL速度来解决的。 我的配置是:

/* 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_PLLMUL3替换RCC_CFGR_PLLMUL6时问题是固定的。 我无法解释这一点,我不知道它是否与调试器速度或者其他任何内容有关。

原作者:
...