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

 
 
> Грабли с энергосбережением STM32F0, STM32F0 low power mode, exti
stas00n
сообщение Jan 25 2018, 09:44
Сообщение #1


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

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



Понадобилось тут "усыпить" STM32F030R8 чтобы только часы работали от резервной батарейки. Сделал вроде все по уму - висячие и не нужные ноги сконфигурировал выходами, где надо pullup/pulldown в нужную сторону, усыпляю - жрет 500 мкА. Перешерстил схему, код, прощупал все в поисках неправильных подтяжек и паразитных питаний - все ОК. Перечитал Reference manual, Datasheet и еррату. Все по науке, криминала не нашел. Поменял контроллер - предположил что подпаленный - результат тот же, - 450-500 мкА.
Вернулся к коду. В начале main инициализирую RCC и GPIO, усыпляю - потребляет 30 мкА, как и должно. Значит проблема в какой-то периферии далее. Копаю дальше не маленький код, тыкаю осциллографом, листаю регистры в отладчике, построчно комментирую. Проблема то появится то исчезнет, на ее локализацию ушло полдня и много нервных клеток.
Причина: используется у меня ножка GPIOB1 как вход для внешнего прерывания в режиме когда подключено основное питание. Подтянута вверх. Во сне эта ножка не нужна и я ее подтягиваю к земле, чтобы не давала паразитного питания на остальную схему которая обесточена. Перед этим, естественно, запрещаю соответствующее прерывание. Причем запрещал только в NVIC, а в регистрах EXTI->IMR, EXTI->FTSR оставлял разрешенным. В результате, как только я (перед сном sm.gif )дрыгаю этой ногой вниз, взводится флаг в EXTI->PR, но прерывание не возникает, поскольку запрещено в NVIC. Так вот, если контроллер теперь положить в любой из энергосберегающих режимов, с установленными битами в PR - он будет потреблять лишние 450 мкА!
Решение:
1. Если надо запретить внеш. прерывание, делать это сначала в периф. модуле, а уж потом, если есть необходимость - в NVIC.
2. После запрета в NVIC - вручную сбросить pending bits, если таковые появились.
3. После выполнения п.2 сразу переводить МК в low power mode, не дрыгая ногами.
Код для "воспроизведения" граблей:
CODE
void Exti_Leak_Test()
{
// Включаем тактирование..
RCC_AHBPeriphClockCmd((RCC_AHBPeriph_GPIOA |
RCC_AHBPeriph_GPIOB |
RCC_AHBPeriph_GPIOC |
RCC_AHBPeriph_GPIOD |
RCC_AHBPeriph_GPIOF ), ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);

// ..и инициализируем GPIO
GPIO_InitTypeDef io;
// Все "не нужные" входы подтягиваем:
io.GPIO_Mode = GPIO_Mode_IN;
io.GPIO_OType = GPIO_OType_PP;
io.GPIO_PuPd = GPIO_PuPd_DOWN;
io.GPIO_Speed = GPIO_Speed_Level_1;
// Пины SWD не трогаем
io.GPIO_Pin = (GPIO_Pin_All & (~GPIO_Pin_13) & (~GPIO_Pin_14));
GPIO_Init(GPIOA, &io);

io.GPIO_Pin = GPIO_Pin_All;
GPIO_Init(GPIOB, &io);
GPIO_Init(GPIOC, &io);
GPIO_Init(GPIOD, &io);
GPIO_Init(GPIOF, &io);

// Настраиваем внешнее прерывание:
SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOB, EXTI_PinSource1);

EXTI_InitTypeDef exti;
exti.EXTI_Line = EXTI_Line1;
exti.EXTI_Trigger = EXTI_Trigger_Rising;
exti.EXTI_Mode = EXTI_Mode_Interrupt;
// ..и разрешаем его в периф. модуле, но не разрешаем в NVIC
exti.EXTI_LineCmd = ENABLE;
EXTI_Init(&exti);

// "Генерируем" прерывание дергая подтяжку на PB1
GPIOB->PUPDR &= ~(0xC);
GPIOB->PUPDR |= 4;

// Ждем нарастания фронта
volatile uint32_t delay = 1000;
while(--delay);

// Возвращаем подтяжку PB1 к земле
GPIOB->PUPDR &= ~(0xC);
GPIOB->PUPDR |= 8;

// Если не сбросить бит в EXTI->PR, будет лишнее потребление тока
//EXTI->PR = 2;

// Переходим в режим STOP
//PWR_EnterSTOPMode(PWR_Regulator_LowPower, PWR_STOPEntry_WFI);
// ..или StandBy
PWR_EnterSTANDBYMode();
// Тут отладчик отвалится, смотрим на амперметр.
// Также надо отключить разъем отладчика - он тоже потребляет ток.
}


Может кому поможет. Сам я не нашел ни предупреждений в документации, ни прецедентов в гугле.

Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- - KnightIgor   Цитата(stas00n @ Jan 25 2018, 10:44) усып...   Jan 25 2018, 11:13
|- - stas00n   Цитата(KnightIgor @ Jan 25 2018, 13:13) П...   Jan 25 2018, 11:45
|- - KnightIgor   Цитата(stas00n @ Jan 25 2018, 12:45) При ...   Jan 25 2018, 12:05
- - stas00n   Действительно, забыл подать клок на секцию PWR. По...   Jan 25 2018, 12:40
|- - KnightIgor   Цитата(stas00n @ Jan 25 2018, 13:40) Дейс...   Apr 27 2018, 16:16
|- - Сергей Борщ   QUOTE (KnightIgor @ Apr 27 2018, 19:16) К...   Apr 27 2018, 20:19
|- - KnightIgor   Цитата(Сергей Борщ @ Apr 27 2018, 21:19) ...   Apr 29 2018, 20:07
||- - aaarrr   Цитата(KnightIgor @ Apr 29 2018, 23:07) П...   Apr 29 2018, 20:25
||- - KnightIgor   Цитата(aaarrr @ Apr 29 2018, 21:25) Хм. Н...   Apr 29 2018, 22:33
||- - aaarrr   Цитата(KnightIgor @ Apr 30 2018, 01:33) И...   Apr 29 2018, 22:55
||- - KnightIgor   Цитата(aaarrr @ Apr 29 2018, 23:55) Прове...   Apr 30 2018, 15:48
|- - KnightIgor   Цитата(Сергей Борщ @ Apr 27 2018, 21:19) ...   Sep 26 2018, 12:36
- - amiller   А ток потребления измеряете до линейника 3V3 или п...   May 1 2018, 05:16
- - k155la3   Цитата(amiller @ May 1 2018, 08:16) . . ....   May 1 2018, 10:23
|- - amiller   Цитата(k155la3 @ May 1 2018, 13:23) На ма...   May 1 2018, 11:44
|- - k155la3   Цитата(amiller @ May 1 2018, 14:44) Может...   May 1 2018, 11:51
- - KnightIgor   Цитата(amiller @ May 1 2018, 06:16) А ток...   May 3 2018, 10:37
- - KnightIgor   Цитата(KnightIgor @ May 3 2018, 11:37) Ка...   May 4 2018, 12:41
- - Baser   Цитата(KnightIgor @ May 3 2018, 13:37) Ка...   May 4 2018, 13:54
- - KnightIgor   Цитата(Baser @ May 4 2018, 14:54) Это еще...   May 7 2018, 18:40
- - zhevak   Цитата(KnightIgor @ May 7 2018, 23:40) Гд...   May 14 2018, 07:35
- - KnightIgor   Цитата(zhevak @ May 14 2018, 08:35) 1. Не...   May 15 2018, 07:35
- - zhevak   Цитата(KnightIgor @ May 15 2018, 12:35) М...   May 15 2018, 07:50
- - zhevak   Коллеги! Двумя комментариями выше я привёл код...   May 20 2018, 06:09


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

 


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


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