// G režim spánku STANDBY buzený pomoci WKUP1 pinu (PA0) #include "stm32f0xx.h" // výstupy pro LEDku #define TEST_H GPIOA->BSRR = GPIO_Pin_5 #define TEST_L GPIOA->BRR = GPIO_Pin_5 void _delay_ms(uint32_t Delay); void init_test_output(void); void clock_1(void); uint32_t i,pocet; int main(void){ clock_1(); // pracujeme například s 1MHz clockem //DBGMCU_Config(DBGMCU_STANDBY, ENABLE); // povolit debug v STANDBY módu RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR,ENABLE); // spustit clock PWR periferii // rozlišíme jestli se čip probudil Wakeup pinem nebo Resetem if(PWR_GetFlagStatus(PWR_FLAG_WU) == SET){ // pokud jde o Wakeup PWR_BackupAccessCmd(ENABLE); // povolíme přístup do backup domény pocet=RTC_ReadBackupRegister(RTC_BKP_DR0); // přečteme si počet startů... pocet++; // ...inkrementujeme ho ... RTC_WriteBackupRegister(RTC_BKP_DR0,pocet); //... a uložíme PWR_BackupAccessCmd(DISABLE); // zakážeme přístup do backup domény (není nutné) init_test_output(); // nastavíme PA5 jako výstup // Blikneme tolikrát kolikrát už se aplikace probudila od posledního restartu for(i=0;i jádro jede na 1MHz... RCC_PCLKConfig(RCC_HCLK_Div1); // ...periferiím stejný takt jako jádru RCC_SYSCLKConfig(RCC_SYSCLKSource_HSI); // zdrojem clocku je 8MHz HSI SystemCoreClock = 1000000; // clock je 1MHz } // Delay na bázi systicku (vyžaduje korektní nastavení SystemCoreClock) void _delay_ms(uint32_t Delay){ __IO uint32_t tmp = SysTick->CTRL; // Clear the COUNTFLAG first ((void)tmp); // init systick to us delays ... SysTick->LOAD = (SystemCoreClock/1000)-1; // 1us time SysTick->VAL = 0UL; SysTick->CTRL = SysTick_CTRL_ENABLE_Msk | SysTick_CTRL_CLKSOURCE_Msk; if(Delay < 0xffffff){Delay++;} // Add a period to guaranty minimum wait while (Delay){ if((SysTick->CTRL & SysTick_CTRL_COUNTFLAG_Msk) != 0U){Delay--;} } }