#include "main.h" // Memanggil header utama STM32 (HAL, definisi pin, dll)
// Deklarasi fungsi konfigurasi clock
void SystemClock_Config(void);
// Deklarasi fungsi inisialisasi GPIO
static void MX_GPIO_Init(void);
int main(void) // Fungsi utama program
{
HAL_Init(); // Inisialisasi HAL (reset sistem & setup dasar)
SystemClock_Config(); // Konfigurasi clock sistem
MX_GPIO_Init(); // Inisialisasi GPIO (input & output)
while (1) // Loop utama (berjalan terus menerus)
{
// Membaca kondisi sensor IR pada pin PA1
GPIO_PinState ir = HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_1);
// Membaca kondisi switch pada pin PA0
GPIO_PinState sw = HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0);
// Jika IR tidak mendeteksi objek (0) DAN switch ON (1)
if (ir == GPIO_PIN_RESET && sw == GPIO_PIN_SET)
{
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1, GPIO_PIN_SET); // Nyalakan LED merah (PB1)
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_SET); // Nyalakan LED hijau (PB0)
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_2, GPIO_PIN_SET); // Nyalakan LED biru (PB2)
// Semua LED ON → warna putih
}
else
{
// Jika kondisi tidak terpenuhi → matikan semua LED
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1, GPIO_PIN_RESET); // Matikan merah
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_RESET); // Matikan hijau
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_2, GPIO_PIN_RESET); // Matikan biru
}
HAL_Delay(50); // Delay 50 ms untuk stabilisasi pembacaan
}
}
// Fungsi konfigurasi clock sistem
void SystemClock_Config(void)
{
RCC_OscInitTypeDef RCC_OscInitStruct = {0}; // Struktur konfigurasi oscillator
RCC_ClkInitTypeDef RCC_ClkInitStruct = {0}; // Struktur konfigurasi clock
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI; // Gunakan HSI (internal clock)
RCC_OscInitStruct.HSIState = RCC_HSI_ON; // Aktifkan HSI
RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT; // Kalibrasi default
// Jika konfigurasi oscillator gagal → masuk error handler
if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
{
Error_Handler();
}
// Konfigurasi jenis clock
RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK |
RCC_CLOCKTYPE_SYSCLK |
RCC_CLOCKTYPE_PCLK1;
RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_HSI; // Sumber clock dari HSI
RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; // Tidak dibagi
RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1; // Tidak dibagi
// Jika konfigurasi clock gagal
if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_0) != HAL_OK)
{
Error_Handler();
}
}
// Fungsi inisialisasi GPIO
static void MX_GPIO_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct = {0}; // Struktur konfigurasi GPIO
__HAL_RCC_GPIOA_CLK_ENABLE(); // Aktifkan clock GPIOA
__HAL_RCC_GPIOB_CLK_ENABLE(); // Aktifkan clock GPIOB
// Konfigurasi PA0 & PA1 sebagai input
GPIO_InitStruct.Pin = GPIO_PIN_0 | GPIO_PIN_1;
GPIO_InitStruct.Mode = GPIO_MODE_INPUT; // Mode input
GPIO_InitStruct.Pull = GPIO_PULLDOWN; // Pull-down (default = 0)
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); // Terapkan ke GPIOA
// Konfigurasi PB0, PB1, PB2 sebagai output
GPIO_InitStruct.Pin = GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; // Output push-pull
GPIO_InitStruct.Pull = GPIO_NOPULL; // Tanpa resistor internal
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;// Kecepatan rendah
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); // Terapkan ke GPIOB
}
// Fungsi penanganan error
void Error_Handler(void)
{
__disable_irq(); // Nonaktifkan interrupt
while (1)
{
// Loop tak hingga jika terjadi error
}
}
Komentar
Posting Komentar