Доброго времени суток.
Разбираюсь с программированием процессора 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.