|
|
  |
lpc1765 не хочет бай-бай |
|
|
|
Jan 31 2014, 18:49
|

Местный
  
Группа: Свой
Сообщений: 414
Регистрация: 8-06-06
Пользователь №: 17 897

|
Всем привет! lpc1765 потребялет чрезмерно много тока в режиме PowerDown (около 1мА). Потребляет именно сам процессор - всё остальное с платы уже отпаяли. Не могу понять, что же мы забыли отключить. Если переключится в Deep PowerDown, потребление снижается до 240мкА. Но такой режим нам не подходит, потому что нужно просыпаться по прерыванию на ноге. Вот код: Код __disable_irq(); systick_ctrl_temp = SysTick->CTRL; // Remember the SysTick timer state SysTick->CTRL = 0; // Turn off the SysTick timer pconp_temp = LPC_SC->PCONP; // Remember the PCONP state LPC_SC->PCONP = 0x00; SCB->SCR |= 0x04; // SLEEPDEEP bit = 1 LPC_SC->PCON = (1 << 3) | (1 << 0); // POWER DOWN mode, BOD disabled __WFI(); __nop(); __nop(); __nop(); __nop(); SystemInit(); LPC_SC->PCONP = pconp_temp; // Restore the PCONP state SysTick->CTRL = systick_ctrl_temp; // Restore the SysTick state __enable_irq(); Все пины перед сном находятся в корректных состояниях (input floating, либо input pull-down либо output low). Если бы утечка шла через пины, думаю, не было бы такой разницы между PowerDown и Deep PowerDown. В проекте используются SSP, I2C, CAN, USB - но всё это хозяйство мы перед сном отключаем, к тому же Код LPC_SC->PCONP = 0x00; не оставляет периферии шансов, как я понимаю. Что же ещё мы забыли отключить?
--------------------
Курильщик даташитов со стажем
|
|
|
|
|
Jan 31 2014, 19:53
|

Местный
  
Группа: Свой
Сообщений: 414
Регистрация: 8-06-06
Пользователь №: 17 897

|
Цитата(Golikov A. @ Jan 31 2014, 23:52)  а на внутренний клок перешли, ПЛЛ выключили? Специально - не выключаем, но, как я понял из документации, в PowerDown режиме это всё само отключается и по осциллографу видно что пропадает генерация на кварце. Там написано, что есть смысл предварительно переключаться на IRC, только если нужно быстро проснуться потом. Вы считаете, принудительное отключение PLL и переход на IRC должны помочь? Добавил отключение PLL. С точки зрения энергопотребления, ничего не изменилось Код systick_ctrl_temp = SysTick->CTRL; // Remember the SysTick timer state SysTick->CTRL = 0; // Turn off the SysTick timer LPC_SC->PLL0CON = 0x00; // Disable the PLL LPC_SC->PLL0FEED = 0xAA; // Feed the security sequence LPC_SC->PLL0FEED = 0x55; LPC_SC->CLKSRCSEL = 0x00; // Switch to the internal RC pconp_temp = LPC_SC->PCONP; // Remember the PCONP state LPC_SC->PCONP = 0x00; SCB->SCR |= 0x04; // ( 1 << 2 ); // SLEEPDEEP bit = 1 LPC_SC->PCON = (1 << 3) | (1 << 0); // POWER DOWN mode __WFI(); __nop(); __nop(); __nop(); __nop(); SystemInit(); LPC_SC->PCONP = pconp_temp; // Restore the PCONP state SysTick->CTRL = systick_ctrl_temp; // Restore the SysTick state
--------------------
Курильщик даташитов со стажем
|
|
|
|
|
Jan 31 2014, 22:06
|

Местный
  
Группа: Свой
Сообщений: 414
Регистрация: 8-06-06
Пользователь №: 17 897

|
Цитата(Сергей Борщ @ Feb 1 2014, 02:56)  А встроенная подтяжка на этих выходах отключена? Нет ли у этого процессора битов портов, не выведенных на ноги? Если есть, не включены ли они случайно на вывод нуля с включенной подтяжкой? Проверил. Перед сном всего 5 пинов настроено на выход, подтяжка отключена. Остальные либо input, либо input pulldown (которые не разведены - input pulldown). Если я праивльно понимаю, в случае какой-то утечки по пинам, не было бы этих 750мкА разницы между Deep PowerDown и просто PowerDown?
--------------------
Курильщик даташитов со стажем
|
|
|
|
|
Feb 2 2014, 15:27
|
Группа: Новичок
Сообщений: 9
Регистрация: 6-04-13
Пользователь №: 76 376

|
1. Никакие пины не сконфигурированы как функциональные? Перед powerdown их надо переводить обратно в I/O. 2. Про PLL есть errata 3.9: Цитата Problem: If the main PLL (PLL0) is enabled and connected before entering Deep Sleep or Power-down modes, it will remain enabled and connected after the chip enters Deep Sleep mode or Power-down mode causing the power consumption to be higher. Принудительно отключается следующим образом Код LPC_SC->PLL0CON &= ~(1<<1); /* Disconnect the main PLL (PLL0) */ LPC_SC->PLL0FEED = 0xAA; /* Feed */ LPC_SC->PLL0FEED = 0x55; /* Feed */ while ((LPC_SC->PLL0STAT & (1<<25)) != 0x00); /* Wait for main PLL (PLL0) to disconnect */ LPC_SC->PLL0CON &= ~(1<<0); /* Turn off the main PLL (PLL0) */ LPC_SC->PLL0FEED = 0xAA; /* Feed */ LPC_SC->PLL0FEED = 0x55; /* Feed */ while ((LPC_SC->PLL0STAT & (1<<24)) != 0x00); /* Wait for main PLL (PLL0) to shut down */ У меня всё устройство на LPC1768 в powerdown потребляет 60 мкА.
Сообщение отредактировал ecomp42 - Feb 2 2014, 15:31
|
|
|
|
|
Feb 3 2014, 18:58
|

Местный
  
Группа: Свой
Сообщений: 414
Регистрация: 8-06-06
Пользователь №: 17 897

|
Цитата(ecomp42 @ Feb 2 2014, 21:27)  1. Никакие пины не сконфигурированы как функциональные? Перед powerdown их надо переводить обратно в I/O. Все пины перед входом в спящий режим сконфигурированы как GPIO Цитата(ecomp42 @ Feb 2 2014, 21:27)  2. Про PLL есть errata 3.9: Спасибо за наводку! Не поверите, перед тем как открывать эту тему, я пролистал errat'у 3 раза, и не заметил этого вопиющего бага. Видимо, нужно было ещё и читать К сожалению, не помогло. Код: Код __disable_irq(); systick_ctrl_temp = SysTick->CTRL; // Remember the SysTick timer state SysTick->CTRL = 0; // Turn off the SysTick timer
// В этом месте потребление = 41мА LPC_SC->PLL0CON &= ~(1<<1); /* Disconnect the main PLL (PLL0) */ LPC_SC->PLL0FEED = 0xAA; /* Feed */ LPC_SC->PLL0FEED = 0x55; /* Feed */ while ((LPC_SC->PLL0STAT & (1<<25)) != 0x00); /* Wait for main PLL (PLL0) to disconnect */
// 8.5мА LPC_SC->PLL0CON &= ~(1<<0); /* Turn off the main PLL (PLL0) */ LPC_SC->PLL0FEED = 0xAA; /* Feed */ LPC_SC->PLL0FEED = 0x55; /* Feed */ while ((LPC_SC->PLL0STAT & (1<<24)) != 0x00); /* Wait for main PLL (PLL0) to shut down */ // 6.5мА pconp_temp = LPC_SC->PCONP; // Remember the PCONP state LPC_SC->PCONP = 0x00; // 6.25мА SCB->SCR |= 0x04; // ( 1 << 2 ); // SLEEPDEEP bit = 1 LPC_SC->PCON = (1 << 3) | (1 << 0); // POWER DOWN mode __WFI(); // 1мА :( __nop(); __nop(); __nop(); __nop(); SystemInit(); LPC_SC->PCONP = pconp_temp; // Restore the PCONP state SysTick->CTRL = systick_ctrl_temp; // Restore the SysTick state __enable_irq(); По потребляемому току видно, что PLL отключается. Окончательно ничего не понимаю. Я искренне верю, что не бывает глючных процессоров, бывают только невыкуренные до конца даташиты и ерраты. Что же я ещё упустил? Цитата(ecomp42 @ Feb 2 2014, 21:27)  У меня всё устройство на LPC1768 в powerdown потребляет 60 мкА. Если это не представляет большую коммерческую тайну, не могли бы Вы поделиться участком кода, который отвечает за перевод в спящий режим?
--------------------
Курильщик даташитов со стажем
|
|
|
|
|
Feb 3 2014, 19:21
|

Местный
  
Группа: Свой
Сообщений: 414
Регистрация: 8-06-06
Пользователь №: 17 897

|
Цитата(Golikov A. @ Feb 4 2014, 01:04)  а вы не жетагом каким-нибудь случайно смотрите, ничего такого рода отключить не забыли? А есть еще образец запаянный? может на плате что еще? "Боевое" энергопотребление проверяю, конечно, с отключенным j-tag. Всё что можно отключил, отпаял, по-сути, остался только голый проц. Ну и тот факт, что при включении режима Deep PowerDown, энергопотребление падает до 250мкА, говорит что проблема где-то внутри проца, а не в обвязке?
--------------------
Курильщик даташитов со стажем
|
|
|
|
|
Feb 4 2014, 02:46
|
Группа: Новичок
Сообщений: 9
Регистрация: 6-04-13
Пользователь №: 76 376

|
"Если это не представляет большую коммерческую тайну, не могли бы Вы поделиться участком кода, который отвечает за перевод в спящий режим?" Сначала отключаются пины Код // // Отключение периферийных узлов, перевод пинов в отключенное состояние // перед переходом в powerdown // void peripheryOff(void) { LPC_PINCON->PINSEL0 = 0; LPC_PINCON->PINSEL1 = 0; LPC_PINCON->PINSEL2 = 0; LPC_PINCON->PINSEL3 = 0; // LPC_PINCON->PINSEL4 = 0;
// EINT1 enable - nWAKEUP LPC_PINCON->PINSEL4 = 0x00400000; // 00000000 01000000 00000000 00000000 // b0: P2.0: P2.1: P2.2: P2.3: // b1: P2.4: P2.5: P2.6: P2.7: // b2: P2.8: P2.9: P2.10: P2.11:EINT1 // b3: P2.12 P2.13: ----- ------
NVIC_SetPriority(EINT1_IRQn, 4); NVIC_EnableIRQ(EINT1_IRQn);
LPC_PINCON->PINMODE0 = 0xaaaaaaaa; // 10101010 no pull-up, no pull-down LPC_PINCON->PINMODE1 = 0xaaaaaaaa; LPC_PINCON->PINMODE2 = 0xaaaaaaaa; LPC_PINCON->PINMODE3 = 0xaaaaaaaa; LPC_PINCON->PINMODE4 = 0xaaaaaaaa; LPC_PINCON->PINMODE7 = 0x00280000; // 00000000 00101000 00000000 00000000 LPC_PINCON->PINMODE9 = 0x0a000000; // 00001010 00000000 00000000 00000000
LPC_GPIO0->FIODIR = 0; LPC_GPIO1->FIODIR = 0; LPC_GPIO2->FIODIR = 0; LPC_GPIO3->FIODIR = 0; LPC_GPIO4->FIODIR = 0; } Потом собственно powerdown Код // mode: 1 - sleep mode // 2 - deep sleep // 3 - deep powerdown // 4 - powerdown void setPowerDown(Uint16 mode) { // errata 3.9 workaround (PLL0 remains enabled and connected in Deep Sleep // and Power-down modes) if(mode == 2 || mode == 4) { LPC_SC->PLL0CON &= ~(1<<1); /* Disconnect the main PLL (PLL0) */ LPC_SC->PLL0FEED = 0xAA; /* Feed */ LPC_SC->PLL0FEED = 0x55; /* Feed */ while ((LPC_SC->PLL0STAT & (1<<25)) != 0x00); /* Wait for main PLL (PLL0) to disconnect */ LPC_SC->PLL0CON &= ~(1<<0); /* Turn off the main PLL (PLL0) */ LPC_SC->PLL0FEED = 0xAA; /* Feed */ LPC_SC->PLL0FEED = 0x55; /* Feed */ while ((LPC_SC->PLL0STAT & (1<<24)) != 0x00); /* Wait for main PLL (PLL0) to shut down */ }
switch(mode) { default: break; case 1: break; case 2: // LPC_SC->PCONP = 0; SCB->SCR |= 4; // SLEEPDEEP __WFI(); break; case 3: SCB->SCR |= 4; // SLEEPDEEP LPC_SC->PCON |= 3; // DEEP POWERDOWN __WFI(); break;
case 4: // LPC_SC->PCONP = 0; SCB->SCR |= 4; // SLEEPDEEP LPC_SC->PCON |= 1; // POWERDOWN // LPC_SC->PCON |= 0x0c; // BOD global disable __WFI(); break; } NVIC_SystemReset(); } А что у вас с RTC? Попробуйте для проверки подключить Vbat напрямую на Vdd, убрать часовой кварц, если есть, и вход RTC посадить на землю. Если ничего не помогает - поменять МК, может правда вывод поддох, сталкивался с таким.
|
|
|
|
|
Feb 4 2014, 19:21
|

Местный
  
Группа: Свой
Сообщений: 414
Регистрация: 8-06-06
Пользователь №: 17 897

|
Цитата(ecomp42 @ Feb 4 2014, 08:46)  - Спасибо! Буду разбираться. Vbat у нас сидит на Vdd, а с ногами часого кварца - хорошая мысль, сейчас вспомнил, на stm32l тоже с ними была проблема, правда они вляли на считанные доли микроампера..
--------------------
Курильщик даташитов со стажем
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|