#include "main.h" // Mengimpor file header utama untuk konfigurasi mikrocontroller
void SystemClock_Config(void); // Deklarasi fungsi untuk mengonfigurasi sistem clock
static void MX_GPIO_Init(void); // Deklarasi fungsi untuk inisialisasi GPIO
int main(void)
{
HAL_Init(); // Inisialisasi Hardware Abstraction Layer (HAL)
SystemClock_Config(); // Konfigurasi sistem clock
MX_GPIO_Init(); // Inisialisasi pin GPIO
while (1)
{
uint8_t ir_status = HAL_GPIO_ReadPin(GPIOB, IR_Pin); // Membaca status sensor IR (PB10)
uint8_t touch_status = HAL_GPIO_ReadPin(GPIOB, TOUCH_Pin); // Membaca status Touch Sensor (PB6)
// LED Biru menyala jika IR aktif
HAL_GPIO_WritePin(BLUE_GPIO_Port, BLUE_Pin, ir_status);
// LED Hijau menyala jika Touch aktif
HAL_GPIO_WritePin(GPIOA, GREEN_Pin, touch_status);
// LED Merah menyala jika tidak ada sensor yang aktif
if (ir_status == GPIO_PIN_RESET && touch_status == GPIO_PIN_RESET) {
HAL_GPIO_WritePin(GPIOA, RED_Pin, GPIO_PIN_SET); // Nyalakan LED Merah
} else {
HAL_GPIO_WritePin(GPIOA, RED_Pin, GPIO_PIN_RESET); // Matikan LED Merah
}
HAL_Delay(10); // Delay 10 ms untuk stabilisasi pembacaan sensor
}
}
void SystemClock_Config(void)
{
RCC_OscInitTypeDef RCC_OscInitStruct = {0}; // Struktur konfigurasi osilator
RCC_ClkInitTypeDef RCC_ClkInitStruct = {0}; // Struktur konfigurasi clock
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI; // Menggunakan osilator internal HSI
RCC_OscInitStruct.HSIState = RCC_HSI_ON; // Menyalakan osilator HSI
RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT; // Menggunakan kalibrasi default
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE; // Tidak menggunakan PLL
if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
{
Error_Handler(); // Menjalankan error handler jika konfigurasi gagal
}
}
static void MX_GPIO_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct = {0}; // Struktur konfigurasi GPIO
__HAL_RCC_GPIOD_CLK_ENABLE(); // Mengaktifkan clock untuk port GPIOD
__HAL_RCC_GPIOA_CLK_ENABLE(); // Mengaktifkan clock untuk port GPIOA
__HAL_RCC_GPIOB_CLK_ENABLE(); // Mengaktifkan clock untuk port GPIOB
/* Konfigurasi GPIO pin Output Level */
HAL_GPIO_WritePin(GPIOA, RED_Pin|GREEN_Pin, GPIO_PIN_RESET); // Matikan LED Merah dan Hijau saat awal
HAL_GPIO_WritePin(BLUE_GPIO_Port, BLUE_Pin, GPIO_PIN_RESET); // Matikan LED Biru saat awal
/* Konfigurasi pin GPIO untuk LED */
GPIO_InitStruct.Pin = RED_Pin|GREEN_Pin; // Pin untuk LED Merah dan Hijau
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; // Mode output push-pull
GPIO_InitStruct.Pull = GPIO_NOPULL; // Tanpa pull-up/pull-down
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; // Kecepatan rendah
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); // Inisialisasi GPIOA
/* Konfigurasi pin GPIO untuk LED Biru */
GPIO_InitStruct.Pin = BLUE_Pin;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(BLUE_GPIO_Port, &GPIO_InitStruct); // Inisialisasi GPIO untuk LED Biru
/* Konfigurasi pin GPIO untuk Sensor IR dan Touch */
GPIO_InitStruct.Pin = IR_Pin|TOUCH_Pin; // Pin untuk sensor IR dan Touch
GPIO_InitStruct.Mode = GPIO_MODE_INPUT; // Mode input
GPIO_InitStruct.Pull = GPIO_NOPULL; // Tanpa pull-up/pull-down
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); // Inisialisasi GPIOB
}
void Error_Handler(void)
{
__disable_irq(); // Menonaktifkan interrupt
while (1)
{
// Loop tanpa henti jika terjadi kesalahan
}
}
#ifdef USE_FULL_ASSERT
void assert_failed(uint8_t *file, uint32_t line)
{
// Fungsi ini akan dipanggil jika terjadi error pada assert
}
#endif /* USE_FULL_ASSERT */
Tidak ada komentar:
Posting Komentar