ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

STM32F429IGT6(一):使用外部晶振配置LED灯闪烁

STM32F429IGT6(一):使用外部晶振配置LED灯闪烁

本专栏记录STM32开发各个功能的详细过程,方便自己后续查看,当然也供正在入门STM32单片机的兄弟们参考;

本小节的目标是,使用STM32F429IGT6单片机,野火的开发板,通过STM32CubeMX软件,配置并使用外部8MHz晶振,实现PB4引脚的LED灯每一秒钟闪烁一次;主要目的就是验证整个开发板的硬件配置、开发调试完整流程;为后面的开发打下基础
涉及到的知识有:外部晶振的配置,配置引脚为输出,STM32CubeMX的使用
我是将PB4引脚接的LED,所以本小节是以PB4为例记录的,如果需要将其他引脚配置为LED灯,那将PB4改为其他对应的引脚即可。

文章目录

  • 一、安装F4的STM32CubeMX 库
    • 1.1 在线安装
    • 1.2 离线安装
  • 二、硬件配置
    • 2.1 硬件接线
    • 2.2 STM32CubeMX 硬件配置
  • 三、STM32CubeIDE 编写LED闪烁代码
  • 四、程序编译与下载
  • 五、扩展:彩色灯闪烁

一、安装F4的STM32CubeMX 库

1.1 在线安装

STM32CubeMX 库(固件支持包)的安装支持在线安装:
以STM32G030C8T6 单片机为例进行库安装:

  1. 双击STM32CubeMX 可执行程序

  1. 选择菜单Help 下面的Manage embedded software packages


3. 找到下图 所示Package of STM32F4 Series 打钩,再点击箭头所示Install

4.安装过程中会有进度条显示

如果安装成功,原先打钩地方会变成绿色方框,点击CLOSE 完成安装

如果安装失败,则使用离线安装的方式进行安装

1.2 离线安装

直接将包复制到\Repository目录(推荐)

因为我在自己的笔记本上(没有特殊防火墙)在线安装好2.8版本的库文件后,发现在存放这个库的目录下,比不装2.8的时候,也就只多出了一下STM32Cube_FW_G0_V1.6.1这个文件夹,如下图所示:

至于这个Repository 文件夹怎么确认是哪个路径?如下图所示:

所以我想到了另外一种离线安装的方法,想办法得到这个多出来的文件夹,手动放到公司那台不能在线安装的电脑的对应Repository Folder文件夹不就可以了。

所以最后一种方法就是把这个文件夹直接放到上图所示的Repository Folder路径下,得到这个目标文件夹有两种方法,

  • 第一你找一台能在线安装的电脑,在线安装完成后,从Repository Folder可以拿到这个压缩包
  • 第二,从我上传的资源中下载()

拿到资源后解压到Repository Folder路径下即可,如下图所示:

打开STM32CubeMX看一下:

二、硬件配置

2.1 硬件接线

我使用的是野火的STM32F429IGT6开发板,烧录器使用STLink;实物图如下:

注意:
1、开发板的电源线要插上
2、STLink一头插进电脑USB口,另一头通过排线查到开发板的JTAG口

2.2 STM32CubeMX 硬件配置

打开 STM32CubeMX,开始新建工程:

  1. 选择芯片型号
    • 点击Access to MCU Selector。
    • 在搜索框输入STM32F429IGT,在右侧列表中选择STM32F429IGTx(野火挑战者使用的是这个144脚/176脚芯片,型号匹配即可),点击右上角的Start Project。

  1. 配置时钟源 (RCC)

    • 左侧菜单栏展开System Core-> 点击RCC。
    • 在High Speed Clock (HSE)下拉框选择Crystal/Ceramic Resonator(外部晶振)。
  2. 配置调试接口 (SYS)

    • 左侧菜单栏System Core-> 点击SYS。
    • 在Debug下拉框选择Serial Wire(这是你的DAP仿真器用的SWD接口,必须选,否则下次可能无法下载)。
  3. 配置GPIO引脚

    • 在右侧芯片图上,找到PH10引脚,左键点击,选择GPIO_Output。

  • 左侧菜单栏展开System Core-> 点击GPIO。
  • 在列表中找到PH10,点击它,在下方的配置框中:
    • GPIO output level: 选择High(因为LED是低电平点亮,初始设为高电平让它灭掉)。
    • GPIO mode:Output Push Pull(推挽输出)。
    • GPIO Pull-up/Pull-down:No pull。
    • Maximum output speed:Low或High都行。
  1. 配置时钟树 (Clock Configuration)
    • 切换到顶部的Clock Configuration标签页。
    • 在 PLL Source Mux 那里,点击 HSE 旁边的圆圈。
    • 找到HCLK (MHz)这一栏,直接输入180然后按回车。软件会自动弹出提示帮你计算分频和倍频系数,点击OK即可(F429最高主频就是180MHz)。

  1. 生成工程代码
    • 切换到顶部Project Manager标签页。
    • Project Name: 自己起个名字,比如F429_LED_Reg。
    • Project Location: 选择你的代码存放路径(注意:路径中绝对不要包含中文和空格)。
    • Toolchain / IDE: 选择STM32CubeIDE。
    • 点击右上角的GENERATE CODE按钮,生成完毕后点击Open Project,IDE会自动打开。

三、STM32CubeIDE 编写LED闪烁代码

工程用STM32CubeIDE打开后,在左侧Project Explorer中,找到Core/Src/main.c双击打开。

  1. 找到主循环
    在main.c中往下拉,找到/* USER CODE BEGIN WHILE */和/* USER CODE END WHILE */之间的区域。

  2. 编写LED闪烁代码
    将以下代码复制到while (1)内部(一定要在USER CODE区域内,这样以后重新用CubeMX生成代码时,你的代码才不会被覆盖):

while(1){// 1. 翻转 PH10 引脚的电平(如果原来是低电平就变高,原来高就变低)HAL_GPIO_TogglePin(GPIOH,GPIO_PIN_10);// 2. 调用 HAL 库的毫秒级延时函数,延时 1000 毫秒(即 1 秒)HAL_Delay(1000);/* USER CODE END WHILE *//* USER CODE BEGIN 3 */}

四、程序编译与下载

  1. 编译工程

    • 点击上方工具栏的小锤子图标 (Build Debug),或者按Ctrl + B。
    • 查看下方Console窗口,提示Build Finished. 0 errors, 0 warnings即表示编译成功。
  2. 连接开发板

    • 把STLink仿真器插上电脑,另一头接开发板的JTAG接口(注意板子要供电,打开电源开关)。
    • 把开发板的BOOT0和BOOT1都跳线到GND(从内部Flash启动)。
  3. 设置下载器以及下载程序

    • 点击上方工具栏的绿色小虫子/播放键(Debug)。因为我是用的STLink,所以按如下进行配置:
    • 第一次运行会提示你下载程序到芯片中。程序下载完后会自动停在第main函数的第一行(如果配置了断点的话)。
    • 此时,按下键盘的F8(或者点击上方绿色的Resume按钮),让程序全速运行。

程序运行后,就可以看到开发板上电源灯旁边的小灯红颜色开始闪烁了。

五、扩展:彩色灯闪烁


看原理图我们可以发现,这个LED是个彩色LED,PH10控制红色,PH11控制绿色,PH12控制蓝色,所以我们可以配置一个彩色灯的闪烁。
点开目录下的LED_Test.ioc,可以直接打开MX在原来的基础上进行配置


配置新增的 GPIO 引脚

在右侧芯片图上,找到 PH11 引脚,左键点击,选择 GPIO_Output。

再次找到 PH12 引脚,左键点击,选择 GPIO_Output。

(此时你的 PH10, PH11, PH12 应该都变成了绿色,代表输出模式)。

检查引脚初始状态

左侧菜单栏展开 System Core -> 点击 GPIO。

你会看到列表里有 PH10、PH11、PH12 三个引脚。

确保它们三个的 GPIO output level 都是 High(高电平,即初始状态灯全灭)。

确保 GPIO mode 都是 Output Push Pull(推挽输出)。

重新生成代码

点击右上角 GENERATE CODE。

如果弹出警告问是否覆盖,点击 Yes。生成完毕后,点击 Open Project 回到 IDE。

回到 IDE 后,打开 Core/Src/main.c,找到 while (1) 循环区域。将之前的代码替换为下面的完整代码。

注意:一定要写在 /* USER CODE BEGIN WHILE/ 和 /USER CODE END WHILE */ 之间。

/* Infinite loop *//* USER CODE BEGIN WHILE */while(1){/* === 第一步:亮红灯 === */HAL_GPIO_WritePin(GPIOH,GPIO_PIN_10,GPIO_PIN_RESET);// PH10 输出低电平(红亮)HAL_GPIO_WritePin(GPIOH,GPIO_PIN_11,GPIO_PIN_SET);// PH11 输出高电平(绿灭)HAL_GPIO_WritePin(GPIOH,GPIO_PIN_12,GPIO_PIN_SET);// PH12 输出高电平(蓝灭)HAL_Delay(500);// 保持 0.5 秒/* === 第二步:亮绿灯 === */HAL_GPIO_WritePin(GPIOH,GPIO_PIN_10,GPIO_PIN_SET);// 红灭HAL_GPIO_WritePin(GPIOH,GPIO_PIN_11,GPIO_PIN_RESET);// 绿亮HAL_GPIO_WritePin(GPIOH,GPIO_PIN_12,GPIO_PIN_SET);// 蓝灭HAL_Delay(500);/* === 第三步:亮蓝灯 === */HAL_GPIO_WritePin(GPIOH,GPIO_PIN_10,GPIO_PIN_SET);// 红灭HAL_GPIO_WritePin(GPIOH,GPIO_PIN_11,GPIO_PIN_SET);// 绿灭HAL_GPIO_WritePin(GPIOH,GPIO_PIN_12,GPIO_PIN_RESET);// 蓝亮HAL_Delay(500);/* === 第四步:亮黄灯(红+绿混色)=== */HAL_GPIO_WritePin(GPIOH,GPIO_PIN_10,GPIO_PIN_RESET);// 红亮HAL_GPIO_WritePin(GPIOH,GPIO_PIN_11,GPIO_PIN_RESET);// 绿亮HAL_GPIO_WritePin(GPIOH,GPIO_PIN_12,GPIO_PIN_SET);// 蓝灭HAL_Delay(500);/* === 第五步:全亮(红+绿+蓝混色为白光)=== */HAL_GPIO_WritePin(GPIOH,GPIO_PIN_10,GPIO_PIN_RESET);// 红亮HAL_GPIO_WritePin(GPIOH,GPIO_PIN_11,GPIO_PIN_RESET);// 绿亮HAL_GPIO_WritePin(GPIOH,GPIO_PIN_12,GPIO_PIN_RESET);// 蓝亮HAL_Delay(500);/* === 第六步:全灭 === */HAL_GPIO_WritePin(GPIOH,GPIO_PIN_10,GPIO_PIN_SET);// 全高电平,全灭HAL_GPIO_WritePin(GPIOH,GPIO_PIN_11,GPIO_PIN_SET);HAL_GPIO_WritePin(GPIOH,GPIO_PIN_12,GPIO_PIN_SET);HAL_Delay(500);/* USER CODE END WHILE *//* USER CODE BEGIN 3 */}/* USER CODE END 3 */

重新编译下载,就可以看到LED在以红、绿、蓝、黄、白的顺序在闪烁了。

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进