我正在使用运行MbedOS 5.11.2的STM32L073RZ CPU。最终我的目标是让它在一个非常低功耗模式(STOP
模式)下工作,该模式将被一个RTC中断或来自引脚PA_0
(WAKEUP_PIN_1
)的外围设备的中断唤醒。目前我只是尝试使用STM32 PA_0
API将HAL
设置为中断。请参阅下面的代码:
#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。