Перейти к содержанию
    

Потребление контроллера AT32F421F8P7 в режиме Standby

Всем привет. Перевожу контроллер AT32F421F8P7 в режим Standby, при этом потребление составляет порядка 250мкА. Измерения производил мультиметром Keithley DMM6500. Вывод из сна производится сбросом по IWDG, т.е. работает низкочастотный внутренний генератор на 40кГц. Для чистоты эксперимента выводы портов никуда не подключены. Пробовал, чтобы не было "висячек", перед переводом в Standby, включать их на вход с подтяжкой вверх и вниз, включал на выход с выводом нуля и единицы, переводил в аналоговый режим - на потребляемый ток это не повлияло. По даташиту ток в режиме Standby должен быть менее 8мкА.

Кому-нибудь приходилось переводить AT32F421F8P7 в режим Standby с током потребления, соответствующим даташиту, т.е. менее 8мкА? Видимо, где-то у меня ошибка, но не могу понять, где. Помогите, пожалуйста, найти.

Вот моя функция, котороая переводит контроллер в Standby. В первой части - настройка IWDG, во второй - перевод в Standby. Закомментированные строчки - варианты настройки GPIO, которые я использовал в ходе эксперимента.

Spoiler
void power_sleep(void)
{
    IWDG->KEY = (uint16_t)0x5555;   // Unlock IWDG regs
    IWDG->PSC = (uint16_t)0x07;
    
//    IWDG->RLD = 0x00000FFF;         // 30 sec
//    IWDG->RLD = 0x000007FF;         // 15 sec
    IWDG->RLD = 0x000003FF;         // 7,5 sec
    
    IWDG->KEY = (uint16_t)0xAAAA;   // Lock IWDG regs and Reload
    IWDG->KEY = (uint16_t)0xCCCC;   // IWDG start!

//=============================================    

    PWR->CTRL2 = 0x00000000;
    SCB->SCR |= SCB_SCR_SLEEPDEEP;
    PWR->CTRL |= PWR_CTRL_PDDS;
    PWR->CTRL |= PWR_CTRL_LDDS;
    PWR->CTRL |= PWR_CTRL_CLWUF;
    nvic_irq_disable(TMR6_GLOBAL_IRQn);
    RCC->BDC &= ~RCC_BDC_ERTCEN;


//    GPIOA->MODER = 0xFFFFFFFF;
//    GPIOB->MODER = 0xFFFFFFFF;
//    GPIOF->MODER = 0xFFFFFFFF;

    GPIOA->MODER = 0x55555555;
    GPIOB->MODER = 0x55555555;
    GPIOF->MODER = 0x55555555;

//    GPIOA->MODER = 0x00000000;
//    GPIOB->MODER = 0x00000000;
//    GPIOF->MODER = 0x00000000;
    
//    GPIOA->PUPDR = 0xAAAAAAAA;
//    GPIOB->PUPDR = 0xAAAAAAAA;
//    GPIOF->PUPDR = 0xAAAAAAAA;

    GPIOA->PUPDR = 0x55555555;
    GPIOB->PUPDR = 0x55555555;
    GPIOF->PUPDR = 0x55555555;


//    GPIOA->OTYPER = 0x0000FFFF;
//    GPIOB->OTYPER = 0x0000FFFF;
//    GPIOF->OTYPER = 0x0000FFFF;

    GPIOA->OTYPER = 0x00000000;
    GPIOB->OTYPER = 0x00000000;
    GPIOF->OTYPER = 0x00000000;


    GPIOA->OPTDT = 0x00000000;
    GPIOB->OPTDT = 0x00000000;
    GPIOF->OPTDT = 0x00000000;
    
//    GPIOA->OPTDT = 0x0000FFFF;
//    GPIOB->OPTDT = 0x0000FFFF;
//    GPIOF->OPTDT = 0x0000FFFF;

    __WFI();
}

 

 

Изменено пользователем AlexBel

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Гм. Микроконтроллер у Вас от Artery, а код - от STM32. Или Вы подкорректировали заголовочный файл с регистрами от STM32? Они не похожи друг с другом. Может быть где-то в этом ошибка?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

19 minutes ago, haker_fox said:

Гм. Микроконтроллер у Вас от Artery, а код - от STM32. Или Вы подкорректировали заголовочный файл с регистрами от STM32? Они не похожи друг с другом. Может быть где-то в этом ошибка?

Используется Keil с библиотекой для Artery. Я ничего не корректировал, использовал названия регистров такими, какие они есть в этой библиотеке. Эти названия немного отличаются, но весьма схожи с STM32, как, впрочем, и RM и DS.

Изменено пользователем AlexBel

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Попробовал сейчас контроллер того же типа, но в корпусе на 48 ног - AT32F421C8T7. Порты настроены на вход и подтянуты с GND. После перехода в Standby результат почти тот же, что и ранее - потребляемый ток порядка 290мкА. В библиотеке Artery для Keil нашёл функцию перевода в StandBy:

Spoiler

void PWR_EnterSTANDBYMode(void)
{
  /* Clear Wake-up flag */
  PWR->CTRL |= PWR_CTRL_CLWUF;
  /* Select STANDBY mode */
  PWR->CTRL |= PWR_CTRL_PDDS;
  /* Set SLEEPDEEP bit of Cortex System Control Register */
  SCB->SCR |= SCB_SCR_SLEEPDEEP;
  /* This option is used to ensure that store operations are completed */
#if defined ( __CC_ARM   )
  __force_stores();
#endif
  /* Request Wait For Interrupt */
  __WFI();
}

Использовал её вместо своей, ничего не изменилось. Что, впрочем, понятно - у меня такая же. Опробовал функцию перевода в Stop из той же библиотеки - ничего не изменилось. Оба контроллера на отладочных платах, минимум компонентов, которые не влияют на GPIO. Уже начинаю думать - может, делаю всё правильно, а проблема в контроллерах...

Изменено пользователем AlexBel

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

44 minutes ago, AlexBel said:

Уже начинаю думать - может, делаю всё правильно, а проблема в контроллерах...

Если в регистрах всё правильно, а это можно проверить под отладкой, то, ИМХО, следует задать вопрос техподдержке. Понимаю, что это Artery, а не STM. Но все же это лучше, чем теряться в догадках.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Скорее всего МК в DBGMCU. Ну и тщательно проверить что отключаются внутренние стабилизаторы.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Проверил DBGMCU. Когда включаю, потребляемый ток увеличивается. Написал в Artery, может, ответят. В режиме отладки прошагал каждую строчку до входа в standby...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

On 12/28/2022 at 7:57 AM, AlexBel said:

Всем привет. Перевожу контроллер AT32F421F8P7 в режим Standby, при этом потребление составляет порядка 250мкА. эксперимента.

 

у вас на плате есть отдельный сенсор на замер тока контроллера? или вы меряете потребление всей платы?

Изменено пользователем jenya7

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

52 minutes ago, jenya7 said:

у вас на плате есть отдельный сенсор на замер тока контроллера? или вы меряете потребление всей платы?

 

Измеряю потребление всей платы. Но на плате нет ничего, кроме кварца и светодиода, это маленькая девборда-макетка. Кварц в статичном режиме - конденсатор, он никак не может давать утечку, тем более, что на пинах, к которым он подключен, одинаковый уровень. Светодиод на одной плате подключен анодом к пину, но на этот пин я, предварительно, подаю ноль. На второй плате (их две, один и тот же контроллер, но в разных корпусах) светодиод вообще можно отключать джампером. Остальные элементы - конденсаторы по питанию, на сбросе и резистор на BOOT, подключение которого на питание/минус мало что меняет.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А питание как устроено на плате ? LDO ? или просто вход 3.3V для измерения ?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

11 minutes ago, x893 said:

А питание как устроено на плате ? LDO ? или просто вход 3.3V для измерения ?

Питание - напрямую на контроллер

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Не знаю ничего об AT32, но, например, у STM32WLE в режиме Standby регистры настройки портов не работают, там есть отдельные регистры PWR->PDCRx и PWR->PUCRx, которыми можно включить подтяжки к земле и питанию, а без подтяжек висящие в воздухе ноги вполне могут вызывать повышенное потребление. Кроме этого есть выводы, у которых подтяжки включены по-умолчанию и эти подтяжки могут конфликтовать с внешними сигналами (у меня, например, в рабочем режиме конфликтовала подтяжка NJTRST). 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

4 minutes ago, Сергей Борщ said:

Не знаю ничего об AT32, но, например, у STM32WLE в режиме Standby регистры настройки портов не работают, там есть отдельные регистры PWR->PDCRx и PWR->PUCRx, которыми можно включить подтяжки к земле и питанию, а без подтяжек висящие в воздухе ноги вполне могут вызывать повышенное потребление. Кроме этого есть выводы, у которых подтяжки включены по-умолчанию и эти подтяжки могут конфликтовать с внешними сигналами (у меня, например, конфликтовала подтяжка NJTRST). 

Спасибо, но я это учёл, все подтяжки настроил и перепроверил. В процессе экспериментов специально делал "висячки" - потребляемый ток увеличивался. NRST не имеет внешней подтяжки, использую внутренний резистор и внешний конденсатор.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

3 часа назад, AlexBel сказал:

В процессе экспериментов специально делал "висячки" - потребляемый ток увеличивался

А нет ли у этого контроллера варианта с бОльшим количеством ног? Кристаллы в них обычно идут одинаковые и часть портов просто не подключаются к выводам корпуса, но их тоже нужно настраивать.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

On 12/28/2022 at 1:57 PM, AlexBel said:

змерения производил мультиметром Keithley DMM6500.

Я возможно спрошу банальность, но Вы уверены в показаниях данного прибора? У него есть сертификат о поверке? Погрешность измерения самого амперметра на этом диапазоне позволяет измерять такие токи? Возможно, стоит сымитировать ток 8 мкА с помощью поверенного источника напряжения и более-менее точного резистора номиналом подходящим и убедиться в адекватности показаний амперметра?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...