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

 
 
> STM32L151 режим STOP
data_stack
сообщение Feb 16 2016, 14:49
Сообщение #1


Участник
*

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



Мозг дымится, прям беда какая то, никак не приручить STOP режим
Есть кнопка 1, на которую нужно однократно нажать и ввести мк в стоп. Будить планирую другой кнопкой.
Код
void EXTI2_IRQHandler(void)
{
    if(EXTI_GetITStatus(EXTI_Line2) != RESET)
    {      
        NVIC_DisableIRQ(EXTI2_IRQn);        
        stop_enable = 1;
        LED1_TOGGLE();
        EXTI_ClearITPendingBit(EXTI_Line2);        
    }
}


В основном цикле чекаю флаг кнопки. После его срабатывания ухожу в стоп. Но беда в том, что контроллер не засыпает. Детектирую это светодиодом 2.
Код
while(1) {                      
       if(stop_enable == 1)  {
           PWR_EnterSTOPMode(PWR_Regulator_LowPower, PWR_STOPEntry_WFI);
           stop_enable = 0;
           LED2_TOGGLE();
           NVIC_EnableIRQ(EXTI2_IRQn);      
       }          
}


Если вводить в сон не по кнопке, то все ок, но нужно именно по кнопке. Создалось впечатление что NVIC_DisableIRQ(EXTI2_IRQn) не отрабатывает, проверил отдельно от этого куска кода - работает. По отдельности все работает, сама проблема в том что именно этот кусок не работает, как сделать по другому не понятно.
ЗЫ видел аналогичные темы, выдергивание swd не помогло. Ввожу в стоп не в прерывании.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
AlanDrakes
сообщение Feb 16 2016, 16:05
Сообщение #2


Частый гость
**

Группа: Участник
Сообщений: 101
Регистрация: 2-05-15
Из: Россия, Омск
Пользователь №: 86 474



У меня работает отлично вот такой код:
Код
volatile char test = 0;

void EXTI2_IRQHandler(void) {
    test = 1;
    EXTI->PR = 4; // Очищаем бит ожидающего прерывания
};
(В main())
<...>
    EXTI->RTSR |= 4; // По фронту импульса
    EXTI->IMR |= 4; // Разрешить генерировать прерывание
    NVIC_EnableIRQ(EXTI2_IRQn); // Разрешить само прерывание
    while (1) {
        if (test == 1) {
            test = 0;
            PWR->CR |= PWR_CR_PDDS | PWR_CR_LPSDSR; // Маломощный сон
            SCB->SCR |= SCB_SCR_SLEEPDEEP; // Последний бит, позволяющий именно STOP
            __WFI();
        };
    };
<...>


Буквально только что заставил работать код на реальном железе. Да, у меня есть плата с этим кристаллом.
Останавливается именно после команды __WFI(); и ждёт ближайшего следующего прерывания.

Сообщение отредактировал AlanDrakes - Feb 16 2016, 16:11
Go to the top of the page
 
+Quote Post



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

 


RSS Текстовая версия Сейчас: 24th July 2025 - 15:46
Рейтинг@Mail.ru


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