// 5A) - Externí přerušení // vstupy PC6 a PC7, informační výstupy PC8 resp. PC9, detekce vzestupné hrany #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_exti.h" #include "stm32f0xx_ll_system.h" void gpio_init(void); void clock_init(void); void exti_init(void); void delay(uint32_t del); // hloupý delay int main(void){ gpio_init(); // PC8,PC9 výstupy, PC6,PC7 vstupy s pulldown clock_init(); // 48MHz z HSI exti_init(); // konfigurace externího přerušení while (1){ } } void EXTI4_15_IRQHandler(void){ if(LL_EXTI_ReadFlag_0_31(LL_EXTI_LINE_6)){ // přišlo přerušení z PC6 LL_EXTI_ClearFlag_0_31(LL_EXTI_LINE_6); // vyčisti vlajku LL_GPIO_SetOutputPin(GPIOC,LL_GPIO_PIN_8); // info výstup PC6 delay(100); // dělej něco užitečného LL_GPIO_ResetOutputPin(GPIOC,LL_GPIO_PIN_8); } if(LL_EXTI_ReadFlag_0_31(LL_EXTI_LINE_7)){ // přišlo přerušení z PC7 LL_EXTI_ClearFlag_0_31(LL_EXTI_LINE_7); // vyčisti vlajku LL_GPIO_SetOutputPin(GPIOC,LL_GPIO_PIN_9); // info výstup PC7 delay(100); // dělej něco užitečného LL_GPIO_ResetOutputPin(GPIOC,LL_GPIO_PIN_9); } } void exti_init(void){ LL_EXTI_InitTypeDef exti; // clock pro SYSCFG (obstarává externí přerušení) LL_APB1_GRP2_EnableClock(LL_APB1_GRP2_PERIPH_SYSCFG); exti.Line_0_31 = LL_EXTI_LINE_6 | LL_EXTI_LINE_7; // linky 6 a 7 exti.Mode = LL_EXTI_MODE_IT; // režim přerušení exti.Trigger = LL_EXTI_TRIGGER_RISING; // vzestupná hrana exti.LineCommand = ENABLE; // chceme je povolit LL_EXTI_Init(&exti); // aplikuj nastavení // namapuj linky EXTI6 a EXTI7 na GPIOC (tedy na PC6 a PC7) LL_SYSCFG_SetEXTISource(LL_SYSCFG_EXTI_PORTC,LL_SYSCFG_EXTI_LINE6); LL_SYSCFG_SetEXTISource(LL_SYSCFG_EXTI_PORTC,LL_SYSCFG_EXTI_LINE7); // povol přerušení s příslušnou prioritou NVIC_SetPriority(EXTI4_15_IRQn,2); NVIC_EnableIRQ(EXTI4_15_IRQn); } void clock_init(void){ LL_UTILS_PLLInitTypeDef pll; LL_UTILS_ClkInitTypeDef clk; pll.PLLMul = LL_RCC_PLL_MUL_12; clk.AHBCLKDivider = LL_RCC_SYSCLK_DIV_1; clk.APB1CLKDivider = LL_RCC_APB1_DIV_1; // kompletní inicializace systémového clocku LL_PLL_ConfigSystemClock_HSI(&pll,&clk); SystemCoreClockUpdate(); } void gpio_init(void){ LL_GPIO_InitTypeDef gp; LL_AHB1_GRP1_EnableClock(LL_AHB1_GRP1_PERIPH_GPIOC); // spustit clock pro GPIOC LL_GPIO_StructInit(&gp); // předplnit gp výchozími hodnotami // PC8 a PC9 výstupy gp.Pin = LL_GPIO_PIN_8 | LL_GPIO_PIN_9; gp.Mode = LL_GPIO_MODE_OUTPUT; gp.Speed = LL_GPIO_SPEED_HIGH; LL_GPIO_Init(GPIOC,&gp); // PC6 a PC7 vstupy s pulldown gp.Pin = LL_GPIO_PIN_6 | LL_GPIO_PIN_7; gp.Mode = LL_GPIO_MODE_INPUT; gp.Pull = LL_GPIO_PULL_DOWN; LL_GPIO_Init(GPIOC,&gp); } // hloupý delay void delay(uint32_t del){ uint32_t i; for(i=0;i