使用 SW4STM32 和 HAL 库首次设置闪烁 LED 示例

注意: 有许多 IDE,工具链和库可以随时使用 STM32。以下设置只需要很少的努力就可以使它工作,但它只是其中之一。随意探索其他人,它不是此示例的目的是强制任何人使用此处将使用的工具。)

IDE 安装

适用于 STM32 的 System Workbench:适用于 Windows,Linux 和 OS X 的免费 IDE。它由 AC6构建,可从 OpenSTM32 社区网站注册后下载。

IDE 本身基于 Eclipse,但为 STM32 开发提供了一些附加功能,如:

  • Ac6 STM32 MCU GCC 工具链
  • OpenOCD 和 GDB(arm-none-eabi-gdb),具有自动生成的调试配置,具体取决于目标板
  • 内置选项可编程或擦除芯片

在创建自己的电路板之前先从 STM32 开始,建议尝试使用 DiscoveryNucleoEval 板 ,它们带有一个板载 SWD(串行线调试)编程器/调试器,称为 ST-Link。

创建一个项目

此示例将使用 STM32F4 Discovery 套件 ,该套件具有 STM32F407VG 微控制器。 (也可以使用任何其他板。)

  1. 打开 SW4STM32 并创建一个新的 C 项目: 文件→新建→C 项目

  2. 给它命名为 “STM32F4_Discovery-Blinky” ,从项目类型列表中选择 Executable / Ac6 STM32 MCU 项目。默认情况下,唯一可用的工具链是 Ac6 STM32 MCU GCC 。点击下一步。

    StackOverflow 文档

  3. 下一步是调试/发布设置,现在可以通过单击下一步跳过。

  4. 董事会选择。可以选择现有的板,如本例所示,可以添加 STM32F4 Discovery 或新的定制板。

    StackOverflow 文档

  5. 下一步是 Project Firmware 配置。选择无固件标准外设库 (SPL)或硬件抽象层 (HAL)。有人质疑哪一个更适合开发,但这个问题超出了本例的范围。此示例将使用 HAL 库,因为它是 ST Microelectronics 目前支持的。用于 HAL 的其他可用软件工具是 STM32CubeMX ,它是初始化代码生成器。此外, STM32CubeFx 或 STM32CubeLx 软件包还提供了几个示例应用程序。如果目标固件丢失,请下载目标固件,建议选择 在项目中添加低级驱动程序作为应用程序中的源 选项。最后,单击 Finish。

    StackOverflow 文档

闪烁 LED 应用

由于此项目是使用 STM32F4 Discovery 创建的,因此在 / STM32F4_Discovery-Blinky / Utilities / STM32F4-Discovery / project 文件夹下已有几个即用型功能,可用于连接 Discovery 工具包的外围设备(加速度计,音频) ,LED,按钮)。在这个例子中,将从 stm32f4_discovery.c 文件中使用 void BSP_LED_Init(Led_TypeDef Led)void BSP_LED_Toggle(Led_TypeDef Led) 函数来闪烁绿色 LED,即 LED4。决定哪个 LED 使用 Discovery 工具包的原理图。

StackOverflow 文档

一些 #defineenum 已经隐藏了实际的引脚和端口名称,使用 Ctrl + Click 来跟踪它们。

  1. main 内部,调用 HAL_Init() 函数,重置所有外设,初始化 Flash 界面和 Systick。 (Systick 将用于生成闪烁的延迟。)
  2. 必须配置系统时钟。可以使用 STM32CubeMX 时钟配置功能或参考手册来完成。在此示例中,系统时钟由内部 PLL(锁相环)提供,内部 PLL 由外部 8 MHz 晶体振荡器(HSE)提供。预分频器已设置为实现最大可用频率,在 F4 发现的情况下为 168 MHz。
  3. 初始化外设,在本例中为 GPIO 引脚。
  4. 在无限循环内,调用 LED 切换和 HAL_Delay() 功能。HAL_Delay() 使用 Systick 并以毫秒为单位产生延迟。

整个代码如下:

#include "stm32f4xx.h"
#include "stm32f4_discovery.h"
            
void SystemClock_Config(void);

int main(void)
{
    /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
    HAL_Init();

    /* Configure the system clock */
    SystemClock_Config();

    /* Initialize one of the LED GPIO pin */
    BSP_LED_Init(LED4);

    while(1)
    {
        BSP_LED_Toggle(LED4);
        HAL_Delay(1000);       // in miliseconds
    }
}

/**
 * @brief  System Clock Configuration
 *         The system Clock is configured as follow :
 *            System Clock source            = PLL (HSE)
 *            SYSCLK(Hz)                     = 168000000
 *            HCLK(Hz)                       = 168000000
 *            AHB Prescaler                  = 1
 *            APB1 Prescaler                 = 4
 *            APB2 Prescaler                 = 2
 *            HSE Frequency(Hz)              = HSE_VALUE
 *            PLL_M                          = (HSE_VALUE/1000000u)
 *            PLL_N                          = 336
 *            PLL_P                          = 2
 *            PLL_Q                          = 7
 *            VDD(V)                         = 3.3
 *            Main regulator output voltage  = Scale1 mode
 *            Flash Latency(WS)              = 5
 * @param  None
 * @retval None
 */
void SystemClock_Config(void)
{
  RCC_ClkInitTypeDef RCC_ClkInitStruct;
  RCC_OscInitTypeDef RCC_OscInitStruct;

  // Enable Power Control clock
  __PWR_CLK_ENABLE();

  // The voltage scaling allows optimizing the power consumption when the
  // device is clocked below the maximum system frequency, to update the
  // voltage scaling value regarding system frequency refer to product
  // datasheet.
  __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);

  // Enable HSE Oscillator and activate PLL with HSE as source
  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
  RCC_OscInitStruct.HSEState = RCC_HSE_ON;
  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
  RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;

  // This assumes the HSE_VALUE is a multiple of 1MHz. If this is not
  // your case, you have to recompute these PLL constants.
  RCC_OscInitStruct.PLL.PLLM = (HSE_VALUE/1000000u);
  RCC_OscInitStruct.PLL.PLLN = 336;
  RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2;
  RCC_OscInitStruct.PLL.PLLQ = 7;
  HAL_RCC_OscConfig(&RCC_OscInitStruct);

  // Select PLL as system clock source and configure the HCLK, PCLK1 and PCLK2
  // clocks dividers
  RCC_ClkInitStruct.ClockType = (RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_HCLK
      | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2);
  RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
  RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
  RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV4;
  RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2;
  HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_5);
}

使用锤子构建, StackOverflow 文档 通过右键单击项目文件夹并选择 Target→Program chip … 选项来下载应用程序。

另一种下载方式是使用 debug 。为此,请单击 StackOverflow 文档 工具栏中错误图标旁边的箭头,然后打开“ 调试配置…” 菜单。创建一个新的 Ac6 STM32 调试配置,如果 C / C++ Application 字段为空,请填写以下内容:

调试\ STM32F4_Discovery,Blinky.elf

其他调试参数(如 OpenOCD 配置文件和使用的 Telnet 和 GDB 端口)由框架自动生成和填充。最后,单击调试按钮。