c - stm32 WFI不触发

标签 c embedded interrupt stm32 intrinsics

我正在使用 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-Link/V2 调试器、ARM 嵌入式处理器工具链和 Eclipse 插件的 GNU 工具,以及 gdb 和 openOCD,如果这很重要的话)

感谢任何提示!

最佳答案

我的问题实际上是通过降低 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_PLLMUL6 替换为 RCC_CFGR_PLLMUL3 时,我确认问题已解决。我无法解释这个,我不知道它是否与调试器速度或其他任何东西有关。

关于c - stm32 WFI不触发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31272698/

相关文章:

c++ - 作为中断服务程序的静态模板成员函数

编译多个文件错误

c - 为什么 C 头文件 stdio.h 中的 fopen 原型(prototype)中有 (const char * ) 参数

c# - 在 C# 项目 : Can we mix raw C and C# code (VS10) 的 C 部分

c++ - 尽管链接了库文件夹中的 .so 文件,但缺少 .h 文件

c - MikroC 中的嵌套调用限制是什么?

c - 在哪里编写中断处理程序以及如何在 Linux 中向内核注册?

c - 引用数组指针中的值 (c)

c - 避免 C 中的浮点运算

linux - Octave Ctrl-C 关闭编辑窗口