Tomrom
|
|
1 | |
STM8L152 RTC и спящий режим.04.01.2017, 00:01. Просмотров 4420. Ответов 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); } |
|
04.01.2017, 00:01 | |
"Спящий" режим STM32F Перевод контроллера в спящий режим и выход из него Проблемы с SPI STM8L152 спящий режим
__________________
6
Помогаю в написании студенческих работ здесь. |
|
0 / 0 / 0
Регистрация: 12.07.2011
Сообщений: 2
|
|
04.01.2017, 00:05 | 2 |
Состояние портов нужно перевести в 0/1, по ситуации. Вход или весящие в воздухе не годятся.
0
|
Tomrom
|
|
04.01.2017, 00:29 | 3 |
Спасио! Добавил в инициализацию, стало 1.5мкА! Тема закрыта.
|
Tomrom
|
|
19.01.2017, 22:40 | 4 |
Вот еще вылез один вопросец после тестирования.
Поторопился я закрывать топик. Решил перенести прогу на новый проц и макетку, купил STM8L151К6Т6, залил этот же код в него, потребляемый ток 700 мкА! Думал в макетке дело, может течет где. Выпаял проц, на проводках подпаял проц и померил ток, те же 700 мкА, хотя на Дискавери плате этот же код дает 2-3 мкА. Думал в кварце часовом и обвязке дело, менял и кварц и конденсаторы, не помогает. Лысый проц на проводках дает 700 мкА. Может в железе есть какие отличия и программу подправить надо или проц попался мне такой, что я пропустил? |
rspdvs
|
|
21.01.2017, 08:00 | 5 |
Использую STM8L151К6Т6. В режиме Halt с RTC (только WUT) на LSI 38 кГц с ULP потребляет 1,5мкА. Без ULP - 4мкА. Если нужно кину для проверки свое барахло (sdcc, без st библиотек).
|
Tomrom
|
|
22.01.2017, 19:03 | 6 |
![]() |
rspdvs
|
|
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; } |
30.01.2017, 13:22 | |
Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь или здесь. Спящий режим спящий режим Спящий режим Спящий режим Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |