реклама на сайте
подробности

 
 
> STM32 выход из режима STOP, не срабатывает прерывание
Habr
сообщение Nov 21 2013, 14:10
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 62
Регистрация: 11-10-10
Пользователь №: 60 067



Доброго времени суток.
Разбираюсь с программированием процессора 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.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 4)
mstumbra
сообщение Nov 22 2013, 07:26
Сообщение #2


Участник
*

Группа: Участник
Сообщений: 15
Регистрация: 14-04-10
Пользователь №: 56 652



Обратите внимание, что в 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 Режима обычное внешнее прерывание вывести не может.

Также обратите внимание, что внутрисхемные отладчики нередко неадекватно реагируют на спящий режим контроллера, поэтому определять спит он или нет желательно другими способами
Go to the top of the page
 
+Quote Post
smk
сообщение Nov 22 2013, 07:30
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 2 246
Регистрация: 17-03-05
Из: Украина, Киев
Пользователь №: 3 446



Вероятно не стоит уходить в сон из прерывания. Ставьте в прерывании флаг, а в сон уже по флагу в основном цикле.


--------------------
Живи днем так, чтобы ночью ты спал спокойно.
Go to the top of the page
 
+Quote Post
mstumbra
сообщение Nov 22 2013, 07:36
Сообщение #4


Участник
*

Группа: Участник
Сообщений: 15
Регистрация: 14-04-10
Пользователь №: 56 652



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

Если вы раньше настраивали внутреннюю подтяжку на + питание и кнопкой замыкали ножку на землю, то прерываения формироваться не будут
Go to the top of the page
 
+Quote Post
Habr
сообщение Nov 24 2013, 00:03
Сообщение #5


Участник
*

Группа: Участник
Сообщений: 62
Регистрация: 11-10-10
Пользователь №: 60 067



Большое спасибо всем отписавшимся!
Проблема решена, действительно, нельзя вызывать команду __WFI() в обработчике внешнего прерывания, как только вынес её в основной цикл всё сразу заработало.
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 1st August 2025 - 22:18
Рейтинг@Mail.ru


Страница сгенерированна за 0.01377 секунд с 7
ELECTRONIX ©2004-2016