/* USER CODE BEGIN Header */ /** ****************************************************************************** * : main.c * : Primer TIM i EXTI prekida na STM32F401RE ****************************************************************************** */ #include "stm32f4xx_hal.h" /* TIM handle deklaracije */ TIM_HandleTypeDef htim2; TIM_HandleTypeDef htim3; /* Funkcije za inicijalizaciju */ void SystemClock_Config(void); static void MX_GPIO_Init(void); static void MX_TIM2_Init(uint32_t PSC, uint32_t ARR); static void MX_TIM3_Init(uint32_t PSC, uint32_t ARR); /* Glavna funkcija */ int main(void) { HAL_Init(); SystemClock_Config(); // HSI 16 MHz MX_GPIO_Init(); /* Inicijalizacija tajmera */ MX_TIM2_Init(15999, 0); // TIM2, 1 ms MX_TIM3_Init(15, 99); // TIM3, 100 us /* Start tajmera sa interruptom */ HAL_TIM_Base_Start_IT(&htim2); HAL_TIM_Base_Start_IT(&htim3); while (1) { // Glavna petlja prazna } } /* ----------------- GPIO Inicijalizacija ----------------- */ static void MX_GPIO_Init(void) { GPIO_InitTypeDef GPIO_InitStruct = {0}; /* LED PC13 */ __HAL_RCC_GPIOC_CLK_ENABLE(); GPIO_InitStruct.Pin = GPIO_PIN_13; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; HAL_GPIO_Init(GPIOC, &GPIO_InitStruct); /* PA0 kao EXTI na RISING edge */ __HAL_RCC_GPIOA_CLK_ENABLE(); GPIO_InitStruct.Pin = GPIO_PIN_0; GPIO_InitStruct.Mode = GPIO_MODE_IT_RISING; GPIO_InitStruct.Pull = GPIO_NOPULL; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); /* PB1 kao EXTI na RISING i FALLING edge */ __HAL_RCC_GPIOB_CLK_ENABLE(); GPIO_InitStruct.Pin = GPIO_PIN_1; GPIO_InitStruct.Mode = GPIO_MODE_IT_RISING_FALLING; GPIO_InitStruct.Pull = GPIO_PULLUP; HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); /* NVIC konfiguracija za EXTI */ HAL_NVIC_SetPriority(EXTI0_IRQn, 1, 0); HAL_NVIC_EnableIRQ(EXTI0_IRQn); HAL_NVIC_SetPriority(EXTI1_IRQn, 1, 0); HAL_NVIC_EnableIRQ(EXTI1_IRQn); } /* ----------------- TIM2 Inicijalizacija ----------------- */ static void MX_TIM2_Init(uint32_t PSC, uint32_t ARR) { __HAL_RCC_TIM2_CLK_ENABLE(); htim2.Instance = TIM2; htim2.Init.Prescaler = PSC; htim2.Init.CounterMode = TIM_COUNTERMODE_UP; htim2.Init.Period = ARR; htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; htim2.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE; HAL_TIM_Base_Init(&htim2); HAL_NVIC_SetPriority(TIM2_IRQn, 0, 0); HAL_NVIC_EnableIRQ(TIM2_IRQn); } /* ----------------- TIM3 Inicijalizacija ----------------- */ static void MX_TIM3_Init(uint32_t PSC, uint32_t ARR) { __HAL_RCC_TIM3_CLK_ENABLE(); htim3.Instance = TIM3; htim3.Init.Prescaler = PSC; htim3.Init.CounterMode = TIM_COUNTERMODE_UP; htim3.Init.Period = ARR; htim3.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; htim3.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE; HAL_TIM_Base_Init(&htim3); HAL_NVIC_SetPriority(TIM3_IRQn, 0, 0); HAL_NVIC_EnableIRQ(TIM3_IRQn); } /* ----------------- Callback funkcije ----------------- */ void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) { if(GPIO_Pin == GPIO_PIN_0) { HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_13); // PA0 prekid → toggle LED } else if(GPIO_Pin == GPIO_PIN_1) { HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_13); // PB1 prekid → toggle LED } } void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) { if(htim->Instance == TIM2) { HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_13); // TIM2 interupt → toggle LED } else if(htim->Instance == TIM3) { HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_13); // TIM3 interupt → toggle LED } } /* ----------------- IRQ Handleri ----------------- */ void EXTI0_IRQHandler(void) { HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_0); } void EXTI1_IRQHandler(void) { HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_1); } void TIM2_IRQHandler(void) { HAL_TIM_IRQHandler(&htim2); } void TIM3_IRQHandler(void) { HAL_TIM_IRQHandler(&htim3); } /* ----------------- System Clock ----------------- */ void SystemClock_Config(void) { RCC_OscInitTypeDef RCC_OscInitStruct = {0}; RCC_ClkInitTypeDef RCC_ClkInitStruct = {0}; /* HSI 16 MHz */ RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI; RCC_OscInitStruct.HSIState = RCC_HSI_ON; RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT; RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE; HAL_RCC_OscConfig(&RCC_OscInitStruct); RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2; RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_HSI; RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1; RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1; HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_0); }