void SystemClock_Config(void);
void GPIO_Init(void);
void EXTI_Init(void);
void EXTI0_IRQHandler(void);
int main(void)
{
HAL_Init();
SystemClock_Config();
GPIO_Init();
EXTI_Init();
while (1)
{
// Ana program döngüsü
}
}
void GPIO_Init(void)
{
__HAL_RCC_GPIOA_CLK_ENABLE();
GPIO_InitTypeDef GPIO_InitStruct;
GPIO_InitStruct.Pin = GPIO_PIN_0; // PA0 (GPIO_PIN_0) pinini düğme (buton) girişi olarak kullanıyoruz
GPIO_InitStruct.Mode = GPIO_MODE_IT_RISING;
GPIO_InitStruct.Pull = GPIO_PULLUP;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
GPIO_InitStruct.Pin = GPIO_PIN_1; // PA1 (GPIO_PIN_1) pinini LED çıkışı olarak kullanıyoruz
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
}
void EXTI_Init(void)
{
HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0);
HAL_NVIC_EnableIRQ(SysTick_IRQn);
// EXTI0'ı PA0 pini ile ilişkilendir
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_RESET); // LED'i başlangıçta kapalı olarak ayarla
HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0);
HAL_NVIC_EnableIRQ(SysTick_IRQn);
// EXTI konfigürasyonu
EXTI->IMR |= EXTI_IMR_IM0;
EXTI->RTSR |= EXTI_RTSR_TR0;
}
void EXTI0_IRQHandler(void)
{
HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_1); // Butona basıldığında LED'in durumunu değiştir
HAL_Delay(200); // Zamanlama için kısa bir gecikme ekleyin
HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_0); // EXTI kesme işlemi tamamlandı
}
void SystemClock_Config(void)
{
RCC_OscInitTypeDef RCC_OscInitStruct;
RCC_ClkInitTypeDef RCC_ClkInitStruct;
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
RCC_OscInitStruct.HSEState = RCC_HSE_ON;
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL3; // RCC_PLL_MUL9 yerine RCC_PLL_MUL3 kullanıyoruz
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_PLLCLK;
RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;
RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_0); // FLASH_LATENCY_2 yerine FLASH_LATENCY_0 kullanıyoruz
}