// 6A) Basic timer - periodické přerušení #include "stm32f0xx.h" #include "stm32f0xx_ll_bus.h" #include "stm32f0xx_ll_gpio.h" #include "stm32f0xx_ll_rcc.h" #include "stm32f0xx_ll_utils.h" #include "stm32f0xx_ll_tim.h" void init_clock(void); void init_gpio(void); void init_tim6(void); int main(void){ init_clock(); // 48MHz (HSE Bypass) init_gpio(); // PC9 výstup na LED init_tim6(); // nastavení a spuštění TIM6 while (1){ // není co dělat ... } } // rutina přerušení od TIM6 void TIM6_DAC_IRQHandler(void){ // vyčistíme vlajku (likvidujeme zdroj přerušení) LL_TIM_ClearFlag_UPDATE(TIM6); LL_GPIO_TogglePin(GPIOC,LL_GPIO_PIN_8); // přepínáme LED } // konfigurace a spuštění TIM6 void init_tim6(void){ LL_TIM_InitTypeDef tim; // deklarace konfigurační struktury ... LL_APB1_GRP1_EnableClock(LL_APB1_GRP1_PERIPH_TIM6); // spustíme clock do TIM6 LL_TIM_StructInit(&tim); // předplníme strukturu výchozími hodnotami // a nastavíme jen položky které nás zajímají tim.Prescaler = 47999; // clock timeru = 48MHz/48000 = 1kHz tim.Autoreload = 499; // strop časovače je 500 => perioda 0.5s LL_TIM_Init(TIM6,&tim); // aplikujeme nastavení na TIM6 // nastavíme prioritu a povolíme přerušení v NVIC NVIC_SetPriority(TIM6_DAC_IRQn,2); NVIC_EnableIRQ(TIM6_DAC_IRQn); // povolíme přerušení od přetečení v TIM6 LL_TIM_ClearFlag_UPDATE(TIM6); // nejprve pro jistotu vymažeme vlajku LL_TIM_EnableIT_UPDATE(TIM6); // a přerušení povolíme... // nakonec čítač spustíme LL_TIM_EnableCounter(TIM6); } // inicializace LED na PC8 void init_gpio(void){ LL_GPIO_InitTypeDef gp; // clock pro GPIOC LL_AHB1_GRP1_EnableClock(LL_AHB1_GRP1_PERIPH_GPIOC); LL_GPIO_StructInit(&gp); gp.Pin = LL_GPIO_PIN_8; gp.Mode = LL_GPIO_MODE_OUTPUT; gp.Speed = LL_GPIO_SPEED_HIGH; LL_GPIO_Init(GPIOC,&gp); } // 48MHz z externího 8MHz signálu void init_clock(void){ LL_UTILS_PLLInitTypeDef pll; LL_UTILS_ClkInitTypeDef clk; pll.Prediv = LL_RCC_PREDIV_DIV_2; // 8MHz / 2 = 4MHz pll.PLLMul = LL_RCC_PLL_MUL_12; // 4MHz * 12 = 48MHz clk.AHBCLKDivider = LL_RCC_SYSCLK_DIV_1; // APB i AHB bez předděličky clk.APB1CLKDivider = LL_RCC_APB1_DIV_1; // voláme konfiguraci clocku LL_PLL_ConfigSystemClock_HSE(8000000,LL_UTILS_HSEBYPASS_ON,&pll,&clk); // aktualizuj proměnnou SystemCoreClock SystemCoreClockUpdate(); }