Господа, сварганил программку, которая по нажатию кнопки включает режим HALT, а по следующему нажатию выводит из него. Но вот беда, в HALT контроллер жрет 40 мА (именно миллиампер). Да, я знаю, что нужно отключать периферию и прочее, я пошел проще - для читоты эксперимента включил halt сразу после void main(void) {... Стало 35 мА.
Нашел в интернете код, но он для STM8L, и мой компилятор не хочет жрать некоторые команды. Привожу его ниже, то, на что компилятор ругается - закомментировано. У меня IAR если что и последний SPL
/* Switch to LSI as system clock source */ /* system clock prescaler: 1*/ // CLK_SYSCLKDivConfig(CLK_SYSCLKDIV_1); // CLK_SYSCLKSourceConfig(CLK_SYSCLKSource_LSI); //CLK_SYSCLKSourceSwitchCmd(ENABLE);
// while (CLK_GetFlagStatus(CLK_FLAG_LSIRDY) == 0); CLK_HSICmd(DISABLE); //CLK_HSEConfig(CLK_HSE_OFF);
/* Set STM8 in low power */ //PWR_UltraLowPowerCmd(ENABLE);
/* Set GPIO in low power*/ GPIO_LowPower_Config(); // C ЭТИМ У МЕНЯ ВСЕ В ПОРЯДКЕ, НАПИСАЛ СВОЙ, НО ОН ДАЕТ ЭКОНОМИИ В ЕДИНИЦЫ мА.
C одной стороны, как бы хочется просить, что нужно для STM8S вместо этих строк. Порылся в самом SPL но к примеру аналог CLK_SYSCLKDivConfig не нашел. Есть CLK_SYSCLKConfig, но по-моему это что-то не то. С другой стороны, хочтся спросить, а зачем эти манипуляции с тактированием, если, по идее сама команда halt() останавливает генератор. Может я тут потрачу уйму времени на то, чтобы перевети код тактирования под STM8, а у меня в чем-то другом причина...
ЧТо за устройство? Китайский индикатор заряда аккумулятора. Хочу изменить режимы его работы, но в илу закрытости прошивки, занимаюсь ревер инжинирингом. Все уже сделал, не могу сделать главное - обеспечить микропотребление в спящем режиме. Так вот плата эта в оригинале, с китайской прошивкой в спящем режиме кушает 15 мкА. То есть проблем с железом точно нет, вопрос в том, как написать код. Может у кого есть кусок кода "правильного" посылания контроллера на halt() ?
Большая часть контроллеров уходит в ожидание по команде __WFI(); - Wait For Interrupt - ожидание прерывания. Естественно, необходимо заранее настроить переферию так, чтобы она тоже не жрала ток в этом режиме.
Кстати, пункт 3 в референс-мануале на контроллер - как раз таки управление питанием и сброс. Рекомендую к прочтению.
Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ очень важен контроль процесса заряда и разряда для избегания воздействия внешнего зарядного напряжения после достижения 100% заряда. Инженеры КОМПЭЛ подготовили список таких решений от разных производителей.
отпаял светодиод, индицирующий питание. Схема нулевая, без всего. Запитал схему не через преобразователь, а напрямую, чере пин 3.3, что на разъеме от программатора. Запитал собственно от программатора. ПОлучил 6.5 мА.
Код?
Код:
void GPIO_LowPower_Config(void) { /* Configure unused pins as output push-pull 0 to enter low power */ /* Port A */
/* PORT B NOT AIN */ GPIO_Init(GPIOB, GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_7, GPIO_MODE_OUT_PP_LOW_SLOW);
/* PORT B LEDS, SO THEY DON'T FLASH AT POWER ON */ GPIO_Init(GPIOB, GPIO_PIN_3|GPIO_PIN_4|GPIO_PIN_5, GPIO_MODE_OUT_PP_HIGH_SLOW);
/* PORT C NOT WAKEUP PIN!! */ GPIO_Init(GPIOC, GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3|GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6, GPIO_MODE_OUT_PP_LOW_SLOW);
/* PORT D */ GPIO_Init(GPIOD, GPIO_PIN_ALL, GPIO_MODE_OUT_PP_LOW_SLOW);
/* PORT E */ GPIO_Init(GPIOE, GPIO_PIN_ALL, GPIO_MODE_OUT_PP_LOW_SLOW);
/* PORT F */ GPIO_Init(GPIOF, GPIO_PIN_ALL, GPIO_MODE_OUT_PP_LOW_SLOW);
/* Switch to LSI as system clock source */ /* system clock prescaler: 1*/ // CLK_SYSCLKDivConfig(CLK_SYSCLKDIV_1); // CLK_SYSCLKSourceConfig(CLK_SYSCLKSource_LSI); //CLK_SYSCLKSourceSwitchCmd(ENABLE);
// while (CLK_GetFlagStatus(CLK_FLAG_LSIRDY) == 0); CLK_HSICmd(DISABLE); //CLK_HSEConfig(CLK_HSE_OFF);
/* Set STM8 in low power */ //PWR_UltraLowPowerCmd(ENABLE);
/* Set GPIO in low power*/ GPIO_LowPower_Config();
void main(void) { Halt_Init(); //EXTI_ClearITPendingBit(EXTI_IT_PIN_7); halt(); /* полностью закомментированная программа */
}
Добавлено after 6 minutes 28 seconds: По поводу той схемы с кторой работаю. Господа не обессудьте, выкладываю то что набросал на листе бумаги. Понятно, что шлак, я не требую подсказать решение по этой схеме. Если дойдет до того, что в схеме кто-то "ворует электричество", а я не разберусь, тогда нарисую в КАДе и выложу. А сейчас выкладываю этот шлак на случай, если косяк лежит на поверхности и его не оставит труда заметить.
Добавлено after 1 minute 12 seconds:
Добавлено after 3 minutes 5 seconds: Трехногая микруха слева - преоразователь питания на 3.3 вольт. Транзисторный ключ справа - управляет подсветкой. Неизвестный эемент вверху. левая нога которого идет к двум коненсаторам и земле - похожа на чип индуктивность. Микруха справа - драйвер дисплея. Питается с ноги PC4 14 пина (он отключен, если что). Нижняя кнопка - она-то и включает и выключает устройство.
Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре.
Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств.
oleg110592, Гениальный вывод!!! А главное логичный. У вас контроллер жрет микроамперы, а у меня 40 мА. У меня SPL, у вас его нет. Вывод - причина в SPL. Другие причины рассматривать не пробовали? Или так охота высказать свое фи в адрес SPL? ))) Ну да ладно)))
Я то причину нашел. Наполовину пока - на китайской отладочной плате мне удалось получить 11 мкА, на плате китайского устройства - пока нет. Но причина - не SPL.
Просто быстро надо, быстродействие и компактность кода не требуются. Задача достойная копи-паст метода, а примеров именно под SPL для STM8 в сети - большинство.
Добавлено after 10 minutes 17 seconds: Ах, да.... забыл - проблема была в чем - совершенно не в коде. На отладочной плате был преобразователь питания на 3.3 вольт. Он конечно же не low quiescent, поэтому я и не думал через него питать. ЗАпитал я контроллер напрямую, от программатора ST-Link. Так вот упомянутый выше преобразователь питания, получая на выход 3.3 вольт, и с нулем на входе, как-то влиял на схему, сжирая миллиамеры. Отпаял я его - все стао на свои места, голый контроллер в халте жрет 11 мка. Итак, этим я убедился, что с кодом все нормально (на отладочной плате пробовал ради чистоты эксперимента). Теперь возвращаемся к схеме, которую я сфоткал и вылоил выше. Причина в ней. Кто-нибудь может мне сказать, в чем задача МОСФЕТа внизу. Зачем его затвор через диод сообщается с PD3, на который в рабочем режиме потупает напряжение для измерения...
Гениальный вывод!!! Вывод - причина в SPL. Другие причины рассматривать не пробовали? Или так охота высказать свое фи в адрес SPL?
Еще более гениальный вывод. Другие причины рассматривал. Фи не увидел в своих постах. Написано просто - можно без SPL. Другая причина это - "нашел в интернете код, но он для STM8L". Зачем искать, если в самой SPL именно для STM8S есть пример halt, отсюда вывод - он не заработал Спойлер
Код:
void main(void) { ....... /*AWU configuration ----------*/ AWU_Config(); ..... while (1) { ...... halt(); /* Program halted */
/* Program re-starts here, thanks to AWU */
...... } }
/** * @brief Configure the AWU time base to 12s * @param None * @retval None */ void AWU_Config(void) { /* Initialization of AWU */ /* LSI calibration for accurate auto wake up time base*/ AWU_LSICalibrationConfig(LSIMeasurment());
/* The delay corresponds to the time we will stay in Halt mode */ AWU_Init(AWU_TIMEBASE_12S); }
мой выше код - практически тоже самое, но без SPL. Используется в реальном проекте. Для проверки режима halt imho годится. Логично?
Уважаемый Олег! Ну нелогично совершенно. Я на самом деле ругаться не собираюсь.
Ну посудите сами - большое потребление тока может иметь две причины - либо схемотехническую, либо программную. Покольку схемотехнический компонент определить сложнее, тем более форумцам, не имеющим возможности поэкспериментировать с конечным устройством, то мне для начала проще проверить программный.
Я задал простой вопрос что должно быть, если разу после включения отправить в халт, пусть неправильно, пусть не по мануалу. И я расчитываю получить ответ знающих людей. Я вот например уже выяснил, что в если в устройстве, заведомо не имеющем схемотехнических проблем, вызваь халт сразу после main(), то контроллер будет кушать 30 мкА, а все мануалы, пляски с бубнами - это если охота побороться к примеру за 11 мкА (мой наилучший пока результат).
Так вот знающий и конструктивно мыслящий человек (чего-то одного из этого у вас не хватает), сказал бы мне, "Евгений, никакими программными косяками ток в десятки мА в халт режиме объяснить нельзя, поэтому ищите проблему в схеме. В Вашем случае, даже если вы сделаете все по мануалу, проблема скорее всего отанется, потому как при самом наихудшем раскладе ток в халт не может превышать 1 мА, а у Вас десятки мА."
Цитата:
Другая причина это - "нашел в интернете код, но он для STM8L". Зачем искать, если в самой SPL именно для STM8S есть пример halt, отсюда вывод - он не заработал
Вы понимаете разницу между "код не заработал" и "код не скомпилировался". У меня было второе. То есть я взял код и компилятор на него ругается я писал именно об этом. Вы невнимательно читаете моим посты.Я не писал, что этот код не позволил достичь нужного тока потребления. Поэтому SPL тут ни при чем. Последнее утверждение подтверждается тем, что когда я нашел причину, то добился 11 мка даже на SPL.
Далее, еще раз повторю - у меня отладочная плата и китайский индикатор заряда. Два разных устройства. Все то, что я писал про "проблема решена", "добился 11 мкА" - это про отладочную плату.
Но в конечном счете мне нужно побороть индикатор заряда. Его схему я приводил выше. С ней конечно тоже можно поиграться, выпаивая то одно, то другое, но боюсь повредить LCD. Поэтому прошу, если это несложно - взглянуть на схему выше, ну и для начала, кто знает, высказать предположение - для чего нужен ключ на МОСФЕТЕ? И что в этой схеме может жрать ток, при отключенных GPIO? Повторюсь, само устройство, которое я держал в руках, с оригинальной, не стертой прошивкой, как раз 11 мкА и кушало. Сейчас, когда я записал свою прошивку которая только лишь отключает GPIO и вызывает халт, устройство жрет 40 мА. Видимо, китайцы на какие-то ножки что-то подавали, единичку или ноль, возможно не на одну. Есть у кого-нибудь мысли?
Может у кого есть кусок кода "правильного" посылания контроллера на halt() ?
з.ы. А ток потребления микроконтроллера обычно измеряю, разрывая дорожку питания самого микроконтроллера. За сим откланиваюсь. Только еще оставлю ссылку-пример (может еще кому пригодится), соответствующий названию этой темы "Как послать STM8S на х..... на halt();" и конкретно для STM8S: http://blog.mark-stevens.co.uk/2014/06/ ... eup-stm8s/
он случаем не включает питание контроллера? Откуда еще тому на ногу VDD приходит 3.3 вольта?
Вообще то да. Если вы обратите внимание, то с его истока проводник идет к LDO, питающего контроллер. То есть МОСФЕТ должен быт открыт. И открывается он внешним питанием, через резистор. Но видите ли, в этом случае эту функцию транзистора с успехом заменил бы обычный проводник. Но там еще два диода, развязывающие его от остальных частей схемы. Кстати, я дергал PD3 и в ноль и в плюс - управляя его затвором - эффекта не возымело.
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 40
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения