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.
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
1 × Push button (tact switch)
.
1 x LED
Resistor
Kabel Jumper
2 × Mikrokontroler STM32F103C8T6
1 × Push button (tact switch)
. |
1 x LED
Resistor
Kabel Jumper
2.2 Diagram Blok
3. Rangkaian Simulasi dan Prinsip Kerja [kembali]
3.1 Rangkaian Simulasi
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.
/* 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) {}
}
Library yang dipakai
-
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
Mendeklarasikan handler UART1 (huart1
) yang akan digunakan untuk komunikasi serial.
Fungsi Deklarasi
Fungsi inisialisasi untuk clock, GPIO, dan UART.
Variabel global
Satu byte variabel yang menyimpan data tombol sebelum dikirim via UART.
Fungsi main()
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
Fungsi ini mengatur agar mikrokontroler menggunakan HSI (High-Speed Internal oscillator) sebagai sumber clock sistem.
Fungsi Inisialisasi UART1
Konfigurasi standar UART: 115200 bps, 8N1 (8 data, No parity, 1 stop bit).
Fungsi Inisialisasi GPIO
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
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) {}
}
Bagian Header dan Inisialisasi
-
Mengimpor file main.h (library bawaan STM32CubeIDE) dan library string.
-
Membuat variabel
huart1
untuk konfigurasi dan penggunaan UART1.
Deklarasi Fungsi
-
Mendeklarasikan fungsi konfigurasi clock, GPIO, dan UART.
-
rxData
digunakan untuk menyimpan 1 byte data yang diterima dari UART.
Fungsi main()
-
HAL_Init()
→ inisialisasi library HAL. -
SystemClock_Config()
→ mengatur clock STM32. -
MX_GPIO_Init()
→ konfigurasi pin GPIO. -
MX_USART1_UART_Init()
→ konfigurasi UART1.
Loop Utama
-
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
)
-
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
)
-
PA1 dan PA2 diset sebagai output push-pull.
-
Digunakan untuk mengendalikan LED.
-
Awalnya LED dimatikan (
GPIO_PIN_RESET
).
Fungsi Error Handler
-
Jika ada error (misalnya inisialisasi gagal), program akan berhenti di loop ini.
Comments
Post a Comment