Ingeniería del LED PlatformIO IDE (VSCode) parpadea marco -stm32cube

Plataforma de Pruebas

La IDE PlatformIO (VSCode)
placa del sistema mínimo stm32f103c8t6, tablero pines del conector de LED en PC13, bajo iluminación
j-link depurador emulador

Probar Objetivo: Crear un marco stm32cube proyecto para lograr el ciclo LED parpadeante código

Creación de proyectos

Este paso es muy simple, por favor preste atención a la selección de un marco stm32cube ^ [correspondencia stm32cube es la biblioteca cubemx, ver STM32Cube], STM32F103C8 selección placa de desarrollo (20kRAM.64kFlash) (común), cualquiera sea el nombre y haga clic en Guardar:
Aquí Insertar imagen Descripción
Aquí Insertar imagen Descripción

Adición de código de ejemplo

Según STM32Cube HAL y Nucleo-F401RE: la depuración y la unidad de pruebas - añadir a un proyecto existente generada ^ [STM32Cube HAL y Nucleo-F401RE: la depuración y la unidad de prueba] procedimiento descrito añadir el código para su propia placa de desarrollo (LED correspondiente modificado pin) puede ser).

carpeta src rápida, crear dos archivos, uno es main.h otro está main.c:
Aquí Insertar imagen Descripción
Agregue el código siguiente para mian.h, si el LED de a bordo está conectado con otros pernos, modifique en consecuencia alrededor de tres LED definiciones de macro:

#ifndef MAIN_H
#define MAIN_H

#include "stm32f1xx_hal.h"

#define LED_PIN GPIO_PIN_13
#define LED_GPIO_PORT GPIOC
#define LED_GPIO_CLK_ENABLE() __HAL_RCC_GPIOC_CLK_ENABLE()

#endif  // MAIN_H

Agregue el código siguiente para mian.c en:

#include "main.h"

void LED_Init(void);

int main(void) {
  HAL_Init();
  LED_Init();

  while (1) {
    // LED 翻转
    HAL_GPIO_TogglePin(LED_GPIO_PORT, LED_PIN);
    HAL_Delay(1000);
  }
}

void LED_Init(void) {
  // LED GPIO 初始化
  LED_GPIO_CLK_ENABLE();
  GPIO_InitTypeDef GPIO_InitStruct;
  GPIO_InitStruct.Pin = LED_PIN;
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  GPIO_InitStruct.Pull = GPIO_PULLUP;
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
  HAL_GPIO_Init(LED_GPIO_PORT, &GPIO_InitStruct);
}

void SysTick_Handler(void) { HAL_IncTick(); }

Modificar el programa de descarga, descargador PlatformIO por defecto que st-link
Estamos utilizando JLINK
modificar el archivo platformio.ini, añadir JLINK descargador de
Aquí Insertar imagen Descripción
asegurar la placa del sistema stm32f103c8t6 mínimo está conectado al ordenador a través de USB JLINK, compilación y el programa de subida :
Aquí Insertar imagen Descripción
esta vez, vamos a encontrar, LED no parpadeó como 1s esperados, por proyectos de generación stm32cube referencia se pueden encontrar, tenemos la frecuencia de reloj del microcontrolador sin externa, lo que significa que estamos utilizando es siempre 8M.

A continuación se añaden dos nuevos archivos sys_basic.h y sys_basic.c.
Sys_basic.h documento dice lo siguiente:

#ifndef SYS_BASIC_H
#define SYS_BASIC_H

void _Error_Handler(char*, int);
#define Error_Handler() _Error_Handler(__FILE__, __LINE__)

void SystemClock_Config(void);

#endif

Sys_basic.c documento dice lo siguiente:

#include "sys_basic.h"
#include "stm32f1xx_hal.h"

/** 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);
}

/**
 * @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 */
}

void NMI_Handler(void) {}

void HardFault_Handler(void) {
  while (1) {
  }
}

void MemManage_Handler(void) {
  while (1) {
  }
}

void BusFault_Handler(void) {
  while (1) {
  }
}

void UsageFault_Handler(void) {
  while (1) {
  }
}

void SVC_Handler(void) {}

void DebugMon_Handler(void) {}

void PendSV_Handler(void) {}

SystemClock_Config función de reloj de inicialización implementado aquí usando una selección de la fuente de reloj común 8M de alta velocidad de reloj del oscilador, multiplicador 9 dispuesta en
main.c Modificar
comprende sys_basic.h en el archivo de encabezamiento y en el principal HAL_Init función main.c (); después de Únete reloj función de inicialización de llamada SystemClock_Config ();.
Aquí Insertar imagen Descripción
En este momento, la carga del programa compilador, se puede ver el LED parpadea a intervalos de 1s l!

Publicado 34 artículos originales · ganado elogios 2 · Vistas 2308

Supongo que te gusta

Origin blog.csdn.net/weixin_44088559/article/details/105289484
Recomendado
Clasificación