// 5B) - Externí přerušení // vstupy PC0 a PC2, 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); int main(void){ gpio_init(); // PC8,PC9 výstupy, PC0,PC2 vstupy s pulldown clock_init(); // 48MHz z HSI exti_init(); // konfigurace externího přerušení while (1){ } } // přerušení od PC0 void EXTI0_1_IRQHandler(void){ uint16_t i; // nekontroluji zdroj přerušení, protože je povolen jen jeden (PC0) GPIOC->BSRR = LL_GPIO_PIN_8; // PC8 do log.1 (info výstup) LL_EXTI_ClearFlag_0_31(LL_EXTI_LINE_0); // vyčisti vlajku // dělej užitečnou činnost for(i=0;i<30;i++){ LL_GPIO_TogglePin(GPIOC,LL_GPIO_PIN_8); // přepínej pin } GPIOC->BRR = LL_GPIO_PIN_8; // PC8 do log.0 (info výstup) } // přerušení od PC2 void EXTI2_3_IRQHandler(void){ uint16_t i; // nekontroluji zdroj přerušení, protože je povolen jen jeden (PC2) GPIOC->BSRR = LL_GPIO_PIN_9; // PC9 do log.1 (info výstup) LL_EXTI_ClearFlag_0_31(LL_EXTI_LINE_2); // vyčisti vlajku // dělej užitečnou činnost for(i=0;i<30;i++){ LL_GPIO_TogglePin(GPIOC,LL_GPIO_PIN_9); // přepínej pin } GPIOC->BRR = LL_GPIO_PIN_9; // PC9 do log.0 (info výstup) } // konfigurace Externích přerušení 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_0 | LL_EXTI_LINE_2; // linky 0 a 2 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_LINE0); LL_SYSCFG_SetEXTISource(LL_SYSCFG_EXTI_PORTC,LL_SYSCFG_EXTI_LINE2); // povol přerušení s příslušnou prioritou NVIC_SetPriority(EXTI0_1_IRQn,2); NVIC_SetPriority(EXTI2_3_IRQn,1); NVIC_EnableIRQ(EXTI0_1_IRQn); NVIC_EnableIRQ(EXTI2_3_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); }