Skocz do zawartości

STM32F103RB - oszczędzanie energii


Pomocna odpowiedź

W pierwszym poście pisze, że workbench ja używam attolica wiec sie nie wypowiem - attolic ma 8 MHz.

Najlepiej jest dokładnie sprawdzić kod który się używa, albo który wygenerowało środowisko.

Jako ciekawostkę zainstalowałem TrueStudio, wersja 8.0.0 - dopiero co pobrana.

Utworzyłem nowy projekt dla Nucleo-103RB i... jednak jest 64MHz...

Fragment pliku startup_stm32f10x_md.s:

/* Call the clock system intitialization function.*/
   bl  SystemInit
/* Call static constructors */
   bl __libc_init_array
/* Call the application's entry point.*/
bl	main
bx	lr

Funkcja SystemInit() wywołuje SetSysClock():

static void SetSysClock(void)
{
 __IO uint32_t StartUpCounter = 0, HSEStatus = 0;

#ifdef PLL_SOURCE_HSI  
 /* At this stage the HSI is already enabled */

 /*  PLL configuration: PLLCLK = HSI/2 * 16 = 64 MHz */
 RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_PLLSRC | RCC_CFGR_PLLMULL));
 RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLSRC_HSI_Div2 | RCC_CFGR_PLLMULL16);

Nie mam jak przetestować, ale wygląda że działa szybciej niż 8MHz. Oczywiście w tym samym środowisku można mieć program który nie uruchamia PLL - to tylko kod wygenerowany z automatu.

Elvis, przyznaję rację.Zapomniałem że dla F1 mam napisane swoje funkcje do obsługi zegarów.

Sprawdziłem, że bez zworki E5V mikrokontroler nie działa, czemu tak jest? Nie mogę odłączyć programatora bez jego odłamania tak by działał prawidłowo procesor?

Ta zworka doprowadza zasilanie do procka, jest ona po to abyś mógł ją rozłączyć i w to miejsce wpiąć mikroamperomierz (uA) lub korzystać z nucleo jako z programatora bez łamania płytki (trzeba zdjąć jeszcze 2 zworki)

W dokumentacji nucleo na stronie st masz opisane co gdzie i po co 😉

Ok działa mi usypianie uC tylko problem z wybudzaniem czasowym, wg. tego kodu powinien się chyba wybudzać razem ze świeceniem diody a raczej się nie budzi bo prąd nie wzrasta. Bez uśpienia procek pobiera 22mA, gdy wrzucę ten kod pobór spada do 11mA (gdy dioda nie świeci) i 13mA (gdy świeci). Wiecie co jest nie tak z kodem?

int main(void)
{
GPIO_InitTypeDef gpio;
TIM_TimeBaseInitTypeDef tim;
NVIC_InitTypeDef nvic;

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOC | RCC_APB2Periph_GPIOD, ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);

GPIO_StructInit(&gpio);
gpio.GPIO_Pin = GPIO_Pin_5;
gpio.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOA, &gpio);

TIM_TimeBaseStructInit(&tim);
tim.TIM_CounterMode = TIM_CounterMode_Up;
tim.TIM_Prescaler = 64000 - 1;
tim.TIM_Period = 10000 - 1;
TIM_TimeBaseInit(TIM2, &tim);

TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);
TIM_Cmd(TIM2, ENABLE);

nvic.NVIC_IRQChannel = TIM2_IRQn;
nvic.NVIC_IRQChannelPreemptionPriority = 0;
nvic.NVIC_IRQChannelSubPriority = 0;
nvic.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&nvic);

SCB->SCR |= SCB_SCR_SEVONPEND;

while (1) {
  __WFI();
}
}
__attribute__((interrupt)) void TIM2_IRQHandler()
{
   if (TIM_GetITStatus(TIM2, TIM_IT_Update) == SET)
   {
       TIM_ClearITPendingBit(TIM2, TIM_IT_Update);

       if (GPIO_ReadOutputDataBit(GPIOA, GPIO_Pin_5))
           GPIO_ResetBits(GPIOA, GPIO_Pin_5);
       else
           GPIO_SetBits(GPIOA, GPIO_Pin_5);
   }
}

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...