STM32L0 冻结设置 NVIC/GPIO

STM32L0 Freeze on setting NVIC/GPIO

我正在使用 STM32L073RZ CPU 运行 MbedOS 5.11.2。最终我的目标是让它在非常低功耗的模式(STOP 模式)下工作,该模式将被 RTC 中断或引脚 PA_0 上的外围设备中断唤醒(WAKEUP_PIN_1).目前,我只是尝试使用 STM32 HAL API 将 PA_0 设置为中断。请在下面查看我的代码:

#include "mbed.h"

#define LOG(...) pc.printf(__VA_ARGS__); pc.printf("\r\n");

DigitalOut  led(LED1);
Serial      pc(USBTX, USBRX);

void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) {
    led = !led;
}

int main()
{
    pc.baud(9600);
    led = 1;

    // GPIO SETUP
    LOG("Enabling GPIO port A clock");
    __HAL_RCC_GPIOA_CLK_ENABLE();
    GPIO_InitTypeDef GPIO_InitStruct;
    GPIO_InitStruct.Pin = GPIO_PIN_0;
    GPIO_InitStruct.Mode = GPIO_MODE_IT_RISING;
    GPIO_InitStruct.Pull = GPIO_NOPULL;
    LOG("Initialising PA_0");
    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

    // NVIC SETUP
    LOG("Setting IRQ Priority");
    HAL_NVIC_SetPriority(EXTI0_1_IRQn, 0, 1); // Priorities can be 0, 1, 2, 3 with lowest being highest prio
    LOG("Enabling IRQ");
    HAL_NVIC_EnableIRQ(EXTI0_1_IRQn);

    LOG("Going into STOP mode");
    HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON, PWR_STOPENTRY_WFE);
}

如您所见,代码分为两部分:GPIO 设置和 NVIC 设置。我的问题如下:

如果我在 NVIC 设置之前执行 GPIO 设置,那么程序似乎会挂起 HAL_NVIC_SetPriority(),但是,如果我在 GPIO 设置之前执行 NVIC 设置,那么代码似乎会挂起 HAL_NVIC_EnableIRQ()

我完全不知道是什么原因造成的。非常感谢任何见解。

您不需要手动执行此操作。只要你 运行 Mbed OS 处于无滴答模式(在你的 mbed_app.json 中设置 MBED_TICKLESS=1 宏),只要所有线程都空闲,MCU 就会自动进入停止模式。如果你想醒来,你可以在引脚上使用 InterruptIn 或使用 LowPowerTicker.

如果您正在寻找绝对最低功耗的模式,您可以使用待机功能(不保留 RAM),这里有一个库:stm32-standby-rtc-wakeup