接前一篇文章:STM32CubeMX配置步骤详解六 —— 时钟及其它内部参数配置(1)
本文内容主要参考:
STM32CUBEMX配置教程(一)基础配置-CSDN博客
野火STM32系列HAL库开发教程 —— 第12讲 STM32的复位和时钟控制(第12讲-STM32的复位和时钟控制(RCC)1_哔哩哔哩_bilibili)
【STM32 HAL库】 STM32H743的电源配置和时钟配置 - 哔哩哔哩
特此致谢!
四、STM32CubeMX时钟配置
上一回讲解了STM32时钟基础知识,并讲解了STM32H7系列(STM32H743)的时钟设计框架。本回结合STM32CubeMX,对于系统时钟进行实际配置,并在此过程中结合手册(《STM32H743参考手册中文版》、《stmh743数据手册》)进行详解,以加深对这一部分的认识和理解。
2. 具体配置
(1)启动程序
双击桌面上的“STM32CubeMX”图标,启动STM32CubeMX程序。程序启动后,界面如下所示:
(2)新建项目
点击“File”->“New Project”:
之后出现以下进度提示:
以上过程结束之后,出现以下界面:
在“Part Number”后的编辑框中输入“STM32H743VI”,同时右侧内容改变为如下:
点击右侧窗口中的“STM32H743VITx”,界面变为如下内容:
点击右上角的“Start Project”,或者双击“STM32H743VITx”一行,进入工程界面。
点击屏幕上方的按钮Project Manager,进入工程管理界面:
在“Project Name”项对应的框中输入工程名称,这是必须的。也可以点击“Project Location”项的“Browser”按钮,修改工程路径,但同样地,务必记住不能用中文路径。
这里,笔者在D盘下新建一个保存项目代码的文件夹,并且选择它。如下所示:
接下来,“Toolchain / IDE”一项选择所使用的编译工具,当然也是视具体情况而定。笔者使用的是Keil 5,因此选择“MDK ARM”。如下图所示:
“Min Version中”的版本要留意一下,确保与你当前使用的Keil版本匹配。比如,笔者所使用的Keil的版本为“5.18”,因此此处需要将“Min Version”对应的值改为“V5”:
接下来,点击最左边的Code Generate菜单进入代码生成的配置界面:
在此界面中可以配置许多与代码生成相关的配置。其它项用默认选择就好,只是需要把“Generate peripheral initialization as a pair of '.c/.h' files peripheral”一项选中。选中此项后,生产的代码会更加清晰明了,因此强烈建议勾选此项。
到此步骤为止,就是前文书所讲的基本配置步骤了。在此为了能够方便大家操作及回顾,重复说明了一下签署步骤。接下来开始时钟的配置。
(3)配置时钟
点击“Clock Configuration”选项,切换到“时钟配置”页面:
在配置时钟之前,先要配置相关引脚。切换到“Pinout & Configuration”选项:
点击“System Core”,出现下拉列表:
点击“RCC”项,界面出现以下内容:
这里“High Speed Clock(HSE)”选择“Crystal/Ceramic Resonator”,即晶体/陶瓷 谐振器:
切换回“Clock Configuration”选项,可以看到与之前不同了:
高速时钟源一般是12、8、25等以MHz为单的晶振,低速时钟往往是32.768k的频率。这里暂时先以25MHz时钟为例,后续会使用笔者实际工程中使用的12M时钟。
参考上一回所提到的时钟限制:
可以看到,对于STM32H743芯片来说,其系统时钟可以配置为最高480MHz。当然,这是有条件的,要求VOS0~VOS3这些位要配置好。VOS0~VOS3的说明在《STM32H743中文参考手册》的“6.8.6 PWR D3 域控制寄存器(PWR_D3CR)”中,如下:
回到STM32CubeMx中,要设置VOS的值,需要切换到“Pinout & Configuration”选项中,仍然是在RCC选项下,找到“Power Parameters”下的“Power Regulator Voltage Scale”项,如下所示:
将“Power Regulator Voltage Scale”项对应的值选择为“Power Regulator Voltage Scale 0”,如下所示:
选择好了之后,再回到“Clock Configuration”选项中,在多路选择中选择“HSE”,如下所示:
与手册中的说明对应,在STM32CubeMX中,也给出了系统时钟的最大值为480MHz:
这里,可以直接使用HSE即外部时钟源,但一般是使用HSE经过倍频后的时钟。如下所示:
你可以自己计算DIVM1、DIVN1、DIVP1的值,从而得到480MHz的系统时钟。但是更为简便的方式是直接在系统时钟框中输入480并回车确认,让系统自动计算并给出推荐值。如下所示:
回车确认后,出现系统时钟自动适配过程提示,如下图所示:
此过程需要一定时间,在笔者电脑上大约需要2~3分钟,系统自动选择好之后的界面如下所示:
讲解并计算一下由外部时钟计算出系统时钟的过程:
选择的25MHz的外部时钟作为时钟源输入到PLL1中,之后依次经过DIVM1、DIVN1和DIVP1,计算公式为:
Frequency / DIVM1 * DIVN1 / DIVP1
也就是,25 / 5 * 192 / 2 = 480,最终得到480MHz的系统时钟。
此系统时钟又经过D1域的分频因子(D1CPRE Prescaler),得到给外设使用的基础时钟,而后再经过AHB总线分频因子(HPRE Prescaler),得到AHB总线上的时钟,为240MHz。之后再经过各个域的分频因子,最终得到各个外设总线上的时钟。
(4)生成工程源码
系统时钟配置好后,可以生成工程源码了。回到“Project Manager”页面:
前述步骤已经将各选项都设置好了,这里直接点击“Generate Code”按钮,生成项目源码:
源码生成完成后,出现以下提示:
点击“Open Project”按钮,打开Keil并查看生成的源码工程。如下所示:
可以看到,main.c中的SystemClock_Config函数中的各个值,与上边STM32MXCube所设定的值是一一对应的。
至此,STM32CubeMX(在STM32H7系列上)的时钟配置详细步骤讲完了。
上边还提到,使用笔者项目中实际使用的12M外部时钟进行配置。实际上,配置步骤与上边25MHz
的时钟配置步骤基本相同,只是值不同而已。在此只给出相关值的页面以及最终生成得工程代码截图。
这里,笔者将新建的这两个工程分别打包传到CSDN,方便后续有用到的人直接下载使用。
链接分别为:
https://download.csdn.net/download/phmatthaus/89094605
和
https://download.csdn.net/download/phmatthaus/89094607