- Menyusun rangkaian sesuai pada percobaan 1 di modul
- Buka software STM32CubeIDE masing-masing di 2 pc yang berbeda
- Listing program masing-masing untuk TX dan RX pada software STM32CubeIDE, sesuaikan konfigurasi pin di program dengan pin yang digunakan pada STM32F103C8 di breadboard.
- Generate code pada software untuk mendapatkan file program C, lalu masukkan algoritma rangkaian ke dalam file.
- Transfer codingan pada masing-masing STM32 yang bertindak sebagai TX dan RX.
- Simulasikan/jalankan rangkaian pada breadboard.
- Cek apakah setiap komponen rangkaian pada breadboard berfungsi dan berjalan sesuai algoritma program.
- Jika terdapat kendala atau masalah pada rangkaian maka lakukan problem solving terlebih dahulu hingga rangkaian berjalan sebagaimana mestinya.
- Selesai.
b) Hardware dan Diagram Blok[Kembali]
- STM32F103C8
- Resistor
- LED
- Push Button
c) Rangkaian Simulasi dan Prinsip Kerja[Kembali]
- Rangkaian simulasi
Gambar 1. Simulasi Rangkaian.
- Prinsip Kerja
Protokol komunikasi UART mengandalkan dua jalur komunikasi utama, yaitu TX sebagai pengirim dan RX sebagai penerima. Kedua jalur ini dalam protokol komunikasi UART bersifat setara atau peer to peer. Sehingga dalam prinsip kerja pada percobaan yang mana menggunakan 2 buah STM32, salah satu STM32 akan bertindak sebagai TX dan satunya akan bertindak sebagai RX.
STM32 yang bertindak sebagai TX atau pengirim yaitu pada rangkaian dengan push button. Sehingga data akan dikirimkan jika memenuhi kondisi yaitu saat push button ditekan Sedangkan STM32 yang bertindak sebagai RX atau penerima yaitu pada rangkaian dengan LED. Sehingga data akan berhasil diterima saat lampu LED menyala setelah data dikirimkan saat push button ditekan.
d) Flowchart dan Listing Program[Kembali]
Pada Tx
#include "main.h"
UART_HandleTypeDef huart1;
uint8_t buttonStates[4] = {'0', '0', '0', '0'};
uint8_t charToTransmit[5];
int main(void)
{
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_USART1_UART_Init();
while (1)
{
buttonStates[0] = (HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_1) == GPIO_PIN_SET)
? '1' : '0';
buttonStates[1] = (HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_2) == GPIO_PIN_SET)
? '1' : '0';
buttonStates[2] = (HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_3) == GPIO_PIN_SET)
? '1' : '0';
buttonStates[3] = (HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_4) == GPIO_PIN_SET)
? '1' : '0';
HAL_UART_Transmit(&huart1, buttonStates, 4, 100);
HAL_Delay(100);
}
}
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 = 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();
}
}
static void MX_GPIO_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
__HAL_RCC_GPIOA_CLK_ENABLE();
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;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
}
void Error_Handler(void)
{
__disable_irq();
while (1)
{
}
}
#ifdef USE_FULL_ASSERT
void assert_failed(uint8_t *file, uint32_t line)
{
}
#endif
Pada Rx
#include "main.h"
UART_HandleTypeDef huart1;
uint8_t receivedData[4];
void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_USART1_UART_Init(void);
int main(void)
{
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_USART1_UART_Init();
while (1)
{
if(HAL_UART_Receive(&huart1, receivedData, 4, 100) == HAL_OK)
{
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);
HAL_UART_Transmit(&huart1, receivedData, 4, 100);
}
HAL_Delay(50);
}
}
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 = 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();
}
}
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);
}
void Error_Handler(void)
{
__disable_irq();
while (1)
{
}
}
Video Percobaan.
Gambar 3. Analisa.
Download konfigurasi rangkaian(software/coding) [klik]
Download gambar rangkaian percobaan [klik]Download video percobaan [klik]
0 Komentar