26.3.8 ZD-EP37 [CubeMX/时钟树] CubeMX新建工程流程及F407时钟树的介绍
1 时钟树简介
我们先简单介绍一下时钟树(基于STM32F407),先看简图(高速部分):

可以看到外部晶振(探索者系列HSE频率为8MHz,F4系列HSI为16MHz)经分频和锁相环的倍频分频后为SYSCLK提供了一个稳定的高速频率,并(经分频后-可选)传递到总线部分,再经一系列分频操作传递给外设。
F1系列HSI默认直接进行二分频,目的是:满足 PLL 硬件输入规格、兼容频率上限、提升时钟稳定性而设计的强制逻辑,是底层硬件与时钟规划的最优解(由豆包生成)
AHB分频操作的目的:向下满足不同外设的硬件频率上限,向上匹配系统性能与功耗的平衡,同时兼顾总线协议兼容性和特殊外设(如定时器)的功能需求。(由豆包生成)
内部振荡器为RC振荡器,稳定性较差,使用外部振荡器可以得到更稳定的频率
下面再看低速部分:

IWDG(Independent Watchdog)主要用于超时复位,在程序卡死时复位单片机
这里主要看RTC,RTC用于为系统提供精确的时间,因此在有外部振荡器的情况下优先选择外部振荡器(频率更稳定),若实在没有外部振荡器也可以使用内部振荡器替代。
看完简图我们最后过一遍原题图就开始进入CubeMX的部分:

2 CubeMX新建工程
先看大纲:

2.1 工程初步建立
打开CubeMX,找到File->New Project,在MCU选项卡中输入对应芯片型号查找芯片,双击进入到配置界面即完成了工程初步建立。

2.2 时钟相关设置
首先是设置HSE和LSE,在配置界面左侧展开System Core,在列表中双击RCC,将HSE和LSE都设置为Crystal/Ceramic Resonator(晶体/陶瓷振荡器)对于下面的两个MCO(Master Clock Output1/2)设置,若工程有输出时钟的需求则勾选,本次范例中仅展示跑马灯,因此不做勾选。

之后来到配置界面上方Clock Configuration(时钟系统配置),参照我们前面的时钟树相关配置,我们可以完成如下设置:

对于上方的RTC部分,若要使用外部晶振,需要先在Pinout & Configuration选项卡中展开左侧的Timer,在RTC设置中勾选Activate Clock Source才能进行设置。
2.3 GPIO针脚设置
首先我们在原理图中知道,探索者的两个LED灯接入的针脚为PF9和PF10:

之后在配置界面的芯片图部分找到这两个针脚,并将其与GPIO_Output对应

之后来到GPIO选项卡对两个针脚进行配置:

我们将output level修改为High(探索者中LED接的是3.3V的高电平,选择输出等级为High(即高电平),则LED两侧无电势差,默认为灭)。

将GPIO mode改为Push Pull(默认即为此),此选项与另一选项Open Drain的解释见下:
| 特性 | 推挽输出 (Push Pull) | 开漏输出 (Open Drain) |
|---|---|---|
| 高电平驱动 | 主动输出,直接到 VCC | 高阻态,需外部上拉 |
| 低电平驱动 | 主动输出,直接到 GND | 主动输出,直接到 GND |
| 驱动能力 | 强 | 高电平驱动弱,取决于上拉电阻 |
| 线与逻辑 | 不支持 | 支持 |
| 电平转换 | 不方便 | 方便 |
| 典型应用 | LED、UART、SPI | I2C、电平转换 |
(由豆包生成)
下一个选项暂不做解释。
对于Maximum output speed(最大输出速度)选项,用于驱动LED选Low就足够了。
在User Label(用户标签)中,我们可以对这个针脚进行宏定义,将其命名为LED0/1以方便后续代码编写。
对两个针脚进行相同操作后即完成了GPIO的设置。
2.4 Cortex内核配置
直接看图吧,码字码的我好饿:


2.5 生成工程源码
看图吧:


最后点击右上角GENERATE CODE开始生成初始化代码。
生成完成后即可在文件夹中找到工程文件。
2.6 编写用户程序
在Keil中打开工程文件,打开main.c文件,用户代码只可在下图中被BEGIN/END注释包围的部分编写,否则会被后续生成的初始化代码覆盖:

3 结语
我好饿我要去吃麻辣烫了。