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

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> stm32 stop mode, Не могу разбудить микроконтроллер внешним прерыванием
nx6310
сообщение Aug 18 2010, 08:54
Сообщение #1


Участник
*

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



Здраствуйте. Микроконтроллер stm32 перевожу в энергосберегающий режим STOP. А выйти из него в нормальный режим по внешнему прерыванию не получается. В нормальном режиме внешнее прерывание работает. В стоп-режиме не работает. Кто нибудь сталкивался с такой проблемой?. Код программы ниже:
Код
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_AFIO, ENABLE);   //тактирование периферийных устройств
RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE);

     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1|GPIO_Pin_3|GPIO_Pin_10;
     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;           // конифгурация вывода РА1 как вход
     GPIO_Init(GPIOA, &GPIO_InitStructure);                                        //

GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource1);    //РА1 источник прерывания линии 1

    EXTI_InitStructure.EXTI_Line = EXTI_Line1;                         // настрока
    EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;         // внешнего
    EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;        //прерывания
    EXTI_InitStructure.EXTI_LineCmd = ENABLE;                       //  - прерывание по пер.фронту
    EXTI_Init(&EXTI_InitStructure);

PWR_PVDLevelConfig(PWR_PVDLevel_2V2);  // включение детектора
PWR_PVDCmd(ENABLE);        // напряжения питания

NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);                    //настойка приоритета
   NVIC_InitStructure.NVIC_IRQChannel = EXTI1_IRQn;             // и разрешение
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; // канала прерывания EXTI1
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;           // в контроллере прерываний
    NVIC_Init(&NVIC_InitStructure);

...
...
PWR_EnterSTOPMode(PWR_Regulator_LowPower, PWR_STOPEntry_WFI); // переход в режим стоп


Подпрограмма обработки прерывания
Код
void EXTI1_IRQHandler(void){
if(EXTI_GetITStatus(EXTI_Line1) != RESET)
      {GPIO_WriteBit(GPIOB, GPIO_Pin_9, Bit_SET);
        if(PWR_GetFlagStatus(PWR_FLAG_WU) != RESET)
        {
          /* Clear Wake Up flag */
          PWR_ClearFlag(PWR_FLAG_WU);
        }
      print("PRERIVANIE 1");
        /* Clear the Key Button EXTI line pending bit */
        EXTI_ClearITPendingBit(EXTI_Line1);
      }
}


Тут на руском языке инфа есть немного http://www.gaw.ru/html.cgi/txt/doc/micros/...x_arh/index.htm
Go to the top of the page
 
+Quote Post
Basilij
сообщение Aug 23 2012, 04:13
Сообщение #2


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

Группа: Участник
Сообщений: 175
Регистрация: 7-04-11
Пользователь №: 64 190



Прошло два года с момента публикации. Удалось ли вам тогда пробуждать микроконтроллер из STOP режима, по внешнему сигналу на любой ножке?
Go to the top of the page
 
+Quote Post
vlad_new
сообщение Aug 23 2012, 11:30
Сообщение #3


Местный
***

Группа: Участник
Сообщений: 218
Регистрация: 24-06-10
Пользователь №: 58 127



Цитата(Basilij @ Aug 23 2012, 08:13) *
Прошло два года с момента публикации. Удалось ли вам тогда пробуждать микроконтроллер из STOP режима, по внешнему сигналу на любой ножке?

Я не Он, но режим STOP использовал. Все работает и от лапок и от RTC.
Go to the top of the page
 
+Quote Post
Basilij
сообщение Aug 23 2012, 12:43
Сообщение #4


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

Группа: Участник
Сообщений: 175
Регистрация: 7-04-11
Пользователь №: 64 190



Цитата(vlad_new @ Aug 23 2012, 17:30) *
Я не Он, но режим STOP использовал. Все работает и от лапок и от RTC.


Спасибо за ответ. Не подскажите а для чего тогда пин WKUP ?(PA0)
Go to the top of the page
 
+Quote Post
vlad_new
сообщение Aug 23 2012, 13:01
Сообщение #5


Местный
***

Группа: Участник
Сообщений: 218
Регистрация: 24-06-10
Пользователь №: 58 127



Цитата(Basilij @ Aug 23 2012, 16:43) *
Спасибо за ответ. Не подскажите а для чего тогда пин WKUP ?(PA0)

А это еще для более глубокого сна, когда вырубается вообще все. Энергопотребление в Stop режиме коло 13 мкА, а когда все вырубается, то около <1 мкА.
Но разбудить его можно только лапкой резет или wkup. По сути этот вывод служит для подключения (к примеру) кнопки включения/отключения устройства с батарейным питанием, ну что то типа кнопки Power.

Go to the top of the page
 
+Quote Post
Basilij
сообщение Aug 23 2012, 13:12
Сообщение #6


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

Группа: Участник
Сообщений: 175
Регистрация: 7-04-11
Пользователь №: 64 190



Прояснили! :смайлик низкий поклон:
Вот я этой разницы про Глубокий Стоп и не очень Глубокий, понять и не мог. Как понимаю при не глубоком Стопе состояние пинов сохраняються. При не глубоком не сохраняются и при переходе в активный режим происходит перенициализация всего. Верно резюмировал!?
Go to the top of the page
 
+Quote Post
vlad_new
сообщение Aug 24 2012, 12:52
Сообщение #7


Местный
***

Группа: Участник
Сообщений: 218
Регистрация: 24-06-10
Пользователь №: 58 127



В режиме Ожидания (Standby) все I/O выводы находятся в высоко-импедансном состоянии, за
исключением:
• Вход Сброса (все еще доступен))
• Вывод TAMPER, если он сконфигурирован как вход сброса резервных данных или как
выход калибровки.
• Вход пробуждения WKUP, если разрешен
Go to the top of the page
 
+Quote Post
MiklPolikov
сообщение Aug 29 2012, 00:52
Сообщение #8


Гуру
******

Группа: Свой
Сообщений: 2 015
Регистрация: 23-01-07
Из: Москва
Пользователь №: 24 702



Цитата(vlad_new @ Aug 23 2012, 17:01) *
А это еще для более глубокого сна, когда вырубается вообще все. Энергопотребление в Stop режиме коло 13 мкА, а когда все вырубается, то около <1 мкА.

13мка , это вы для какого процессора смотрите ? У моего STM32L151 вроде бы 1.6мка в режиме STOP with RTC

Где почитать про использование этого режима ?
После выхода из STOP выполнение команды начинается с того места где остановилось, или с начала ?
Если с начала, то как понять что это не несет а выход из STOP ? и т.д.


--------------------
Если у Вас нет практического опыта в данной теме- не вступайте в дискуссию и не пишите никаких теоретических рассуждений! Заранее спасибо !
Go to the top of the page
 
+Quote Post
nx6310
сообщение Oct 19 2012, 09:55
Сообщение #9


Участник
*

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



stop режим не сбрасывает микроконтроллер, т.е. после пробуждения программа продолжает работать. После STAND-BY программа перезапускается
Go to the top of the page
 
+Quote Post
MK2
сообщение Jan 18 2013, 16:31
Сообщение #10


Местный
***

Группа: Свой
Сообщений: 202
Регистрация: 30-10-10
Пользователь №: 60 535



Столкнулся с проблемой точно наоборот... проц stm32f100c4t6 не хочет засыпать.
конфиг EXTI
Код
   /* Configure EXTI0 line */
   EXTI_InitStructure.EXTI_Line = EXTI_Line10 |  EXTI_Line11 | EXTI_Line12 | EXTI_Line13 | EXTI_Line14 | EXTI_Line15;
   EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
   EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;  
   EXTI_InitStructure.EXTI_LineCmd = ENABLE;
   EXTI_Init(&EXTI_InitStructure);

cами ножки
Код
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
  
    /* Configure PB.10 -15 pin as input floating */
   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10 | GPIO_Pin_11 | GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15;
   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
   GPIO_Init(GPIOB, &GPIO_InitStructure);
  
   /* Enable AFIO clock */
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
  
   /* Connect EXTI0 Line to PA.00 pin */
  GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource10);
  GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource11);
  GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource12);
  GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource13);
  GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource14);
  GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource15);

код такой
Код
/****.....................***/
   RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE);
    DMA1->IFCR = 0;
      ADC1->CR2 &= ~1;
      DMA1_Channel1->CCR &= ~1;
      DMA1_Channel4->CCR &= ~1;
      DMA1_Channel6->CCR &= ~1;
  /* Request to enter STOP mode with regulator in low power mode*/
     PWR_EnterSTOPMode(PWR_Regulator_LowPower, PWR_STOPEntry_WFI);
     SYSCLKConfig_STOP();
           ADC1->CR2 |= 1;
      DMA1_Channel1->CCR |= 1;
      DMA1_Channel4->CCR |= 1;
      DMA1_Channel6->CCR |= 1;
.....................................................

дма запрещаю так как в доке написано если идет обмен по шине или пишется флеш то он игнорит вход в STOP MODE
Цитата
If Flash memory programming is ongoing, the Stop mode entry is delayed until the memory
access is finished.
If an access to the APB domain is ongoing, The Stop mode entry is delayed until the APB
access is finished.

все pending flag сборшены перед входом
вообще не понимаю почему он не "устает"
Go to the top of the page
 
+Quote Post
MiklPolikov
сообщение Jan 19 2013, 05:11
Сообщение #11


Гуру
******

Группа: Свой
Сообщений: 2 015
Регистрация: 23-01-07
Из: Москва
Пользователь №: 24 702



Цитата(MK2 @ Jan 18 2013, 20:31) *
Столкнулся с проблемой точно наоборот... проц stm32f100c4t6 не хочет засыпать.


Что значит "не хочеч засыпать?" Не хочет уменьшать энергопотребление, не хочет останавливать тактирование ядра,.... ?


--------------------
Если у Вас нет практического опыта в данной теме- не вступайте в дискуссию и не пишите никаких теоретических рассуждений! Заранее спасибо !
Go to the top of the page
 
+Quote Post
vlad_new
сообщение Jan 19 2013, 07:39
Сообщение #12


Местный
***

Группа: Участник
Сообщений: 218
Регистрация: 24-06-10
Пользователь №: 58 127



Если ADC включен, то не уснет. Для F4 может и ещё есть какието исключения.
Go to the top of the page
 
+Quote Post
MK2
сообщение Jan 22 2013, 08:40
Сообщение #13


Местный
***

Группа: Свой
Сообщений: 202
Регистрация: 30-10-10
Пользователь №: 60 535



Цитата(vlad_new @ Jan 19 2013, 10:39) *
Если ADC включен, то не уснет. Для F4 может и ещё есть какието исключения.


В рефернесе на F1 сказано что уснет все кроме АЦП поэтому его отдельно выключать надо.

Выяснилось вот что усыпает но с выдернутым житагом! вот так вот
Правда выяснилось другое... После просыпа не работает прерывания на прием уарта, причем не понятно то ли сам уарт глючит то ли это от того что я до этого все порты в Floating mode переводил. Передача по уарту тем не менее идет.
Go to the top of the page
 
+Quote Post
MK2
сообщение Jan 22 2013, 10:45
Сообщение #14


Местный
***

Группа: Свой
Сообщений: 202
Регистрация: 30-10-10
Пользователь №: 60 535



и еще вдогонку...
с уартом дело похоже оказалось в портах... переводишь хотя бы один порт в float mode и все он накрывается даже если USART1 висит на А, а переводишь порт В
и еще в STOPMODE нельзя переходить в прерывании! обратно он не возращается((
походу в этом и была бага топикстатера
Go to the top of the page
 
+Quote Post
MiklPolikov
сообщение Feb 8 2013, 15:48
Сообщение #15


Гуру
******

Группа: Свой
Сообщений: 2 015
Регистрация: 23-01-07
Из: Москва
Пользователь №: 24 702



Цитата(vlad_new @ Aug 24 2012, 16:52) *
В режиме Ожидания (Standby) все I/O выводы находятся в высоко-импедансном состоянии, за
исключением:
• Вход Сброса (все еще доступен))
• Вывод TAMPER, если он сконфигурирован как вход сброса резервных данных или как
выход калибровки.
• Вход пробуждения WKUP, если разрешен


Почему-то у меня не выходит из STANDBY по ноге WKUP2. По RTC выходит.
Достаточно ли только разрешить Вэйкап в регистре PWR->CSR ? Может надо ещё где-то что-то включить, ногу как-то настроить ?

Наблюдаю вот что :
-Вхожу в STANDBY
-Пытаюсь выйти по WKUP2 - не получается.
-Выхожу по RTC
-Снова вхожу в STANDBY
И вот после второго входа в STANDBY проц висит и не реагирует ни на что даже на ногу RESET. Помогает только сброс питания.
Если не входить в STANDBY то разумеется прерывания от RTC не вызывают зависания т.е. дело не в кривом обработчике.



Код
     PWR->CSR |=PWR_CSR_EWUP2; // разрешили Вэйкап2


        SCB->SCR |=SCB_SCR_SLEEPDEEP; //
    PWR->CR |= PWR_CR_PDDS; //Set PDDS bit in Power Control register (PWR_CR)   //выбрали  способ сна  STANDBY
    __WFI();  //заснули


--------------------
Если у Вас нет практического опыта в данной теме- не вступайте в дискуссию и не пишите никаких теоретических рассуждений! Заранее спасибо !
Go to the top of the page
 
+Quote Post

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

 


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


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