Embedded Development Board Learning


Visual Studio Code for ARM with CMake #2 Proyecto

Fecha: enero 9, 2023

Autor: Guillermo Garcia

Categorías: Visual Studio Code Etiquetas:

Visual Studio Code como entorno de desarrollo para proyecto Embedded Systems

Hemos instalado las herramientas necesarias en el primer artículo de la serie Visual Studio Code for ARM with CMake #1 Instalación. En este articulo vamos a crear una estructura de proyecto que utilizaremos a lo largo de esta serie.

Trabajaremos en un kit de desarrollo NUCLEO-G071RB. Recordemos que este entorno se puede configurar para cualquier plataforma basada en arquitectura ARM.

Definir una estructura de proyecto

Comenzaremos por definir una estructura de proyecto. Para organizar los archivos fuente donde estará nuestra aplicación principal y controladores.

Vamos a Visual Studio Code y crearemos una serie de carpetas donde organizaremos nuestros archivos fuente.

Estructura de proyecto

Aquí hay una descripción veamos qué tipo de archivo contendrá cada carpeta.

Carpetas

En esta carpeta se colocan los archivos de configuración de nuestro proyecto, estos archivos son leídos por Visual Studio Code para mantener la configuración general del proyecto y extensiones.

En esta carpeta se colocan todos los archivos resultantes una vez terminado el proceso de compilación aquí estará nuestro archivo ejecutable .bin, .hex, .elf, también contiene archivos de configuración para el entorno CMake.

En esta carpeta se colocan los archivos de encabezado correspondientes a CMSIS para la arquitectura ARM.

En esta carpeta se colocan todos los archivos correspondientes a el dispositivo que utilicemos como el archivo enlazador, archivo de arranque startup_stm32.

En esta carpeta se colocan los controladores para los periféricos de nuestro dispositivo esto depende del dispositivo para este ejemplo utilizaremos la librería HAL de STM32G071RB.

En esta carpeta se colocan todas las librerías externas como un RTOS, Middleware o drivers.

En esta carpeta se colocan los archivos principales de nuestra aplicación por ejemplo main.c

Sin embargo esta estructura de proyecto funciona para mí, pero realmente depende de usted cómo organiza los archivos.

SDK para kit NUCLEO-G071RB

Es momento de recolectar los controladores para nuestro MCU para esta serie hemos elegido un MCU muy básico porque queremos mantenerlo simple.

Para la plataforma STM32 proporciona los controladores HAL así que emplearemos estos controladores, para esto descargamos la librería para STM32G0 desde la página de ST.

Estructura de proyecto

Aquí tenemos todos los archivos fuente que necesitamos comencemos a colocar los archivos en las carpetas correspondientes.

CMSIS

Dentro de la librería STM32G0 encontramos los archivos necesarios para CMSIS agregamos los archivos de cabecera correspondiente a nuestro G071RB.

Estructura de proyecto

Device

Aquí tenemos que buscar dentro de la librería STM32G0 para encontrar los archivos específicos para nuestro G071RB.


Dentro de la carpeta Device se agregan los archivos svd, estos archivos contienen una descripción sobre el hardware de MCU a nivel de periférico son importantes ya que nuestra herramienta de depuración necesita esta descripción para realizar el mapeo de los registros al momento de la depuración.

Estos archivos se pueden descargar desde la página de ST-svd.

Drivers

Buscamos la carpeta de controladores para STM32G0, los colocamos dentro de esta carpeta. En la configuración de compilación elegiremos que controladores agregar al proceso de compilación.


Lib

Por ahora no colocaremos nada en esta carpeta más adelante en próximos artículos agregaremos soporte para SEGGER RTT y SystemView.

main

Crearemos nuestro archivo fuente de entrada main y la función principal.


main.c

#include "main.h"

void SystemClock_Config(void);
static GPIO_InitTypeDef  GPIO_InitStruct = {0};

int main(void)
{  

  HAL_Init();

  SystemClock_Config();

  __HAL_RCC_GPIOA_CLK_ENABLE();

  GPIO_InitStruct.Mode  = GPIO_MODE_OUTPUT_PP;
  GPIO_InitStruct.Pull  = GPIO_PULLUP;
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;

  GPIO_InitStruct.Pin = GPIO_PIN_5;
  HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

  while(1)
  {
    HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_5);
   
    HAL_Delay(100);
  }

  return 0;
}

void SystemClock_Config(void)
{
  RCC_OscInitTypeDef RCC_OscInitStruct = {0};
  RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};

  /** Configure the main internal regulator output voltage
  */
  HAL_PWREx_ControlVoltageScaling(PWR_REGULATOR_VOLTAGE_SCALE1);

  /** Initializes the RCC Oscillators according to the specified parameters
  * in the RCC_OscInitTypeDef structure.
  */
  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;
  RCC_OscInitStruct.HSIState = RCC_HSI_ON;
  RCC_OscInitStruct.HSIDiv = RCC_HSI_DIV1;
  RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;
  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
  RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI;
  RCC_OscInitStruct.PLL.PLLM = RCC_PLLM_DIV4;
  RCC_OscInitStruct.PLL.PLLN = 70;
  RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV10;
  RCC_OscInitStruct.PLL.PLLQ = RCC_PLLQ_DIV5;
  RCC_OscInitStruct.PLL.PLLR = RCC_PLLR_DIV5;
  if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
  {
   
  }

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

  if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK)
  {
 
  }
}

main.h

#ifndef _MAIN_PROGRAM_
#define _MAIN_PROGRAM_

#ifdef __cplusplus
 extern "C" {
#endif

#include "stm32g0xx_hal.h"
#include "stm32g071xx.h"
#include "stm32g0xx.h"

#ifdef __cplusplus
 }
#endif
#endif /* _MAIN_PROGRAM_ */


Card image cap
Guillermo Garcia I am an embedded systems software engineer. I like constant learning, IoT systems and sharing knowledge


Comentarios... no existen comentarios.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Subscribe


Subscribe to receive the latest content.
Loading