LA M3 Percobaan 1





LAPORAN AKHIR M3 PERCOBAAN 1


1. Prosedur [kembali]

1. Mikrokontroler Pertama (Tx):

  • Hubungkan push button ke pin PA1, PA2, PA3, dan PA4.

  •  satu kaki push button ke pin PA1-PA4, dan kaki lainnya ke GND.

2. Mikrokontroler Kedua (Rx):

  • Hubungkan LED ke pin PA1, PA2, PA3, dan PA4 melalui resistor ke GND.

3. Buka STM32CubeIDE untuk menulis dan mengupload program ke masing-masing mikrokontroler.
4. Upload kode program ke kedua mikrokontroler menggunakan ST-Link



2. Hardware dan Diagram Blok [kembali]
Hardware 
  • STM32F103C8


  • STM32 adalah keluarga dari 32-bit sirkuit terpadu mikrokontroler oleh STMicroelectronics yang secara spesifik dikembangkan untuk aplikasi (Cortex-A), embedded (Cortex-M) dan real-time (Cortex-R). STM32 Cortex-M dirancang berdasarkan ARM®, Cortex®-M cores: Cortex®-M0 untuk STM32F0, Cortex®-M3 untuk STM32F1 dan STM32F2, Cortex®-M4 untuk STM32F3, STM32F4 dan STM32L4, serta Cortex®-M7 untuk STM32F7. Mikrokontroler ini cocok untuk melakukan pekerjaan embedded karena mengombinasikan performa tinggi dengan peripheral kelas satu, yang membuat kinerjanya STM32 lebih unggul dibandingkan dengan Arduino. STM32 digunakan di berbagai aplikasi dari printer sederhana hingga papan sirkuit kompleks sebagai hasil dari pengembangan firmware dan embedded system menggunakan mikorkontroler STM32. Mikrokontroler ini sangat cocok untuk aplikasi daya rendah.  

  • Breadboard


Breadboard adalah sebuah papan yang digunakan untuk merancang dan menguji rangkaian elektronik secara sementara tanpa perlu menyolder komponen. Breadboard memungkinkan perakitan rangkaian secara cepat dan mudah, sehingga sangat berguna dalam prototyping dan eksperimen elektronik.
  • Jumper male to male


Kabel jumper Male to Male adalah kabel yang memiliki konektor jantan (male) di kedua ujungnya. Kabel ini biasanya digunakan untuk menghubungkan pin pada board elektronik, seperti Raspberry Pi, Arduino, atau breadboard, dengan komponen lainnya. Kabel jumper male to male sering digunakan dalam rangkaian prototyping atau percobaan karena fleksibilitas dan kemudahannya untuk digunakan.

  • Push Button
Push button adalah sakelar mekanik yang bekerja saat ditekan dan kembali ke posisi semula saat dilepas. Komponen ini digunakan untuk mengaktifkan atau menonaktifkan sirkuit listrik, seperti dalam sistem kontrol, input pengguna pada perangkat elektronik, dan tombol reset atau start dalam rangkaian mikroprosesor. Push button sering dikombinasikan dengan mikrokontroler untuk menangkap input pengguna dalam berbagai aplikasi interaktif.

  • LED Merah
LED merah adalah dioda pemancar cahaya yang menghasilkan warna merah saat diberikan arus listrik. LED ini sering digunakan sebagai indikator status dalam rangkaian elektronik, seperti menunjukkan daya aktif, kesalahan sistem, atau sinyal peringatan. Karena konsumsi dayanya rendah dan umur pakainya panjang, LED merah banyak diaplikasikan dalam perangkat elektronik dan sistem otomatisasi.



Diagram Blok :






3. Rangkaian Simulasi dan Prinsip Kerja [kembali]


  • Rangkaian Simulasi



  • Prinsip Kerja
Prinsip kerja dari percobaan ini adalah melakukan komunikasi data antara dua mikrokontroler STM32 menggunakan protokol komunikasi UART, dengan tujuan untuk mentransmisikan status tombol dari mikrokontroler pertama ke mikrokontroler kedua, yang kemudian digunakan untuk mengontrol nyala atau mati LED. Mikrokontroler pertama (sebagai pengirim) membaca status empat buah push button yang terhubung ke pin PA1 sampai PA4 yang dikonfigurasi sebagai input dengan pull-up. Ketika tombol tidak ditekan, pin akan terbaca sebagai logika tinggi (‘1’), dan ketika ditekan akan terbaca sebagai logika rendah (‘0’). Status dari keempat tombol tersebut dikonversi menjadi array karakter (‘0’ atau ‘1’) yang kemudian dikirimkan melalui UART dengan baudrate 9600 bps ke mikrokontroler kedua.
Mikrokontroler kedua (sebagai penerima) menerima data berupa 4 karakter yang masing-masing mewakili status satu tombol. Data yang diterima digunakan untuk mengendalikan empat buah LED yang juga terhubung pada pin PA1 hingga PA4, tetapi dikonfigurasi sebagai output. Setiap karakter yang diterima akan menentukan kondisi LED yang bersangkutan,  Dengan demikian, sistem memungkinkan pengiriman status tombol dari satu mikrokontroler ke mikrokontroler lainnya, dan status tersebut direspons berupa nyala atau matinya LED,



4. Flowchart dan Listing Program [kembali]
  • Flowchart



  • Listing Program

TX:

/* USER CODE BEGIN Header */

/**

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

* @file : main.c

* @brief : Main program body

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

* @attention

*

* Copyright (c) 2025 STMicroelectronics.

* All rights reserved.

*

* This software is licensed under terms that can be found in the LICENSE file

* in the root directory of this software component.

* If no LICENSE file comes with this software, it is provided AS-IS.

*

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

*/

/* USER CODE END Header */

/* Includes ------------------------------------------------------------------*/

#include "main.h"


/* Private includes ----------------------------------------------------------*/

/* USER CODE BEGIN Includes */


/* USER CODE END Includes */


/* Private typedef -----------------------------------------------------------*/

/* USER CODE BEGIN PTD */


/* USER CODE END PTD */


/* Private define ------------------------------------------------------------*/

/* USER CODE BEGIN PD */


/* USER CODE END PD */


/* Private macro -------------------------------------------------------------*/

/* USER CODE BEGIN PM */


/* USER CODE END PM */


/* Private variables ---------------------------------------------------------*/

UART_HandleTypeDef huart1;


/* USER CODE BEGIN PV */

uint8_t buttonStates[4] = {'0', '0', '0', '0'}; // Status awal: semua button tidak ditekan

/* USER CODE END PV */


/* Private function prototypes -----------------------------------------------*/

void SystemClock_Config(void);

static void MX_GPIO_Init(void);

static void MX_USART1_UART_Init(void);

/* USER CODE BEGIN PFP */


/* USER CODE END PFP */


/* Private user code ---------------------------------------------------------*/

/* USER CODE BEGIN 0 */

uint8_t charToTransmit[5];

/* USER CODE END 0 */


/**

* @brief The application entry point.

* @retval int

*/

int main(void)

{

HAL_Init();

SystemClock_Config();

MX_GPIO_Init();

MX_USART1_UART_Init();


while (1)

{

// Baca status push button (PA1-PA4) dengan pull-up

buttonStates[0] = (HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_1) == GPIO_PIN_SET) ? '1' : '0'; // PA1

buttonStates[1] = (HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_2) == GPIO_PIN_SET) ? '1' : '0'; // PA2

buttonStates[2] = (HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_3) == GPIO_PIN_SET) ? '1' : '0'; // PA3

buttonStates[3] = (HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_4) == GPIO_PIN_SET) ? '1' : '0'; // PA4


// Kirim data status tombol via UART

HAL_UART_Transmit(&huart1, buttonStates, 4, 100);


HAL_Delay(100); // Debouncing tombol (perlu menyesuaikan dengan aplikasi)

}

}


/**

* @brief System Clock Configuration

* @retval None

*/

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();

}

}


/**

* @brief USART1 Initialization Function

* @param None

* @retval None

*/

static void MX_USART1_UART_Init(void)

{

huart1.Instance = USART1;

huart1.Init.BaudRate = 9600;

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();

}

}


/**

* @brief GPIO Initialization Function

* @param None

* @retval None

*/

static void MX_GPIO_Init(void)

{

GPIO_InitTypeDef GPIO_InitStruct = {0};


__HAL_RCC_GPIOA_CLK_ENABLE();


// Mengonfigurasi tombol PA1-PA4 sebagai input dengan pull-up

GPIO_InitStruct.Pin = GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_3 | GPIO_PIN_4;

GPIO_InitStruct.Mode = GPIO_MODE_INPUT;

GPIO_InitStruct.Pull = GPIO_PULLUP; // Pull-up untuk tombol

HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

}


/**

* @brief This function is executed in case of error occurrence.

* @retval None

*/

void Error_Handler(void)

{

__disable_irq();

while (1)

{

}

}


#ifdef USE_FULL_ASSERT

void assert_failed(uint8_t *file, uint32_t line)

{

/* User can add his own implementation to report the file name and line number */

}

#endif



Rx:

/* USER CODE BEGIN Header */

/**

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

* @file : main.c

* @brief : Main program body

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

* @attention

*

* Copyright (c) 2025 STMicroelectronics.

* All rights reserved.

*

* This software is licensed under terms that can be found in the LICENSE file

* in the root directory of this software component.

* If no LICENSE file comes with this software, it is provided AS-IS.

*

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

*/

/* USER CODE END Header */

/* Includes ------------------------------------------------------------------*/

#include "main.h"


/* Private includes ----------------------------------------------------------*/

/* USER CODE BEGIN Includes */


/* USER CODE END Includes */


/* Private typedef -----------------------------------------------------------*/

/* USER CODE BEGIN PTD */


/* USER CODE END PTD */


/* Private define ------------------------------------------------------------*/

/* USER CODE BEGIN PD */


/* USER CODE END PD */


/* Private macro -------------------------------------------------------------*/

/* USER CODE BEGIN PM */


/* USER CODE END PM */


/* Private variables ---------------------------------------------------------*/

UART_HandleTypeDef huart1;


/* USER CODE BEGIN PV */

uint8_t receivedData[4]; // Menyimpan data yang diterima

/* USER CODE END PV */


/* Private function prototypes -----------------------------------------------*/

void SystemClock_Config(void);

static void MX_GPIO_Init(void);

static void MX_USART1_UART_Init(void);

/* USER CODE BEGIN PFP */


/* USER CODE END PFP */


/* Private user code ---------------------------------------------------------*/

/* USER CODE BEGIN 0 */


/* USER CODE END 0 */


/**

* @brief The application entry point.

* @retval int

*/

int main(void)

{


/* MCU Configuration--------------------------------------------------------*/

HAL_Init();

SystemClock_Config();

MX_GPIO_Init();

MX_USART1_UART_Init();


/* Infinite loop */

while (1)

{

// Menerima data 4 byte (status button)

if(HAL_UART_Receive(&huart1, receivedData, 4, 100) == HAL_OK)

{

// Kontrol LED berdasarkan status tombol

HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, (receivedData[0] == '0') ? GPIO_PIN_SET : GPIO_PIN_RESET);

HAL_GPIO_WritePin(GPIOA, GPIO_PIN_2, (receivedData[1] == '0') ? GPIO_PIN_SET : GPIO_PIN_RESET);

HAL_GPIO_WritePin(GPIOA, GPIO_PIN_3, (receivedData[2] == '0') ? GPIO_PIN_SET : GPIO_PIN_RESET);

HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, (receivedData[3] == '0') ? GPIO_PIN_SET : GPIO_PIN_RESET);


// Kirim balik data sebagai verifikasi atau debug

HAL_UART_Transmit(&huart1, receivedData, 4, 100);

}

HAL_Delay(50); // Delay untuk stabilitas komunikasi

}

}


/**

* @brief System Clock Configuration

* @retval None

*/

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();

}

}


/**

* @brief USART1 Initialization Function

* @param None

* @retval None

*/

static void MX_USART1_UART_Init(void)

{

huart1.Instance = USART1;

huart1.Init.BaudRate = 9600;

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();

}

}


/**

* @brief GPIO Initialization Function

* @param None

* @retval None

*/

static void MX_GPIO_Init(void)

{

GPIO_InitTypeDef GPIO_InitStruct = {0};


__HAL_RCC_GPIOA_CLK_ENABLE();


HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3|GPIO_PIN_4, GPIO_PIN_RESET);


GPIO_InitStruct.Pin = GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3|GPIO_PIN_4;

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);

}


/**

* @brief This function is executed in case of error occurrence.

* @retval None

*/

void Error_Handler(void)

{

__disable_irq();

while (1)

{

}

}


5. Video Demo [kembali]







6. Analisa [kembali]














7. Download file
 
[kembali]










 


Komentar

Postingan populer dari blog ini

TB mikroprosesor

Tugas Besar Kontrol Ladang Jambu

UTS UP & UC