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

HALT Mode STM8L

Вт июл 04, 2017 12:06:57

Здравствуйте, столкнулся с проблемой: не получается усыпить (или, по-другому сказать, добиться заявленного потребления ~1 мкА в halt mode) микроконтроллер STM8L051. Делаю следующее в main():

CLK_ICKCR |= 0x04; // Enable LSI (++set LSION)
CLK_SWCR = 0x02; // Enables switching the system clock (bit SWEN)
CLK_SWR = 0x02; // choose LSI

while(!(CLK_ICKCR&(1<<3))); // wait stabilisation LSI

CLK_ICKCR &=~ (1<<0); // Disable HSI

asm("halt");

Когда добавляю команду asm("halt"); - потребление становится ~350 мкА, без этой конструкции ~430 мкА. LSI (судя по частоте мигания светодиода) запускается и проц тактируется от него. Но, такое ощущение, что HSI не отключается и работает на частоте 2 МГц, судя по потреблению. В ДШ как раз указано 150 мкА/МГц. В чём может быть косяк? Как правильно отключить HSI?

P.S. Пишу и отлаживаю в IAR 2.2
P.P.S. Провёл доп. исследование: в майне воткнул просто команду asm("halt"); - при этом ток стал 576 мкА! Проверил на stm8s003f3 - с такой же конструкцией (без инициализации тактирования и отключения периферии) потребление не более 15 мкА!!! Кто-нибудь сталкивался с такой проблемой у STM8L051? Может, кривая ревизия? (у меня это буковка Z)

Re: HALT Mode STM8L

Ср июл 12, 2017 13:56:13

Может оно ?
AN3147
By enabling the EEPM bit in the
FLASH_CR1 register, the Flash program memory automatically enters I DDQ mode when the
code is executed from RAM or when the device is in Wait mode.

И еще можно попробовать установить
If the SAHALT bit is set in the CLK_ICKCR register, the main regulator (MVR) is switched off
without taking into account that some high speed clocks may be used by the system.

Re: HALT Mode STM8L

Ср июл 12, 2017 20:45:42

Попробовал установить WAITM и EEPM в FLASH_CR1 (и вместе, и по отдельности) - никакого эффекта не последовало. SAHALT бит в CLK_ICKCR и так по умолчанию установлен... Может, у кого есть подобный камень (stm8l051 или stm8l101)? Я брал их в Промэлектронике и слышал, что у них была бракованная партия атмеловских МК, может, это просто брак и я зря трачу своё и ваше время.

Re: HALT Mode STM8L

Пн июл 24, 2017 21:54:49

Столкнулся с той же проблемой - теже цифры энергопотребления при переходе в halt. Если решение было найдено - просьба объяснить какое.

Re: HALT Mode STM8L

Вт июл 25, 2017 06:30:28

условия все выполнены?
Halt mode
In this mode the system clock is stopped. This means that the CPU and all the peripherals
clocked by SYSCLK or by derived clocks are disabled, except for the following cases:
• The HSI clock is not stopped if used by SWIM
• The system clock source is not stopped if a Flash/Data EEPROM write operation is in
progress
• The LSI clock is not stopped if used by the SWIM, the IWDG or if the “IWDG_HALT”
option bit is disabled.
In Halt mode, none of the peripherals are clocked and the digital part of the MCU consumes
almost no power.

Entering Halt mode
Before executing a HALT instruction, the application must clear all pending peripheral
interrupts by clearing the interrupt pending bit in the corresponding peripheral configuration
register. Otherwise, the HALT instruction is not executed and program execution continues.
However, the Halt procedure can be delayed if one of the following flags is set:
• SWBSY flag in the CLK_SWCR register
• EEBUSY flag in the CLK_CLK_REGCSR register
• RTCSWBSY flag in the CLK_CRTCR register
• BEEPSWBSY flag in the CLK_CBEEPR register when BEEP in Active-halt mode
enabled.
If SAHALT bit is set in the CLK_ICKCR register the main regulator (MVR) will be switched
off without taking into account that some high-speed clock may be used by the system.

Re: HALT Mode STM8L

Вт июл 25, 2017 13:18:11

Так как в текущем проекте не получилось добиться требуемого потребления, то был создан проект с нуля, только чтоб проверить как в halt получить единицы микроампер. В проекте небольшая задержка реализована простым декрементом переменной. Это сделано только для того чтоб увидеть изменение в потреблении при переходе в halt.
железо - голый камень stm8l151f3, подключены только SWIM, +3V и GND;
среда - IAR Embedded Wornbench IDE;
код -
#include <iostm8l151f3.h>

long volatile cnt = 100000; // to make some delay


int main( void )
{
CLK_CKDIVR = 0x02; // Fhsi = Fcpu = 4 МГц
PWR_CSR2_ULP = 1; // Internal reference voltage stopped in Halt/Active-halt mode
CLK_ICKCR_SAHALT = 1; // main voltage regulator OFF in HALT/Active-halt modeв halt

PA_DDR = 0xFF; // all gpio - output
PB_DDR = 0xFF;
PC_DDR = 0xFF;
PD_DDR = 0xFF;

PA_ODR = 0x00;
PB_ODR = 0x00;
PC_ODR = 0x00;
PD_ODR = 0x00;



CLK_PCKENR1 = 0; // no peripfheral
CLK_PCKENR2 = 0;
CLK_PCKENR3 = 0;

while(cnt) // delay
{
cnt--;
}


CPU_CFG_GCR_SWD = 1; // disable SWIM

asm("HALT"); //go halt


while(1)
{

}
}

потребление до HALT - 1мА, после - 100мкА.

Re: HALT Mode STM8L

Вт июл 25, 2017 16:06:06

подключены только SWIM

может это: The HSI clock is not stopped if used by the SWIM
ссылочка по теме на всякий:
http://we.easyelectronics.ru/STM8/metod ... stm8l.html

Re: HALT Mode STM8L

Ср июл 26, 2017 07:26:36

Перед тем как уйти в HALT есть строка:
CPU_CFG_GCR_SWD = 1; // disable SWIM
здесь я отключаю SWIM чтоб быть уверенным что он не мешает уйти в HALT

Re: HALT Mode STM8L

Ср июл 26, 2017 07:28:53

Я пробовал физически отключать от программатора - в halt не уходит.

Re: HALT Mode STM8L

Ср июл 26, 2017 08:07:07

остается попробовать вариант от сообщества, правда присутствует SPL
утверждается что 0.5uA:
Here's what I'm doing for the STM8L151 and it drops current to 0.5uA. This is full halt, but if you want to keep RTC active, just comment out those lines. One thing, you have to clear the wakeup INT before halt. Here, I'm using EXTI pin7 for wakeup.


Спойлер
Код:
Halt_Init();
EXTI_ClearITPendingBit(EXTI_IT_Pin7);
halt();

void Halt_Init(void)
{
   TIM1_Cmd(DISABLE);
   TIM2_CtrlPWMOutputs(DISABLE);
   TIM2_Cmd(DISABLE);
   TIM3_Cmd(DISABLE);
   TIM4_Cmd(DISABLE);
   ADC_Cmd(ADC1, 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 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);
}

отседова https://community.st.com/thread/4894

Re: HALT Mode STM8L

Ср июл 26, 2017 08:21:07

Стыдно признаться, но после подпайки к плате разъема для дебага код начал работать (позор на мою седую голову :facepalm: )

Re: HALT Mode STM8L

Ср июл 26, 2017 08:32:35

Можете пояснить, что особенного в этом разъёме? Я тупо использую линии контроллера SWIM и SWIM_RST для программирования и отладки. После прошивки отсоединяю от программатора и замеряю ток.

Re: HALT Mode STM8L

Чт авг 10, 2017 07:40:45

Ничего особенного в этом разъеме нет. Это для то о чем вы писали выше. Просто при его пайке , похоже, пропаялся лучше камень. И все заработало. Дело было в плохой пайке. Код работает.
Ответить