Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: STM32 выход из режима STOP
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > ARM, 32bit
Habr
Доброго времени суток.
Разбираюсь с программированием процессора stm32f205. Есть кнопка подключённая к ножке PA0, необходимо чтобы по нажатию кнопки процессор уходил в режим пониженного энергопотребления а при повторном нажатии возвращался в рабочий режим.
Для этого я :
настраиваю ножку PA0 (MRset_Bit0, MSet_Bit1 макросы установки сброса битов типа #define MSet_Bit0 |=0x01 #define MRset_Bit0 &=~0x01)
Код
RCC->AHB1ENR MSet_Bit0;  // подаём синхронизацию на порты A
RCC->AHB1LPENR MSet_Bit0; // включаем порт А в режиме низкого потребления
GPIOA->MODER MRset_Bit0; // альтернативная функция
GPIOA->MODER MSet_Bit1;
GPIOA->PUPDR MRset_Bit0; // подтяжка к 0
GPIOA->PUPDR MSet_Bit1;
EXTI->IMR MSet_Bit0;      // разрешение  прерывания по 0 ноге
EXTI->RTSR MSet_Bit0;     // прерывание по фронту

включаю прерывание
Код
NVIC_EnableIRQ (EXTI0_IRQn); // разрешаем прерывание от PA0

и собственно сам обработчик
Код
void EXTI0_IRQHandler(void) // прерывание от кнопки включения PA0
{
    long i;
    //***** задержка для исключения дребезга**********************
    //!!!!!!!!!!!!!!!!!!потом переписать!!!!!!!!!!!!!!!!!!!!!!!!!
    for (i=0;i<1000000;i++)
    {
        GPIOA->MODER MRset_Bit0; //задержка для исключения дребезга кнопки
    }
    //**************************************************************
    EXTI->PR MSet_Bit0; // сброс флага прерывания
    if (proc_mode==run) // текущий режим активный
    {
        //***** переход в спящий режим********************
            deinit_for_sleep(); // вырубаем переферию
            SCB->SCR MSet_Bit2; // режим stop
            PWR->CSR MSet_Bit0; //
            proc_mode=stop;
            __WFI();
        //************************************************
    }
    else // текущий режим сон
    {
        proc_mode=run;
        main_init();
    }
}

однако после перехода в спящий режим процессор перестаёт реагировать на прерывания
если закоментировать строчку __WFI(); то реакция на прерывания остаётся перефирия инициализируется/ деинициализируется.
Как же правилно настроить выход из режима Stop.
mstumbra
Обратите внимание, что в Reference Manual (RM0033)
В Table 7. Low-power mode summary указано, что для входа в STOP mode должны стоять биты LPDS, PDDS
НО в Table 10. Stop mode указано, что должен стоять бит LPDS и НЕ стоять PDDS

В таблице StandBy режима и описании регистров PWR также указано, что PDDS==1 - это StandBy режим

А из StandBy Режима обычное внешнее прерывание вывести не может.

Также обратите внимание, что внутрисхемные отладчики нередко неадекватно реагируют на спящий режим контроллера, поэтому определять спит он или нет желательно другими способами
smk
Вероятно не стоит уходить в сон из прерывания. Ставьте в прерывании флаг, а в сон уже по флагу в основном цикле.
mstumbra
Вы также можете выйти из StandBy режима, если поставите бит EWUP(Включение WakeUP pin)
Но в этом случае обратите внимание на вашу схемотехнику, т.к. в этом случае ножка будет настроена автоматически на вход с подтяжкой к земле.

Если вы раньше настраивали внутреннюю подтяжку на + питание и кнопкой замыкали ножку на землю, то прерываения формироваться не будут
Habr
Большое спасибо всем отписавшимся!
Проблема решена, действительно, нельзя вызывать команду __WFI() в обработчике внешнего прерывания, как только вынес её в основной цикл всё сразу заработало.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.