arm - STM32L0 在设置 NVIC/GPIO 时冻结
问题描述
我正在使用运行 MbedOS 5.11.2 的 STM32L073RZ CPU。最终,我的目标是让它在一个非常低功耗的模式(STOP
模式)下工作,该模式将被 RTC 中断或来自引脚PA_0
(WAKEUP_PIN_1
)上的外围设备的中断唤醒。目前我只是尝试使用 STM32 API设置PA_0
为中断。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_TICKLESS=1
在您的 mbed_app.json 中设置宏),只要所有线程都处于空闲状态,MCU 就会自动进入停止模式。如果您想唤醒,您可以使用InterruptIn
pin 上的 an 或使用LowPowerTicker
.
如果您正在寻找绝对最低功耗模式,您可以使用这里有一个库的待机功能(不保留 RAM):stm32-standby-rtc-wakeup。
推荐阅读
- python - Seaborn kde 绘制概率而不是密度(没有条形的 histplot)
- python - pip 版本的 Devstack 安装问题
- c - 如何在线程执行循环迭代时继续使用master?
- wordpress - 如何在成功保存后加载一次渲染来解决此 Wordpress Custom Gutenburg 块问题?
- sql - 如何将 DATE_TRUNC 提前 10 天
- javascript - 错误请求:无法解析实体:找不到从字节偏移 3589 开始的实体的结尾(在 bot 电报 api 中)JavaScript
- javascript - 在 div 中制作 X 的问题 用于使 div 消失
- javascript - nativescript:使用 ajax(获取)发布请求上传使用相机拍摄的图像
- android - 我如何为 android 应用程序使用开源代码,对其进行修改并将其发布到 Playstore,例如 Tachiyomi
- html - Bootstrap 4粘性下拉和粘性导航重叠问题