Pemrograman Mikrokontroler STM32F103C8 dengan STM32CubeMX & Eclipse

STM32F103C8T merupakan salah satu mikrokontroler 32-bit keluaran STMicroelectronic yang memiliki banyak keunggulan dibanding mikrokontroler 8-bit. Banyak pengguna  mikrokontroler yang mengatakan bahwa mikrokontroler 32-bit relatif sulit untuk dipelajari karena sangat kompleks jika dibandingkan dengan mekrokontroler 8bit, sehingga banyak yang enggan beralih ke teknologi 32-bit.
Nah, di dalam tutorial ini akan ditunjukkan bagaimana cara memprogram mikrokontroler 32-bit dari STM32 dengan cukup mudah menggunakan software STM32CubeMX dan Eclipse. STM32CubeMX merupakan software buatan STMicrolelctronics yang digunakan sebagai code generator dengan tampilan grafik. Dengan menggunakan STM32CubeMX ini kita dapat men-generate program berdasarkan seting-seting yang kita tentukan terlebih dahulu, seperti periferal, I/O, Clock dll. STM32CubeMX compatibel dengan berbagai macam software pemrograman salah satunya adalah Eclipse, yang tentunya sudah di install plugin GNU ARM Eclipse. Untuk instalasi plugin Eclipse dan STM32CubeMX akan dibahas di artikel yang lainnya. Dalam artikel ini akan dibahas dasar penggunaan STM32CubeMX untuk memprogram GPIO dari mikrokontroler STM32F103C8.

ALAT DAN BAHAN

  1. Blue Pill Board, STM32F103C8T6
  2. ST-Link, programmer

Laangkah-Langkah

  1. Jalankan program STM32CubeMX dan buat project baru

 

2. Pilih seri STM32F103C8 dan dobel klik di tabel kanan pada seri STM32F103C8Txx (Lihat gambar)

 

3. Setelah di pilih tipe mikrokontrolernya maka akan mucul jendela untuk melakukan pengaturan periferal. Kita tinggal pilih periferal apa saja yang akan diaktifkan. Untuk uji coba pertama, kita akan membuat led blink.  Pada blue pill LED terpasang pada pin PC13, sehigga kita harus mengaktifkan PC13 sebagai output, cukup dengan klik di pin PC13 pada gambar IC disebelah kanan, kemudian pilih GPIO_Output.

4. Selanjutnya kita akan mengatur clock mikrokontrolernya. Agar mikrokontroler dapat bekerja dengan menggunakan eksternal kristal maka kita perlu mengaktifkan periferal RCC.

5. Beralih ke tab Clock Configuration. Pada kolom HCLK ketikkan angka 72, Kemudian tekan ENTER->OK .

Ini digunakan agar mikrokontroler dapat menggunakan maksimal clock 72 Mhz.

Sampai disini pengaturan GPIO dan Clock sudah selesai. Jangan lupa untuk menyimpan project.

6. Setelah seting yang diinginkan sudah selesai, tinggal meng-generate program. Pilih menu Project->Generate Code. Isi kolom Project Name sama dengan Project yang disimpan sebelumnya. Dan tetuntukan lokasi penyimpanannya. Kemudian pada Toolchain/IDE, pilih SW4STM32. Setelah selesai klik OK. Setelah selesai meng-generate code, maka kita dapat membukanya dengan klik Open Project

7. Setelah Code berhasil di import di Eclipse, kita dapat membuat program blink led dengan mengedit file main.c.

Tambahkan/ubah  pada bagian while(1)  di file main.c dengan code berikut

  while (1)
  {
	  HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, GPIO_PIN_RESET);
	  HAL_Delay(1000);
	  HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, GPIO_PIN_SET);
	  HAL_Delay(1000);
  }

Setelah itu Debug program yang sudah dibuat. Compiler akan menghasilkan file.bin yang harus dimasukkan ke mikrokontroler dengan menggunakan ST-Link Programmer. Jika tidak ada kendala, maka led pada Blue Pill Board akan berkedip dengan periode 1 Detik.

SELESAI..

File main.c


#include "main.h"
#include "stm32f1xx_hal.h"


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


int main(void)
{

  HAL_Init();
  SystemClock_Config();
  MX_GPIO_Init();

  while (1)
  {
	  HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, GPIO_PIN_RESET);
	  HAL_Delay(1000);
	  HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, GPIO_PIN_SET);
	  HAL_Delay(1000);

  }


}

/** System Clock Configuration
*/
void SystemClock_Config(void)
{

  RCC_OscInitTypeDef RCC_OscInitStruct;
  RCC_ClkInitTypeDef RCC_ClkInitStruct;

    /**Initializes the CPU, AHB and APB busses clocks 
    */
  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
  RCC_OscInitStruct.HSEState = RCC_HSE_ON;
  RCC_OscInitStruct.HSEPredivValue = RCC_HSE_PREDIV_DIV1;
  RCC_OscInitStruct.HSIState = RCC_HSI_ON;
  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
  RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
  RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL9;
  if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
  {
    _Error_Handler(__FILE__, __LINE__);
  }

    /**Initializes the CPU, AHB and APB busses clocks 
    */
  RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
                              |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
  RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
  RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
  RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;
  RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;

  if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK)
  {
    _Error_Handler(__FILE__, __LINE__);
  }

    /**Configure the Systick interrupt time 
    */
  HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000);

    /**Configure the Systick 
    */
  HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK);

  /* SysTick_IRQn interrupt configuration */
  HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0);
}

/** Configure pins as 
        * Analog 
        * Input 
        * Output
        * EVENT_OUT
        * EXTI
*/
static void MX_GPIO_Init(void)
{

  GPIO_InitTypeDef GPIO_InitStruct;

  /* GPIO Ports Clock Enable */
  __HAL_RCC_GPIOC_CLK_ENABLE();
  __HAL_RCC_GPIOD_CLK_ENABLE();

  /*Configure GPIO pin Output Level */
  HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, GPIO_PIN_RESET);

  /*Configure GPIO pin : PC13 */
  GPIO_InitStruct.Pin = GPIO_PIN_13;
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);

}

/* USER CODE BEGIN 4 */

/* USER CODE END 4 */

/**
  * @brief  This function is executed in case of error occurrence.
  * @param  None
  * @retval None
  */
void _Error_Handler(char * file, int line)
{
  /* USER CODE BEGIN Error_Handler_Debug */
  /* User can add his own implementation to report the HAL error return state */
  while(1) 
  {
  }
  /* USER CODE END Error_Handler_Debug */ 
}

#ifdef USE_FULL_ASSERT

/**
   * @brief Reports the name of the source file and the source line number
   * where the assert_param error has occurred.
   * @param file: pointer to the source file name
   * @param line: assert_param error line source number
   * @retval None
   */
void assert_failed(uint8_t* file, uint32_t line)
{
  /* USER CODE BEGIN 6 */
  /* User can add his own implementation to report the file name and line number,
    ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
  /* USER CODE END 6 */

}

#endif

/**
  * @}
  */ 

/**
  * @}
*/ 

/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/

Leave a Reply

Your email address will not be published. Required fields are marked *