Laporan Akhir M3 Percobaan 1

 




 1. Prosedur  [kembali]

1.1 Persiapan

  • Siapkan dua modul STM32, breadboard, push button, LED, resistor pull-up (10kΩ) untuk tombol, dan resistor 220–330Ω untuk LED.
  • Hubungkan push button pada board atas sesuai skema ke pin input (misal PA1–PA4).
  • Hubungkan LED pada board bawah sesuai skema ke pin output (misal PA1–PA4).
  • Hubungkan jalur komunikasi UART:
    • TX (Board Transmitter) → RX (Board Receiver)
    • GND kedua board dihubungkan

1.2 Pemrograman Board Transmitter (STM32 atas)

  • Konfigurasikan pin tombol sebagai input dengan pull-down.
  • Konfigurasikan UART (baudrate misal 115200 bps).
  • Buat program membaca tombol, jika tombol ditekan maka STM32 atas Akan membaca sinyal dan mengirimkan ke STM32 bawah

1.3 Pemrograman Board Receiver (STM32 bawah)

  • Konfigurasikan UART dengan baudrate sama (115200 bps).
  • Konfigurasikan pin LED sebagai output.
  • Program STM32 untuk membaca data dari UART 

1.4 Pelaksanaan Uji Coba

  • Hubungkan kedua board ke komputer untuk upload program.
  • Jalankan Board Receiver terlebih dahulu, kemudian Board Transmitter.
  • Tekan tombol pada Board Transmitter: perhatikan apakah LED pada Board Receiver menyala.
  • Lepaskan tombol: perhatikan apakah LED mati kembali.

2. Hardware dan Diagram Blok [kembali]


2.1 Daftar Komponen

  • 2 × Mikrokontroler STM32F103C8T6


Gambar STM32F103C8T6

Spesifikasi Mikrokontroler STM32F103C8T6



  • 1 × Push button (tact switch)

.
Gambar Push Button (tact Switch)

  • 1 x LED 





  • Resistor





  • Kabel Jumper

Gambar Kabel Jumper

2.2 Diagram Blok







3. Rangkaian Simulasi dan Prinsip Kerja [kembali]

3.1 Rangkaian Simulasi

Gambar Rangkaian Percobaan 1


3.2 Prinsip Kerja

Prinsip kerja rangkaian UART (STM–STM) ini adalah ketika tombol pada papan STM32 bagian atas dalam kondisi tidak ditekan, pin input akan terbaca HIGH karena ditarik ke Vcc melalui resistor pull-up. Saat tombol ditekan, pin input terhubung ke GND sehingga terbaca LOW. Perubahan logika ini dibaca oleh STM32 Transmitter dan diolah untuk dikirimkan melalui jalur UART TX. Data serial yang dikirim diterima oleh STM32 Receiver melalui pin UART RX dengan baudrate yang sama. STM32 Receiver kemudian memproses data tersebut untuk mengendalikan LED pada pin output, misalnya menyalakan LED tertentu ketika tombol ditekan dan mematikannya ketika dilepas. Dengan demikian, rangkaian ini memanfaatkan komunikasi UART untuk menghubungkan dua mikrokontroler, di mana status tombol pada papan pengirim dapat langsung dikontrol dan ditampilkan melalui LED pada papan penerima.



4. Flowchart dan Listing Program [kembali]
    
4.1 Flow Chart




4.2 Listing Program

4.2.1 List Program Tx

/* USER CODE BEGIN Header */

/**

******************************************************************************

* @file : main.c

* @brief : Main program body (TX)

******************************************************************************

*/

/* USER CODE END Header */


#include "main.h"

#include <string.h>


UART_HandleTypeDef huart1;


void SystemClock_Config(void);

static void MX_GPIO_Init(void);

static void MX_USART1_UART_Init(void);


uint8_t msg;


int main(void)

{

HAL_Init();

SystemClock_Config();

MX_GPIO_Init();

MX_USART1_UART_Init();


while (1)

{

// Cek tombol PA1 (aktif low)

if (HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_1) == GPIO_PIN_RESET)

{

msg = '1';

HAL_UART_Transmit(&huart1, &msg, 1, HAL_MAX_DELAY);

HAL_Delay(200); // debounce

}


// Cek tombol PA2 (aktif low)

if (HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_2) == GPIO_PIN_RESET)

{

msg = '2';

HAL_UART_Transmit(&huart1, &msg, 1, HAL_MAX_DELAY);

HAL_Delay(200); // debounce

}

}

}


void SystemClock_Config(void)

{

RCC_OscInitTypeDef RCC_OscInitStruct = {0};

RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};


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;

if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) { Error_Handler(); }


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;


if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_0) != HAL_OK) { Error_Handler(); }

}


static void MX_USART1_UART_Init(void)

{

huart1.Instance = USART1;

huart1.Init.BaudRate = 115200;

huart1.Init.WordLength = UART_WORDLENGTH_8B;

huart1.Init.StopBits = UART_STOPBITS_1;

huart1.Init.Parity = UART_PARITY_NONE;

huart1.Init.Mode = UART_MODE_TX_RX;

huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;

huart1.Init.OverSampling = UART_OVERSAMPLING_16;

if (HAL_UART_Init(&huart1) != HAL_OK) { Error_Handler(); }

}


static void MX_GPIO_Init(void)

{

GPIO_InitTypeDef GPIO_InitStruct = {0};


__HAL_RCC_GPIOA_CLK_ENABLE();


// PA1 & PA2 sebagai input pull-up

GPIO_InitStruct.Pin = GPIO_PIN_1|GPIO_PIN_2;

GPIO_InitStruct.Mode = GPIO_MODE_INPUT;

GPIO_InitStruct.Pull = GPIO_PULLUP;

HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

}


void Error_Handler(void)

{

__disable_irq();

while (1) {}

}


Penjelasan listing program:

Library yang dipakai

#include "main.h" #include <string.h>
  • main.h → header utama berisi definisi pin, peripheral, dan fungsi standar CubeMX.

  • string.h → untuk manipulasi string (di sini sebenarnya tidak dipakai langsung, tapi umum dimasukkan).


Deklarasi UART

UART_HandleTypeDef huart1;

Mendeklarasikan handler UART1 (huart1) yang akan digunakan untuk komunikasi serial.


Fungsi Deklarasi

void SystemClock_Config(void); static void MX_GPIO_Init(void); static void MX_USART1_UART_Init(void);

Fungsi inisialisasi untuk clock, GPIO, dan UART.


Variabel global

uint8_t msg;

Satu byte variabel yang menyimpan data tombol sebelum dikirim via UART.


Fungsi main()

int main(void) { HAL_Init(); // Inisialisasi HAL Library SystemClock_Config(); // Set konfigurasi clock (pakai HSI) MX_GPIO_Init(); // Inisialisasi GPIO (tombol input) MX_USART1_UART_Init(); // Inisialisasi UART1 while (1) { // Cek tombol PA1 (aktif low) if (HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_1) == GPIO_PIN_RESET) { msg = '1'; // isi pesan = karakter '1' HAL_UART_Transmit(&huart1, &msg, 1, HAL_MAX_DELAY); // kirim data '1' lewat UART HAL_Delay(200); // debounce supaya tidak terkirim berulang-ulang } // Cek tombol PA2 (aktif low) if (HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_2) == GPIO_PIN_RESET) { msg = '2'; // isi pesan = karakter '2' HAL_UART_Transmit(&huart1, &msg, 1, HAL_MAX_DELAY); // kirim data '2' lewat UART HAL_Delay(200); // debounce } } }

Intinya:

  • Jika tombol PA1 ditekan, kirim karakter '1' melalui UART1.

  • Jika tombol PA2 ditekan, kirim karakter '2'.

  • Tombol aktif LOW karena memakai resistor pull-up.

  • HAL_Delay(200) digunakan sebagai debounce agar satu kali tekan tidak terbaca berulang.


Fungsi Konfigurasi Clock

void SystemClock_Config(void) { RCC_OscInitTypeDef RCC_OscInitStruct = {0}; RCC_ClkInitTypeDef RCC_ClkInitStruct = {0}; RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI; // pakai internal clock HSI RCC_OscInitStruct.HSIState = RCC_HSI_ON; // aktifkan HSI RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT; RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE; // PLL tidak digunakan if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) { Error_Handler(); } RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2; RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_HSI; // gunakan HSI sebagai sumber clock utama RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; // tidak ada pembagi clock RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1; RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1; if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_0) != HAL_OK) { Error_Handler(); } }

Fungsi ini mengatur agar mikrokontroler menggunakan HSI (High-Speed Internal oscillator) sebagai sumber clock sistem.


Fungsi Inisialisasi UART1

static void MX_USART1_UART_Init(void) { huart1.Instance = USART1; // gunakan USART1 huart1.Init.BaudRate = 115200; // baudrate 115200 bps huart1.Init.WordLength = UART_WORDLENGTH_8B; // 8 data bit huart1.Init.StopBits = UART_STOPBITS_1; // 1 stop bit huart1.Init.Parity = UART_PARITY_NONE; // tanpa parity huart1.Init.Mode = UART_MODE_TX_RX; // bisa TX dan RX huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE; // tanpa flow control huart1.Init.OverSampling = UART_OVERSAMPLING_16; // oversampling default if (HAL_UART_Init(&huart1) != HAL_OK) { Error_Handler(); } }

Konfigurasi standar UART: 115200 bps, 8N1 (8 data, No parity, 1 stop bit).


Fungsi Inisialisasi GPIO

static void MX_GPIO_Init(void) { GPIO_InitTypeDef GPIO_InitStruct = {0}; __HAL_RCC_GPIOA_CLK_ENABLE(); // aktifkan clock untuk GPIOA // PA1 & PA2 sebagai input pull-up GPIO_InitStruct.Pin = GPIO_PIN_1|GPIO_PIN_2; GPIO_InitStruct.Mode = GPIO_MODE_INPUT; GPIO_InitStruct.Pull = GPIO_PULLUP; // gunakan pull-up internal HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); }

PA1 dan PA2 dikonfigurasi sebagai input dengan internal pull-up.

Artinya:

  • Idle (tombol dilepas) → terbaca HIGH.

  • Ditekan (short ke GND) → terbaca LOW.


Fungsi Error Handler

void Error_Handler(void) { __disable_irq(); // nonaktifkan interrupt while (1) {} // loop tak terbatas jika error }

Fungsi yang dipanggil bila terjadi kesalahan konfigurasi.


4.2.2 Listing Program Rx\

/* USER CODE BEGIN Header */

/**

******************************************************************************

* @file : main.c

* @brief : Main program body (RX)

******************************************************************************

*/

/* USER CODE END Header */


#include "main.h"

#include <string.h>


UART_HandleTypeDef huart1;


void SystemClock_Config(void);

static void MX_GPIO_Init(void);

static void MX_USART1_UART_Init(void);


uint8_t rxData;


int main(void)

{

HAL_Init();

SystemClock_Config();

MX_GPIO_Init();

MX_USART1_UART_Init();


while (1)

{

// Terima 1 byte dari UART

if (HAL_UART_Receive(&huart1, &rxData, 1, HAL_MAX_DELAY) == HAL_OK)

{

if (rxData == '1')

{

HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_SET); // LED PA1 nyala

HAL_Delay(200);

HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_RESET); // mati lagi

}

else if (rxData == '2')

{

HAL_GPIO_WritePin(GPIOA, GPIO_PIN_2, GPIO_PIN_SET); // LED PA2 nyala

HAL_Delay(200);

HAL_GPIO_WritePin(GPIOA, GPIO_PIN_2, GPIO_PIN_RESET); // mati lagi

}

}

}

}


void SystemClock_Config(void)

{

RCC_OscInitTypeDef RCC_OscInitStruct = {0};

RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};


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;

if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) { Error_Handler(); }


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;


if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_0) != HAL_OK) { Error_Handler(); }

}


static void MX_USART1_UART_Init(void)

{

huart1.Instance = USART1;

huart1.Init.BaudRate = 115200;

huart1.Init.WordLength = UART_WORDLENGTH_8B;

huart1.Init.StopBits = UART_STOPBITS_1;

huart1.Init.Parity = UART_PARITY_NONE;

huart1.Init.Mode = UART_MODE_TX_RX;

huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;

huart1.Init.OverSampling = UART_OVERSAMPLING_16;

if (HAL_UART_Init(&huart1) != HAL_OK) { Error_Handler(); }

}


static void MX_GPIO_Init(void)

{

GPIO_InitTypeDef GPIO_InitStruct = {0};


__HAL_RCC_GPIOA_CLK_ENABLE();


// PA1 & PA2 sebagai output LED

GPIO_InitStruct.Pin = GPIO_PIN_1|GPIO_PIN_2;

GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;

GPIO_InitStruct.Pull = GPIO_NOPULL;

GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;

HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);


// Default LED mati

HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1|GPIO_PIN_2, GPIO_PIN_RESET);

}


void Error_Handler(void)

{

__disable_irq();

while (1) {}

}



Penjelasan Listing Program

Bagian Header dan Inisialisasi

#include "main.h" #include <string.h> UART_HandleTypeDef huart1;
  • Mengimpor file main.h (library bawaan STM32CubeIDE) dan library string.

  • Membuat variabel huart1 untuk konfigurasi dan penggunaan UART1.


Deklarasi Fungsi

void SystemClock_Config(void); static void MX_GPIO_Init(void); static void MX_USART1_UART_Init(void); uint8_t rxData;
  • Mendeklarasikan fungsi konfigurasi clock, GPIO, dan UART.

  • rxData digunakan untuk menyimpan 1 byte data yang diterima dari UART.


Fungsi main()

int main(void) { HAL_Init(); SystemClock_Config(); MX_GPIO_Init(); MX_USART1_UART_Init();
  • HAL_Init() → inisialisasi library HAL.

  • SystemClock_Config() → mengatur clock STM32.

  • MX_GPIO_Init() → konfigurasi pin GPIO.

  • MX_USART1_UART_Init() → konfigurasi UART1.


Loop Utama

while (1) { if (HAL_UART_Receive(&huart1, &rxData, 1, HAL_MAX_DELAY) == HAL_OK) { if (rxData == '1') { HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_SET); HAL_Delay(200); HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_RESET); } else if (rxData == '2') { HAL_GPIO_WritePin(GPIOA, GPIO_PIN_2, GPIO_PIN_SET); HAL_Delay(200); HAL_GPIO_WritePin(GPIOA, GPIO_PIN_2, GPIO_PIN_RESET); } } } }
  • HAL_UART_Receive menunggu sampai ada data masuk dari UART1.

  • Jika data '1' diterima → LED di PA1 menyala 200 ms lalu mati.

  • Jika data '2' diterima → LED di PA2 menyala 200 ms lalu mati.

  • Dengan demikian, LED pada board RX mengikuti tombol pada board TX.


Konfigurasi Clock (SystemClock_Config)

  • Menggunakan HSI (High Speed Internal oscillator) sebagai sumber clock.

  • Tidak menggunakan PLL, sehingga clock berjalan default.


Konfigurasi UART1 (MX_USART1_UART_Init)

huart1.Instance = USART1; huart1.Init.BaudRate = 115200; huart1.Init.WordLength = UART_WORDLENGTH_8B; huart1.Init.StopBits = UART_STOPBITS_1; huart1.Init.Parity = UART_PARITY_NONE; huart1.Init.Mode = UART_MODE_TX_RX;
  • Baudrate: 115200 bps

  • Data frame: 8 bit data, 1 stop bit, tanpa parity

  • Mode: TX dan RX aktif

  • Flow control: none


Konfigurasi GPIO (MX_GPIO_Init)

GPIO_InitStruct.Pin = GPIO_PIN_1|GPIO_PIN_2; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
  • PA1 dan PA2 diset sebagai output push-pull.

  • Digunakan untuk mengendalikan LED.

  • Awalnya LED dimatikan (GPIO_PIN_RESET).


Fungsi Error Handler

void Error_Handler(void) { __disable_irq(); while (1) {} }
  • Jika ada error (misalnya inisialisasi gagal), program akan berhenti di loop ini.




5. Video Demo [kembali]



6. Kondisi [kembali]
    
Buatlah rangkaian seperti gambar pada percobaan 1 UART dengan dua buah papan STM32. Pada papan pertama (TX) dipasang push button pada pin PA1 dan PA2 yang terhubung dengan resistor pull-up. Ketika push button PA1 ditekan, maka STM32 pengirim akan mengirimkan data melalui UART dan papan penerima (RX) akan menyalakan LED pada pin PA1 selama 200 ms kemudian mati kembali. Begitu juga ketika push button PA2 ditekan, STM32 pengirim akan mengirimkan data berbeda sehingga papan penerima akan menyalakan LED pada pin PA2 selama 200 ms kemudian mati kembali. Dengan demikian, kondisi tombol pada papan pengirim dapat langsung dikendalikan dan ditampilkan melalui LED pada papan penerima melalui komunikasi UART.





7. Download File  [kembali]
   
    Download Video Demo [link]
    Download Datasheet STM32F103C8T6 [link]    
    Download Datasheet Push Button [link]
    Download Datasheet LED [link]
    Download Datasheet Resistor [link]
   

Comments

Popular posts from this blog