#include "stm32f1xx_hal.h"
// Ініціалізація таймера TIM3
TIM_HandleTypeDef htim3;
void SystemClock_Config(void);
void GPIO_Init(void);
void TIM3_Init(void);
volatile uint8_t timer_flag = 0; // Флаг переривання таймера
void My_HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
if (htim->Instance == TIM3) // Перевірка джерела переривання
{
timer_flag++; // Встановлення прапорця
}
}
#define HAL_TIM_PeriodElapsedCallback My_HAL_TIM_PeriodElapsedCallback
int main(void)
{
HAL_Init();
SystemClock_Config();
GPIO_Init();
TIM3_Init();
HAL_TIM_Base_Start_IT(&htim3); // Запуск таймера з перериваннями
while (1)
{
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_8, GPIO_PIN_SET); // LED4
while (!timer_flag);
timer_flag = 0;
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_8, GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_11, GPIO_PIN_SET); // LED1
while (!timer_flag);
timer_flag = 0;
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_11, GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_9, GPIO_PIN_SET); // LED3
while (!timer_flag);
timer_flag = 0;
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_9, GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_10, GPIO_PIN_SET); // LED2
while (!timer_flag);
timer_flag = 0;
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_10, GPIO_PIN_RESET);
}
}
// Ініціалізація GPIO
void GPIO_Init(void)
{
__HAL_RCC_GPIOA_CLK_ENABLE(); // Увімкнути тактування порту A
GPIO_InitTypeDef GPIO_InitStruct = {0};
GPIO_InitStruct.Pin = GPIO_PIN_8 | GPIO_PIN_9 | GPIO_PIN_10 | GPIO_PIN_11;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; // Push-pull вихід
GPIO_InitStruct.Pull = GPIO_NOPULL; // Без підтягуючих резисторів
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; // Низька швидкість
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
}
void TIM3_Init(void)
{
__HAL_RCC_TIM3_CLK_ENABLE(); // Увімкнути тактування таймера TIM3
htim3.Instance = TIM3;
htim3.Init.Prescaler = 7200 - 1; // Поділити частоту системи (72 MHz) на 7200 → 10 kHz
htim3.Init.Period = 10000 - 1; // Лічильник до 10000 → 1 секунда
htim3.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
htim3.Init.CounterMode = TIM_COUNTERMODE_UP;
if (HAL_TIM_Base_Init(&htim3) != HAL_OK)
{
// Обробка помилки
while (1);
}
HAL_NVIC_SetPriority(TIM3_IRQn, 0, 0); // Налаштування пріоритету переривань
HAL_NVIC_EnableIRQ(TIM3_IRQn); // Увімкнути переривання для TIM3
}
// Конфігурація системного тактування
void SystemClock_Config(void)
{
RCC_OscInitTypeDef RCC_OscInitStruct = {0};
RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
RCC_OscInitStruct.HSEState = RCC_HSE_ON;
RCC_OscInitStruct.HSEPredivValue = RCC_HSE_PREDIV_DIV1;
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL9;
if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
{
while (1);
}
RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_SYSCLK
| RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2;
RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;
RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK)
{
while (1);
}
}
// Обробник переривання для TIM3
void TIM3_IRQHandler(void)
{
HAL_TIM_IRQHandler(&htim3); // Виклик HAL обробника переривань
}
Loading
stm32-bluepill
stm32-bluepill