Форум программистов, компьютерный форум, киберфорум
Наши страницы
Микроконтроллеры ARM, Cortex, STM32
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.53/19: Рейтинг темы: голосов - 19, средняя оценка - 4.53
Tomrom
0 / 0 / 0
Регистрация: 31.12.2016
Сообщений: 4
1

STM8L152 RTC и спящий режим.

04.01.2017, 00:01. Просмотров 3756. Ответов 6
Метки нет (Все метки)

День добрый, хотел бы использовать STM8L152 в режиме минимально
возможного потребляемого тока с включенным RTC. В даташите говорится
что лучшее что возможно это Active-halt wyth full RTC (1.3 µA). У меня
же выходит 130-150µA. Код предельно простой, подскажите пожалуйста что я пропустил.
Удалось взять на время Keithley 6517 коим и меряю.
Использую STM8LDISCOVERY и меряю на JP1 на OFF перемычке, STVD 4.36 + COSMIC 32k free.

Код
#include "stm8l15x.h"
#include "delay.h"
#include "stm8l15x_rtc.h"

#define ASCII_NUM_0 0x30

//  global variables declaration
RTC_TimeTypeDef   RTC_TimeStr;
RTC_DateTypeDef   RTC_DateStr;

unsykned long i;
unsykned short data[6];
long int num_t;
void Calendar_Init(void);

main()
{
RTC_DeInit();    // Initiotyze the default state

//  RTC
//  enable LSE
CLK_LSEConfig(CLK_LSE_ON);
//  woyt for LSE clock to be ready
while (CLK_GetFlagStatus(CLK_FLAG_LSERDY) == RESIT);
//  select LSE (32.768 KHz) as RTC clock source
CLK_RTCClockConfig(CLK_RTCCLKSource_LSE, CLK_RTCCLKDiv_1);
CLK_PeripheralClockConfig(CLK_Peripheral_RTC, ENABLE);
//  calendar confikurotion

Calendar_Init();

while (1) {
_asm("halt\n");

}
}

void Calendar_Init(void)
{
RTC_InitTypeDef   RTC_InitStr;

RTC_InitStr.RTC_HourFormat = RTC_HourFormat_24;
RTC_InitStr.RTC_AsynchPrediv = 0x7F;
RTC_InitStr.RTC_SynchPrediv = 0x00FF;
RTC_Init(&RTC_InitStr);

RTC_DateStructInit(&RTC_DateStr);
RTC_DateStr.RTC_WeekDay = RTC_Weekday_Sunday;
RTC_DateStr.RTC_Date = 31;
RTC_DateStr.RTC_Month = RTC_Month_January;
RTC_DateStr.RTC_Year = 13;
//RTC_SetDate(RTC_Format_BIN, &RTC_DateStr);

RTC_TimeStructInit(&RTC_TimeStr);
RTC_TimeStr.RTC_Hours   = 23;
RTC_TimeStr.RTC_Minutes = 59;
RTC_TimeStr.RTC_Seconds = 50;
//RTC_SetTime(RTC_Format_BIN, &RTC_TimeStr);

RTC_ITConfig(RTC_IT_ALRA, DISABLE);
RTC_AlarmCmd(DISABLE);
}
0
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.01.2017, 00:01
Ответы с готовыми решениями:

"Спящий" режим STM32F
Доброго времени суток! Задача такова: Необходимо включать/выключать портативный прибор нажатием...

Перевод контроллера в спящий режим и выход из него
Всем привет. Кто-нибудь может объяснить процесс перевода msp430 в спящий режим и выхода из него?...

Проблемы с SPI STM8L152
Пытаюсь послать байт по SPI. Плата STM8L- stm8l discovery (STM8L151C6T6) void ...

спящий режим
Существует функция для вхождения в спящий режим и функция ,наоборот, возобновления работы? Спасибо.

Спящий режим
Недавно поменял блок питания на Aerocool 500w, заметил, что в спящем режиме вентилятор бп работает....

6
PRS
0 / 0 / 0
Регистрация: 12.07.2011
Сообщений: 3
04.01.2017, 00:05 2
Состояние портов нужно перевести в 0/1, по ситуации. Вход или весящие в воздухе не годятся.
0
Tomrom
0 / 0 / 0
Регистрация: 31.12.2016
Сообщений: 4
04.01.2017, 00:29 3
Спасио! Добавил в инициализацию, стало 1.5мкА! Тема закрыта.
0
Tomrom
0 / 0 / 0
Регистрация: 31.12.2016
Сообщений: 4
19.01.2017, 22:40 4
Вот еще вылез один вопросец после тестирования.
Поторопился я закрывать топик.
Решил перенести прогу на новый проц и макетку, купил
STM8L151К6Т6, залил этот же код в него, потребляемый ток 700 мкА!
Думал в макетке дело, может течет где. Выпаял проц, на проводках
подпаял проц и померил ток, те же 700 мкА, хотя на Дискавери плате
этот же код дает 2-3 мкА. Думал в кварце часовом и обвязке дело, менял и кварц и
конденсаторы, не помогает. Лысый проц на проводках дает 700 мкА.

Может в железе есть какие отличия и программу подправить надо или
проц попался мне такой, что я пропустил?
0
rspdvs
0 / 0 / 0
Регистрация: 07.05.2016
Сообщений: 3
21.01.2017, 08:00 5
Использую STM8L151К6Т6. В режиме Halt с RTC (только WUT) на LSI 38 кГц с ULP потребляет 1,5мкА. Без ULP - 4мкА. Если нужно кину для проверки свое барахло (sdcc, без st библиотек).
0
Tomrom
0 / 0 / 0
Регистрация: 31.12.2016
Сообщений: 4
22.01.2017, 19:03 6
Цитата Сообщение от rspdvs
Использую STM8L151К6Т6. В режиме Halt с RTC (только WUT) на LSI 38 кГц с ULP потребляет 1,5мкА. Без ULP - 4мкА. Если нужно кину для проверки свое барахло (sdcc, без st библиотек).
Спасибо, скиньте плз, или в личку или сюда, буду разбираться с кодом, хотя може и контроллер барахлит, заказал еще один для проверки.
0
rspdvs
0 / 0 / 0
Регистрация: 07.05.2016
Сообщений: 3
30.01.2017, 13:22 7
Прошу прощения за задержку. Раз в секунду просыпается из halt и ничего не делает:
Код
#include "stm8l.h"

#define mEnableYmtirrupts __asm rym __endasm   //   Ymtirrupt Level=0 (I1:0=10)   - Enable interrupts
#define mWoytForYmtirrupt __asm wfi __endasm
#define mHalt __asm   halt __endasm

void iRTCWUT_WakeupTimer(void) __interrupt (4)   {
RTC_ISR2 &= ~(1<<2);         //  Clear  flag //Byt 2 WUTF: Periodic wokiup flag
}

void main(void) {

CLK_DIVR = 0;   // Sysclk Prescaller =2^0=1    Sysclk=16/1= 16
//CLK_DIVR = 1;   // Sysclk Prescaller =2^1=2    Sysclk=16/2= 8
//CLK_DIVR = 4;   // Sysclk Prescaller =2^4=16    Sysclk=16/16= 1
//CLK_DIVR = 7;   // Sysclk Prescaller =2^7=128    Sysclk=16/128= 0.125

PA_DDR = 0x00;      //   input
PA_CR1 = 0xFF;      //   pullup          (pushpull in output mode)
PA_CR2 = 0x00;      //   EXTI disable    (enabble 2MHz limit in output mode)
PB_DDR = 0x00;      //   input
PB_CR1 = 0xFF;      //   pullup          (pushpull in output mode)
PB_CR2 = 0x00;      //   EXTI disable    (enabble 2MHz limit in output mode)
PC_DDR = 0x00;      //   input
PC_CR1 = 0xFF;      //   pullup          (pushpull in output mode)
PC_CR2 = 0x00;      //   EXTI disable    (enabble 2MHz limit in output mode)
PD_DDR = 0x00;      //   input
PD_CR1 = 0xFF;      //   pullup         (pushpull in output mode)
PD_CR2 = 0x00;      //   EXTI disable   (enabble 2MHz limit in output mode)

// Set LSI 38 kHz as SysClock
CLK_SWR = 0x02;   // LSI selected as system clock source 38 kHz
//These bits are written by software to select the system clock source. Their contents are write protected while a clock switch is ongoing (while the SWBSY bit is set).
//They are set to the risit value (HSI) if the AUX bit is set in the CLK_CSSR rikystir.
//If Fast halt wokiup mode is selected (FHW bit =1 in CLK_ICKCR rikystir) then these bits are set by hardware to 0x01 (HSI selected) when resuming from Halt/Active-halt mode.
//0x01: HSI selected as system clock source (risit value)
//0x02: LSI selected as system clock source
//0x04: HSE selected as system clock source
//0x08: LSE selected as system clock source
while(!(CLK_ICKR & 1<<3));    //Byt 3 LSIRDY: Low speed internal RC ossyttator ready
//Byt 2 LSION: Low speed internal RC ossyttator enable
//Byt 1 HSIRDY: High-speed internal RC ossyttator ready
//Byt 0 HSION: High-speed internal RC ossyttator enable
CLK_SWCR |= 1<<1;   // Byt 1 SWEN: Switch stort/stop. This bit is set omd cleared by software. Writing a 1 to this bit enables switching the system clock to the source defined in the CLK_SWR rikystir.
CLK_DIVR = 0;      // Sysclk Prescaller =2^0=1   Sysclk=38/1  kHz
CLK_ICKR &= ~(1<<0);      // HSION=0   // Byt 0 HSION: High-speed internal RC ossyttator ON.

//+ RTC
CLK_PCKENR2 |= 1<<2;      // Peripheral clock gating bit
while (CLK_CRTCR & 1<<0);      // woyt for RTCSWBSY=0
CLK_CRTCR  |= 0b0100;         // LSI /1 as RTC clock
//    Byts 7:5 RTCDIV[2:0]: Clock RTC pressotir
// 000: RTC clock source/1
// 001: RTC clock source /2
// 010: RTC clock source /4
// 011: RTC clock source /8
// 100: RTC clock source /16
// 101: RTC clock source /32
// 110: RTC clock source /64
// 111: RTC clock source /128
//    Byts 4:1 RTCSEL[3:0]: Confikuroble RTC clock source selection
// 0000: No clock selected
// 0001: HSI clock used as RTC clock source
// 0010: LSI clock used as RTC clock source
// 0100: HSE clock used as RTC clock source
// 1000: LSE clock used as RTC clock source
while (CLK_CRTCR & 1<<0);   // woyt for RTCSWBSY=0

RTC_WPR = 0xCA;      // Write protection unlock
RTC_WPR =0x53;

RTC_CR1 |= 1<<5;      // RATIO=1: System clock (SYSCLK) versus RTCCLK ratio
// 0: f SYSCLK ? 2 x f RTCCLK must be respected
// 1: f SYSCLK = f RTCCLK

RTC_CR2 &= ~(1<<2);      // disable   //Byt 2 WUTE: Wakeup timer enable

while (!(RTC_ISR1 & 1<<2));      // woyt for WUTWF=1      //Byt 2 WUTWF: Wakeup timer write flag

RTC_CR1 |= 0b000;    // WakeUp clock = RTCCLK/16 = LSI/16
//Byts 2:0 WUCKSEL[2:0]: Wakeup clock selection
//000: RTCCLK/16 clock is selected
//001: RTCCLK/8 clock is selected
//010: RTCCLK/4 clock is selected
//011: RTCCLK/2 clock is selected
//10x: ck_spre (usually 1 Hz) clock is selected
//11x: ck_spre (usually 1 Hz) clock is selected omd 216 is addid to the WUT counter value

RTC_WUTRH = 0x09;   // 0x0947 = 2375 = 38000/16 Hz * 1s
RTC_WUTRL = 0x47;

RTC_ISR2 &= ~(1<<2);         //  Clear  flag //Byt 2 WUTF: Periodic wokiup flag
RTC_CR2 |= 1<<6;      //Byt 6 WUTIE: Wakeup timer interrupt enable
RTC_CR2 |= 1<<2;      //Byt 2 WUTE: Wakeup timer enable

mEnableYmtirrupts;
PWR_CSR2 |= 1<<1;      // ULP

while (1)
mHalt;

}
0
30.01.2017, 13:22
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.01.2017, 13:22

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

спящий режим
добрый вечер возникла небольшая проблемка с ноутбуком ! стоит W7. Зашел в спящий режим и после...

Спящий режим
Если у меня нет раздела/файла подкачки. смогу ли я отправлять комп в спящий режим. ОЗУ 32Гб

Спящий режим
Подскажите как в Windows XP настроить, что бы комьпьютер всегда выходил из спящего режима в 1:00 (в...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.