Кто любит RISC в жизни, заходим, не стесняемся.
Ответить

Как послать STM8S на х..... на halt();

Чт авг 16, 2018 17:58:20

Господа, сварганил программку, которая по нажатию кнопки включает режим HALT, а по следующему нажатию выводит из него.
Но вот беда, в HALT контроллер жрет 40 мА (именно миллиампер).
Да, я знаю, что нужно отключать периферию и прочее, я пошел проще - для читоты эксперимента включил halt сразу после void main(void) {...
Стало 35 мА.

Нашел в интернете код, но он для STM8L, и мой компилятор не хочет жрать некоторые команды. Привожу его ниже, то, на что компилятор ругается - закомментировано. У меня IAR если что и последний SPL
void Halt_Init(void)
{

TIM1_Cmd(DISABLE);
//TIM2_CtrlPWMOutputs(DISABLE);
TIM2_Cmd(DISABLE);
//TIM3_Cmd(DISABLE);
TIM4_Cmd(DISABLE);
ADC1_Cmd(DISABLE);
//PWR_PVDCmd(DISABLE);

/* 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 ЭТИМ У МЕНЯ ВСЕ В ПОРЯДКЕ, НАПИСАЛ СВОЙ, НО ОН ДАЕТ ЭКОНОМИИ В ЕДИНИЦЫ мА.

/* Stop RTC Source clock */
//CLK_RTCClockConfig(CLK_RTCCLKSource_Off, CLK_RTCCLKDiv_1);

/* Stop clock RTC and LCD */
// CLK_PeripheralClockConfig(CLK_Peripheral_RTC, DISABLE);
//CLK_PeripheralClockConfig(CLK_Peripheral_LCD, DISABLE);
}


C одной стороны, как бы хочется просить, что нужно для STM8S вместо этих строк. Порылся в самом SPL но к примеру аналог CLK_SYSCLKDivConfig не нашел. Есть CLK_SYSCLKConfig, но по-моему это что-то не то.
С другой стороны, хочтся спросить, а зачем эти манипуляции с тактированием, если, по идее сама команда halt() останавливает генератор. Может я тут потрачу уйму времени на то, чтобы перевети код тактирования под STM8, а у меня в чем-то другом причина...

ЧТо за устройство? Китайский индикатор заряда аккумулятора. Хочу изменить режимы его работы, но в илу закрытости прошивки, занимаюсь ревер инжинирингом. Все уже сделал, не могу сделать главное - обеспечить микропотребление в спящем режиме. Так вот плата эта в оригинале, с китайской прошивкой в спящем режиме кушает 15 мкА. То есть проблем с железом точно нет, вопрос в том, как написать код.
Может у кого есть кусок кода "правильного" посылания контроллера на halt() ?

Re: Как послать STM8S на х..... на halt();

Чт авг 16, 2018 18:47:31

Большая часть контроллеров уходит в ожидание по команде __WFI(); - Wait For Interrupt - ожидание прерывания.
Естественно, необходимо заранее настроить переферию так, чтобы она тоже не жрала ток в этом режиме.

Кстати, пункт 3 в референс-мануале на контроллер - как раз таки управление питанием и сброс. Рекомендую к прочтению.

Re: Как послать STM8S на х..... на halt();

Чт авг 16, 2018 18:51:27

SPL под стм8, вы извращенец ...

Re: Как послать STM8S на х..... на halt();

Чт авг 16, 2018 19:20:47

Но вот беда, в HALT контроллер жрет 40 мА (именно миллиампер)

сам по себе контроллер не должен столько жрать даже не в halt-е. Имхо он кого-то кормит со своих ног. Схемку бы таки глянуть, ну и код целиком.

Добавлено after 2 minutes 52 seconds:
Большая часть контроллеров уходит в ожидание по команде __WFI(); - Wait For Interrupt - ожидание прерывания

это именно ожидание, самый "жручий" из ждущих режимов, там почти вся периферия остается работать

Re: Как послать STM8S на х..... на halt();

Чт авг 16, 2018 20:22:52

Для чистоты эксперимента взял вот это https://ru.aliexpress.com/item/J34-Free ... autifyAB=0

отпаял светодиод, индицирующий питание. Схема нулевая, без всего. Запитал схему не через преобразователь, а напрямую, чере пин 3.3, что на разъеме от программатора. Запитал собственно от программатора. ПОлучил 6.5 мА.

Код?

Код:

void GPIO_LowPower_Config(void)
{
   /* Configure unused pins as output push-pull 0 to enter low power */
   /* Port A */

   GPIO_Init(GPIOA, GPIO_PIN_ALL, GPIO_MODE_OUT_PP_LOW_SLOW);

   /* 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);

}

void Halt_Init(void)
{

  TIM1_Cmd(DISABLE);
   //TIM2_CtrlPWMOutputs(DISABLE);
   TIM2_Cmd(DISABLE);
   //TIM3_Cmd(DISABLE);
   TIM4_Cmd(DISABLE);
   ADC1_Cmd(DISABLE);
   //PWR_PVDCmd(DISABLE);

   /* 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();
 
   /* Stop RTC Source clock */
   //CLK_RTCClockConfig(CLK_RTCCLKSource_Off, CLK_RTCCLKDiv_1);
 
   /* Stop clock RTC and LCD */     
//   CLK_PeripheralClockConfig(CLK_Peripheral_RTC, DISABLE);
   //CLK_PeripheralClockConfig(CLK_Peripheral_LCD, DISABLE);
}


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 пина (он отключен, если что).
Нижняя кнопка - она-то и включает и выключает устройство.

Re: Как послать STM8S на х..... на halt();

Пт авг 17, 2018 07:12:06

что нужно для STM8S вместо этих строк

без SPL можно обойтись - halt на 2 сек:
Код:
   CLK->PCKENR1 = CLK_PCKENR1_TIM1|CLK_PCKENR1_TIM2;
   CLK->PCKENR2 = CLK_PCKENR2_AWU;
   AWU->APR = 0x3e;     // /64
   AWU->TBR = 0x0B;  // 4096*64/128E3 _2s
   AWU->CSR |= AWU_CSR_AWUEN;
....
    CLK->PCKENR1 = 0;
    asm("halt");

Re: Как послать STM8S на х..... на halt();

Пт авг 17, 2018 19:09:53

без SPL можно обойтись

Ваш способ переводит в какой-то более низкопотребляющий режим, чем мой?

Re: Как послать STM8S на х..... на halt();

Пт авг 17, 2018 19:38:46

Последовательно со светодиодом резистор поставьте.

Re: Как послать STM8S на х..... на halt();

Пт авг 17, 2018 20:57:13

более низкопотребляющий режим, чем мой?

да - у вас
в HALT контроллер жрет 40 мА (именно миллиампер)

у меня микроамперы

Re: Как послать STM8S на х..... на halt();

Пт авг 17, 2018 22:20:35

oleg110592,
Гениальный вывод!!! А главное логичный. У вас контроллер жрет микроамперы, а у меня 40 мА. У меня SPL, у вас его нет. Вывод - причина в SPL. Другие причины рассматривать не пробовали? Или так охота высказать свое фи в адрес SPL? ))) Ну да ладно)))

Я то причину нашел. Наполовину пока - на китайской отладочной плате мне удалось получить 11 мкА, на плате китайского устройства - пока нет. Но причина - не SPL.

Добавлено after 19 minutes 18 seconds:
SPL под стм8, вы извращенец ...


Просто быстро надо, быстродействие и компактность кода не требуются. Задача достойная копи-паст метода, а примеров именно под SPL для STM8 в сети - большинство.

Добавлено after 10 minutes 17 seconds:
Ах, да.... забыл - проблема была в чем - совершенно не в коде. На отладочной плате был преобразователь питания на 3.3 вольт. Он конечно же не low quiescent, поэтому я и не думал через него питать. ЗАпитал я контроллер напрямую, от программатора ST-Link. Так вот упомянутый выше преобразователь питания, получая на выход 3.3 вольт, и с нулем на входе, как-то влиял на схему, сжирая миллиамеры. Отпаял я его - все стао на свои места, голый контроллер в халте жрет 11 мка.
Итак, этим я убедился, что с кодом все нормально (на отладочной плате пробовал ради чистоты эксперимента).
Теперь возвращаемся к схеме, которую я сфоткал и вылоил выше. Причина в ней.
Кто-нибудь может мне сказать, в чем задача МОСФЕТа внизу. Зачем его затвор через диод сообщается с PD3, на который в рабочем режиме потупает напряжение для измерения...

Re: Как послать STM8S на х..... на halt();

Сб авг 18, 2018 06:44:43

Гениальный вывод!!! Вывод - причина в 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 годится. Логично? :)))

Re: Как послать STM8S на х..... на halt();

Сб авг 18, 2018 19:16:53

Уважаемый Олег!
Ну нелогично совершенно. Я на самом деле ругаться не собираюсь.

Ну посудите сами - большое потребление тока может иметь две причины - либо схемотехническую, либо программную. Покольку схемотехнический компонент определить сложнее, тем более форумцам, не имеющим возможности поэкспериментировать с конечным устройством, то мне для начала проще проверить программный.

Я задал простой вопрос что должно быть, если разу после включения отправить в халт, пусть неправильно, пусть не по мануалу. И я расчитываю получить ответ знающих людей. Я вот например уже выяснил, что в если в устройстве, заведомо не имеющем схемотехнических проблем, вызваь халт сразу после main(), то контроллер будет кушать 30 мкА, а все мануалы, пляски с бубнами - это если охота побороться к примеру за 11 мкА (мой наилучший пока результат).

Так вот знающий и конструктивно мыслящий человек (чего-то одного из этого у вас не хватает), сказал бы мне, "Евгений, никакими программными косяками ток в десятки мА в халт режиме объяснить нельзя, поэтому ищите проблему в схеме. В Вашем случае, даже если вы сделаете все по мануалу, проблема скорее всего отанется, потому как при самом наихудшем раскладе ток в халт не может превышать 1 мА, а у Вас десятки мА."

Другая причина это - "нашел в интернете код, но он для STM8L". Зачем искать, если в самой SPL именно для STM8S есть пример halt, отсюда вывод - он не заработал

Вы понимаете разницу между "код не заработал" и "код не скомпилировался". У меня было второе. То есть я взял код и компилятор на него ругается я писал именно об этом. Вы невнимательно читаете моим посты.Я не писал, что этот код не позволил достичь нужного тока потребления. Поэтому SPL тут ни при чем. Последнее утверждение подтверждается тем, что когда я нашел причину, то добился 11 мка даже на SPL.

Далее, еще раз повторю - у меня отладочная плата и китайский индикатор заряда. Два разных устройства. Все то, что я писал про "проблема решена", "добился 11 мкА" - это про отладочную плату.

Но в конечном счете мне нужно побороть индикатор заряда. Его схему я приводил выше. С ней конечно тоже можно поиграться, выпаивая то одно, то другое, но боюсь повредить LCD.
Поэтому прошу, если это несложно - взглянуть на схему выше, ну и для начала, кто знает, высказать предположение - для чего нужен ключ на МОСФЕТЕ? И что в этой схеме может жрать ток, при отключенных GPIO? Повторюсь, само устройство, которое я держал в руках, с оригинальной, не стертой прошивкой, как раз 11 мкА и кушало. Сейчас, когда я записал свою прошивку которая только лишь отключает GPIO и вызывает халт, устройство жрет 40 мА. Видимо, китайцы на какие-то ножки что-то подавали, единичку или ноль, возможно не на одну.
Есть у кого-нибудь мысли?

Re: Как послать STM8S на х..... на halt();

Сб авг 18, 2018 19:35:53

для чего нужен ключ на МОСФЕТЕ?

он случаем не включает питание контроллера? Откуда еще тому на ногу VDD приходит 3.3 вольта?

Re: Как послать STM8S на х..... на halt();

Сб авг 18, 2018 19:50:24

Ув. Женя мой ответ был дан на этот вопрос, поскольку знаю что в SPL возможны ошибки:
Может у кого есть кусок кода "правильного" посылания контроллера на halt() ?

з.ы. А ток потребления микроконтроллера обычно измеряю, разрывая дорожку питания самого микроконтроллера.
За сим откланиваюсь. Только еще оставлю ссылку-пример (может еще кому пригодится), соответствующий названию этой темы "Как послать STM8S на х..... на halt();" и конкретно для STM8S:
http://blog.mark-stevens.co.uk/2014/06/ ... eup-stm8s/

Re: Как послать STM8S на х..... на halt();

Сб авг 18, 2018 20:16:17

для чего нужен ключ на МОСФЕТЕ?

он случаем не включает питание контроллера? Откуда еще тому на ногу VDD приходит 3.3 вольта?


Вообще то да. Если вы обратите внимание, то с его истока проводник идет к LDO, питающего контроллер. То есть МОСФЕТ должен быт открыт. И открывается он внешним питанием, через резистор. Но видите ли, в этом случае эту функцию транзистора с успехом заменил бы обычный проводник. Но там еще два диода, развязывающие его от остальных частей схемы. Кстати, я дергал PD3 и в ноль и в плюс - управляя его затвором - эффекта не возымело.

Re: Как послать STM8S на х..... на halt();

Вс авг 19, 2018 09:21:16

Проблема решена. Всем спасибо.
Ответить