STM32L0 Стоп при настройке NVIC / GPIO - PullRequest
0 голосов
/ 14 марта 2019

Я работаю с процессором STM32L073RZ под управлением MbedOS 5.11.2. В конце концов я стремлюсь заставить это работать в режиме очень низкого энергопотребления (режим STOP), который будет вызываться либо прерыванием RTC, либо прерыванием от периферийного устройства на выводе PA_0 (WAKEUP_PIN_1). В данный момент я просто пытаюсь настроить PA_0 как прерывание, используя STM32 HAL API. Пожалуйста, смотрите мой код ниже:

#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. Моя проблема заключается в следующем:

Если я выполняю настройку GPIO перед настройкой NVIC, то программа, кажется, зависает на HAL_NVIC_SetPriority(), однако, если я выполняю настройку NVIC перед настройкой GPIO, тогда, кажется, код зависает на HAL_NVIC_EnableIRQ().

Я полностью озадачен тем, что является причиной этого. Любое понимание очень ценится.

1 Ответ

2 голосов
/ 15 марта 2019

Вам не нужно делать это вручную. Пока вы запускаете Mbed OS в режиме без галочек (установите макрос MBED_TICKLESS=1 в вашем mbed_app.json), MCU будет автоматически переходить в режим остановки всякий раз, когда все потоки простаивают. Если вы хотите проснуться, вы можете использовать InterruptIn на булавке или LowPowerTicker.

Если вы ищете режимы абсолютного минимального энергопотребления, вы можете использовать функцию ожидания (без сохранения ОЗУ), для которой здесь есть библиотека: stm32-standby-rtc-wakeup .

...