STM32CubeMX配置步骤详解七 —— 时钟及其它内部参数配置(2)

接前一篇文章: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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/525141.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

docker一键部署GPU版ChatGLM3

一键运行 docker run --gpus all -itd --name chatglm3 -p 81:80 -p 6006:6006 -p 8888:8888 -p 7860:7860 -p 8501:8501 -p 8000:8000 --shm-size32gb registry.cn-hangzhou.aliyuncs.com/cwp-docker/chatglm3-gpu:1.0 进入容器 docker exec -it chatglm3 /bin/bash cd /…

企业版ChatGPT用户激增至60万;百度文心一言推出个性化声音定制功能

🦉 AI新闻 🚀 企业版ChatGPT用户激增至60万 摘要:OpenAI首席运营官Brad Lightcap在接受采访时透露,企业版ChatGPT的注册用户已超60万,相较2024年1月的15万用户,短短三个月内增长了300%。这一版本自2023年…

【Java】maven是什么?

先看一下基本概念: ①Maven 翻译为"专家","内行"是跨平台的项目管理工具。 主要服务于基于Java平台的项目构建,依赖管理和项目信息管理。 ②项目构建 项目构建过程包括【清理项目】→【编译项目】→【测试项目】→【生成测试报…

js 数组 按列循环二维数组

期待效果&#xff1a; 核心代码&#xff1a; //js function handle(array) {var result [];for (let i 0; i < array[0].length; i) {var item []; for (let j 0; j < array.length; j) {item.push(array[j][i])} result.push(item);} return result; } 运行代码&a…

14 Python进阶:math模块和requests 模块

常用方法 Python3 的 math 模块提供了许多数学函数&#xff0c;用于执行常见的数学运算。以下是 math 模块中一些常用方法的简介&#xff1a; 数值运算函数&#xff1a; math.sqrt(x)&#xff1a;返回 x 的平方根。math.pow(x, y)&#xff1a;返回 x 的 y 次幂。math.exp(x)&a…

TiDB MVCC 版本堆积相关原理及排查手段

导读 本文介绍了 TiDB 中 MVCC&#xff08;多版本并发控制&#xff09;机制的原理和相关排查手段。 TiDB 使用 MVCC 机制实现事务&#xff0c;在写入新数据时不会直接替换旧数据&#xff0c;而是保留旧数据的同时以时间戳区分版本。 当历史版本堆积过多时&#xff0c;会导致读…

Golang | Leetcode Golang题解之第13题罗马数字转整数

题目&#xff1a; 题解&#xff1a; var symbolValues map[byte]int{I: 1, V: 5, X: 10, L: 50, C: 100, D: 500, M: 1000}func romanToInt(s string) (ans int) {n : len(s)for i : range s {value : symbolValues[s[i]]if i < n-1 && value < symbolValues[s…

MySQL - MySQL数据库的事务(一)

1. 回顾一下MySQL运行时多个事务同时执行是什么场景 平时我们执行增删改的时候,无非就是从磁盘加载数据页到buffer pool的缓存页里去,对缓存页进行更新,同时记录下来undo log回滚日志和redo log重做日志,应该的是事务提交之后MySQL挂了恢复数据的场景,以及事务回滚的场景…

AcWing 3. 完全背包问题

解题思路 不过这种方式是有序的&#xff0c;而不是无序的。 相关代码 import java.util.Scanner;public class Main{static long f[] new long[1010];static int v[] new int[1010];static int w[] new int[1010];public static void main(String[] args){Scanner scan n…

Windows Docker 部署 PostgreSQL 数据库

一、简介 PostgreSQL是一个功能强大且特性齐全的对象-关系型数据库管理系统&#xff0c;它以加州大学计算机系开发的POSTGRES为基础&#xff0c;并具备高度自由开源的特性。PostgreSQL支持大部分SQL标准&#xff0c;提供了复杂查询、外键、触发器、视图、事务完整性以及多版本…

Android 11属性系统初始化流程

在init进程启动的第二阶段&#xff0c;调用PropertyInit 对属性系统进行初始化 int SecondStageMain(int argc, char** argv) {//省略PropertyInit();//省略 }PropertyInit函数在system\core\init\property_service.cpp 中实现 void PropertyInit() {//省略mkdir("/dev/…

2024最新SpringCloud学习教程,Consul/Nacos/Feign/Sentinel/Gateway/Seata一网打尽

本文主要介绍了SpringCloud最新的应用技术&#xff0c;简单说明每类技术涉及的知识点&#xff0c;对应技术的学习资料、软件、可用代码和下载地址在文末给出。 文章目录 说明SpringCloud简介ConsulConsul简介使用示例 NacosNacos简介使用示例 负载均衡LoadBalancerLoadBalancer…

链表实验.

#include<stdio.h> #include<stdlib.h>// 定义单链表节点结构体 struct Node {int data;struct Node* next; };struct Node* initList() {struct Node* list (struct Node*)malloc(sizeof(struct Node));list->data 0;list->next NULL;return list; }void…

蚁剑修改特征性信息

前言 我们首先得知道蚁剑的流量特征&#xff1a; 编码器和解码器的特征&#xff1a;蚁剑自带的编码器和解码器具有明显的特点&#xff0c;可以通过更改配置文件来达到流量加密的目的1。例如&#xff0c;蚁剑支持多种编码方式&#xff0c;如base64、chr、rot13等&#xff0c;这…

海量智库 | ANY权限原理介绍

ANY权限是Vastbase中的一种特殊的管理权限&#xff0c;用户能够通过ANY权限执行更广泛的操作&#xff0c;更加便利的管理数据库。 本文将为您介绍ANY权限管理的相关原理。 ANY权限管理相关解释 ANY权限管理&#xff0c;是对数据库内的某一类对象的所有实体进行特定的权限管理…

【C++】继承总结

一、前言 我们众所周知的C三大特性分别为&#xff1a;封装、继承、多态。 封装就是将接口实现统一化&#xff0c;隐藏那些不同的地方&#xff0c;在上层函数调用体现的方式一样&#xff0c;如各种容器的迭代器iterator&#xff0c;尽管底层实现的方式不同&#xff0c;但是在使用…

C++数据结构与算法——贪心算法简单题

C第二阶段——数据结构和算法&#xff0c;之前学过一点点数据结构&#xff0c;当时是基于Python来学习的&#xff0c;现在基于C查漏补缺&#xff0c;尤其是树的部分。这一部分计划一个月&#xff0c;主要利用代码随想录来学习&#xff0c;刷题使用力扣网站&#xff0c;不定时更…

安全加固方面思路

系统层面上的加固 备份重要配置文件&#xff1a;将一些重要的系统配置文件备份&#xff0c;包括 /etc/login.defs、/etc/security/limits.conf 等等。进行账号安全加固&#xff1a;修改密码安全策略&#xff0c;设置密码存在最长时间、密码长度、密码过期提醒等。 &#xff08…

Linux设备模型统一:桥接硬件多样性与应用程序开发的关键

在Linux的宏大世界中&#xff0c;各种各样的硬件设备如星辰般繁多。从常见的USB设备到复杂的网络接口卡&#xff0c;从嵌入式设备到强大的服务器&#xff0c;Linux需要在这些差异极大的硬件上运行。这就引出了一个问题&#xff1a;Linux是如何统一这些不同硬件的设备模型的呢&a…

Android 11 上的文件读写无权限问题

Android 6以上需要动态申请读写权限&#xff0c;但是11以上动态申请了读写权限也是无效。并且手动给予权限没有该按钮。 如上图华为钱包有个所有文件权限、但是百度地图只有仅媒体权限&#xff0c;仅媒体权限&#xff08;动态申请读写权限&#xff09;给予后软件还是没法访问文…