STM32完全学习——系统时钟设置
一、时钟框图的解读
首先我们知道STM32在上电初始化之后使用的是内部的HSI未经过分频直接通过SW供给给系统时钟,由于内部HSI存在较大的误差,因此我们在系统完成上电初始化,之后需要将STM32的时钟切换到外部HSE作为系统时钟,那么我们需要完成下面一些设置完成切换。首先我们需要打开外部HSE的震荡电路然后,等待外部震荡电路就绪后,在切换PLLTPRE为HSE的1分频,在设置PLLSRC为PLLXTPRE过来的时钟。然后设置PLLMUL倍频系数,然后打开PLL开关等待PLL稳定。然后设置APB1总线为2分频,最后切换系统时钟为PLL输出的时钟。
二、相关寄存器
三、编程实现
#ifndef __SYSTEM_H__
#define __SYSTEM_H__#define uint unsigned inttypedef struct rRCC
{uint CR;uint CFGR;uint CIR;uint APB2RSTR;uint APB1RSTR;uint AHBENR;uint APB2ENR;uint APB1ENR;uint BDCR;uint CSR;uint AHBRSTR;uint CFGR2;
}RCC_TypeDef;static RCC_TypeDef *RCC = (RCC_TypeDef *)0x40021000;void set_system_clock(void);#endif
#include "system.h"uint HSERDY_FLAG = 0; //HSE就绪标志
uint PLLRDY_FLAG = 0; //PLL就绪标志
uint SWRDY_FLAG = 0; //时钟切换标志
uint false_time = 0; //超时时间标志void set_system_clock(void)
{rFLASH_ACR = 0x00000032; //这个用来设置系统时钟于Flash访问时间的比率 根据系统时钟的不同设置的值不同RCC->CR &= (~(0x01 << 16)); //将HSEON这位清零RCC->CR |= (0x01 << 16); //开启外部HSE振荡器电路do //判断外部HSE电路是否就绪{HSERDY_FLAG = ((RCC->CR) & (0x01 << 17));false_time++;}while((false_time < 0x00ffffff) && (HSERDY_FLAG == 0));false_time = 0;if (HSERDY_FLAG != 0) //如果外部振荡器电路就绪才会执行{ RCC->CFGR &= (~((0x01 << 17) | (0x01 << 16) | (0x0f << 18))); //设置PLL倍频系数为9倍频RCC->CFGR |= ((0x01 << 16) | (0x0 << 17) | (0x07 << 18)); //设置PLL时钟来源为PREDIV1 并且设置PLLXTPRE不对输入的时钟分频RCC->CR &= (~(0x01 << 24)); //使能PLL时钟RCC->CR |= (0x01 << 24);do {PLLRDY_FLAG = ((RCC->CR) & (0x01 << 25));false_time++;}while((false_time < 0x00ffffff) && (PLLRDY_FLAG == 0)); //等待PLL时钟就绪false_time = 0;if (((RCC->CR) & (0x01 << 25)) != 0){ RCC->CFGR &= (~((0x01 << 22) | (0x07 << 8))); RCC->CFGR |= ((0x0 << 22) | (0x04 << 8)); //全速USB OTG配置为PLL输出2分频 APB1总线2分频 PLL输出作为系统时钟RCC->CFGR &= ~(0x03 << 0); RCC->CFGR |= (0x02); //切换系统时钟为PLL输出时钟do{SWRDY_FLAG = ((RCC->CFGR) & (0x03 << 2));false_time++; }while((false_time < 0x00ffffff) && ((SWRDY_FLAG) == 0));if (((RCC->CFGR) & (0x03 << 2)) != 0) //判断时钟是否切换成功{}else{while(1);}}}else{while(1);}
}
上面的代码一个是.h文件另一个是.c文件,但是当我们运行上面的代码时我发现了一个问题,当我们将时钟切换到PLL输出作为系统时钟时,系统就不运行了。就死机了。这是为什么呢,通过翻看数据手册发现,系统时钟和内部flah有一些关系,我们来看flash的寄存器就可以发现。
我们来看bit0-2发现,当复位时默认是000,因此系统时钟必须在0到24MHz之间,这时候我们使用的是内部的HSI时钟,时钟只有8MHz,因此这个时候系统是可以正常运行的,但是当我们将时钟切换到外部HSE时,由于我们做了一系列的倍频,因此这个时候系统时钟到了72MHz,因此我们呢这里需要将这个寄存器的值也设置为010,系统就可以正常运行了。
#define FLASH_ACR 0x40022000
#define rFLASH_ACR *((uint *)FLASH_ACR)void set_system_clock(void)
{rFLASH_ACR = 0x00000032; //这个用来设置系统时钟于Flash访问时间的比率 根据系统时钟的不同设置的值不同RCC->CR &= (~(0x01 << 16)); //将HSEON这位清零RCC->CR |= (0x01 << 16); //开启外部HSE振荡器电路do //判断外部HSE电路是否就绪{HSERDY_FLAG = ((RCC->CR) & (0x01 << 17));false_time++;}while((false_time < 0x00ffffff) && (HSERDY_FLAG == 0));false_time = 0;if (HSERDY_FLAG != 0) //如果外部振荡器电路就绪才会执行{ RCC->CFGR &= (~((0x01 << 17) | (0x01 << 16) | (0x0f << 18))); //设置PLL倍频系数为9倍频RCC->CFGR |= ((0x01 << 16) | (0x0 << 17) | (0x07 << 18)); //设置PLL时钟来源为PREDIV1 并且设置PLLXTPRE不对输入的时钟分频RCC->CR &= (~(0x01 << 24)); //使能PLL时钟RCC->CR |= (0x01 << 24);do {PLLRDY_FLAG = ((RCC->CR) & (0x01 << 25));false_time++;}while((false_time < 0x00ffffff) && (PLLRDY_FLAG == 0)); //等待PLL时钟就绪false_time = 0;if (((RCC->CR) & (0x01 << 25)) != 0){ RCC->CFGR &= (~((0x01 << 22) | (0x07 << 8))); RCC->CFGR |= ((0x0 << 22) | (0x04 << 8)); //全速USB OTG配置为PLL输出2分频 APB1总线2分频 PLL输出作为系统时钟RCC->CFGR &= ~(0x03 << 0); RCC->CFGR |= (0x02); do{SWRDY_FLAG = ((RCC->CFGR) & (0x03 << 2));false_time++; }while((false_time < 0x00ffffff) && ((SWRDY_FLAG) == 0));if (((RCC->CFGR) & (0x03 << 2)) != 0){}else{while(1);}}}else{while(1);}
}
相关文章:
STM32完全学习——系统时钟设置
一、时钟框图的解读 首先我们知道STM32在上电初始化之后使用的是内部的HSI未经过分频直接通过SW供给给系统时钟,由于内部HSI存在较大的误差,因此我们在系统完成上电初始化,之后需要将STM32的时钟切换到外部HSE作为系统时钟,那么我…...
简单理解下基于 Redisson 库的分布式锁机制
目录 简单理解下基于 Redisson 库的分布式锁机制代码流程:方法的调用:具体锁的实现:riderBalance 方法:tryLock 方法(重载):tryLock 方法(核心实现): 简单理解…...
ruoyi框架完成分库分表,按月自动建表功能
前提 这个分库分表功能,按月自动建表,做的比较久了,还没上线,是在ruoyi框架内做的,踩了不少坑,但是已经实现了,就分享一下代码吧 参考 先分享一些参考文章 【若依系列】集成ShardingSphere S…...
数据结构 【单链表练习】
今天来探讨两个练习题要使用的思想为快慢指针。 1、返回链表的中间节点 给你单链表的头结点 head ,请你找出并返回链表的中间结点。如果有两个中间结点,则返回第二个中间结点。 整体思路如下图所示: 代码如下: /*** Definition f…...
wsl虚拟机中的dockers容器访问不了物理主机
1 首先保证wsl虚拟机能够访问宿主机IP地址,wsl虚拟机通过vEthernet (WSL)的地址访问,着意味着容器也要通过此IP地址访问物理主机。 2 遇到的问题:wsl虚拟机中安装了docker,用在用到docker容器内的开发环境,但是虚拟机…...
Elasticsearch 开放推理 API 增加了对 IBM watsonx.ai Slate 嵌入模型的支持
作者:来自 Elastic Saikat Sarkar 使用 Elasticsearch 向量数据库构建搜索 AI 体验时如何使用 IBM watsonx™ Slate 文本嵌入。 Elastic 很高兴地宣布,通过集成 IBM watsonx™ Slate 嵌入模型,我们的开放推理 API 功能得以扩展,这…...
【如何用更少的数据作出更好的决策】-gpt生成
如何用更少的数据作出更好的决策 用更少的数据作出更好的决策是一种能力的体现,需要结合有效的方法、严谨的逻辑以及对问题的深刻理解。以下是一些可以帮助你实现这一目标的策略: 明确目标 在收集和分析数据之前,先明确你的决策目标是什么…...
webview4/edgewebbrower学习记录——执行js
webview2可执行js方法:WVBrowser1.ExecuteScript(js, 1003) 参数1为js语句,参数2为命令号,执行完毕,会执行 procedure TBrowserFrame.WVBrowser1ExecuteScriptCompleted(Sender: TObject; aErrorCode: HRESULT; const aResultOb…...
Java文件上传解压
目录结构 工具类 枚举 定义文件类型 public enum FileType {// 未知UNKNOWN,// 压缩文件ZIP, RAR, _7Z, TAR, GZ, TAR_GZ, BZ2, TAR_BZ2,// 位图文件BMP, PNG, JPG, JPEG,// 矢量图文件SVG,// 影音文件AVI, MP4, MP3, AAR, OGG, WAV, WAVE}为了避免文件被修改后缀࿰…...
人工智能(AI)与机器学习(ML)基础知识
目录 1. 人工智能与机器学习的核心概念 什么是人工智能(AI)? 什么是机器学习(ML)? 什么是深度学习(DL)? 2. 机器学习的三大类型 (1)监督式学…...
autoware(2)运行自己的数据集
上一节完成了autoware.ai的安装和编译跑通了demo数据集,本将自己录制的数据包用于测试 1.修改点云地图 将加载点云地图的my_map.launch文件复制并命名为my_map_test.launch, (1)point cloud处替代原来的点云地图为自己的&#…...
HBase Java基础操作
Apache HBase 是一个开源的、分布式的、可扩展的大数据存储系统,它基于 Google 的 Bigtable 模型。使用 Java 操作 HBase 通常需要借助 HBase 提供的 Java API。以下是一个基本的示例,展示了如何在 Java 中连接到 HBase 并执行一些基本的操作,…...
巧用观测云可用性监测(云拨测)
前言 做为系统运维或者开发,很多时候我们需要能够实时感知我们所运维的系统和服务的情况,比如以下的场景: 系统上线前测试:包括功能完整性检查,确保页面元素(如图像、视频、脚本等)都能够正常…...
Chrome离线安装包下载
1、问Chrome的官网:https://www.google.cn/chrome/ 直接下载的是在线安装包,安装需要联网。 2、如果需要在无法联网的设备上安装Chrome,需要在上面的地址后面加上?standalone1。 Chrome离线安装包下载地址:https://www.google.c…...
ceph的RBD管理
0 块设备介绍 Ceph 的块设备(Ceph Block Device, RBD)是其存储服务的一种实现形式,通过 librbd 库或 Linux 内核模块提供块设备支持,所以可以与主流云平台(如 OpenStack)、虚拟化平台(如 KVM&a…...
【数论】莫比乌斯函数及其反演
文章目录 一、介绍二、莫比乌斯函数的算法求解三、例题 在学习之前,先来了解一下常见定义吧(OVO): 常见数论函数分为两种: { 完全积性函数:对于任意 p , q ∈ N ,有 f ( p ⋅ q ) f ( p ) ⋅ …...
低音运行,约克VRF中央空调让居家生活静享安宁
不仅节能省电,约克VRF中央空调还特别注重运行的静音效果,低至17dB超低运行噪音,让你在享受舒适环境的同时,也能拥有宁静的居家氛围。无论是工作、学习还是休息,都不受噪音干扰。...
使用 Ansys LS-DYNA 进行玻璃瓶包装跌落分析
使用 Ansys LS-DYNA 进行玻璃瓶包装跌落分析 玻璃瓶包装跌落分析 使用两个玻璃瓶,其中一个为纸盒包装,用来演示包装效果。 Johnson–Holmquist 损伤模型用于玻璃 (MAT_JOHNSON_HOLMQUIST_CERAMICS)纸箱包装采用各向同性弹性材料模型。瓶子将从 300 毫米…...
Windows系统编程 - 进程遍历
文章目录 前言进程的遍历CreateToolhelp32SnapshotProcess32FirstProcess32Next进程遍历 总结 前言 各位师傅好,我是qmx_07,今天给大家讲解进程遍历的相关知识点 进程的遍历 快照:使用vmware虚拟机的时候,经常需要配置环境服务…...
【电路笔记 TMS320F28335DSP】时钟+看门狗+相关寄存器(功能模块使能、时钟频率配置、看门狗配置)
时钟源和主时钟(SYSCLKOUT) 外部晶振:通常使用外部晶振(如 20 MHz)作为主要时钟源。内部振荡器:还可以选择内部振荡器(INTOSC1 和 INTOSC2),适合无需高精度外部时钟的应…...
gt730是什么显卡?gt730显卡性能参数介绍
NVIDIA GeForce GT 730是一款入门级图形卡,于2014年推出,基于40纳米工艺和GF108图形处理器。尽管它支持DirectX 12,但功能级别仅为11_0,这可能会在新的DirectX 12标题中造成问题。GT 730具有96个着色单元,16个纹理映射…...
Swift内存访问冲突
内存的访问,发生在给变量赋值的时候,或者传递值(给函数)的时候,例如 var one 1//向one的内存区域发起一次写的操作 print("\(one)")//向one的内存区域发起一次读的操作 在 Swift 里,有很多修改…...
2024.6使用 UMLS 集成的基于 CNN 的文本索引增强医学图像检索
Enhancing Medical Image Retrieval with UMLS-Integrated CNN-Based Text Indexing 问题 医疗图像检索中,图像与相关文本的一致性问题,如患者有病症但影像可能无明显异常,影响图像检索系统准确性。传统的基于文本的医学图像检索࿰…...
力扣刷题--21.合并两个有序链表
I am the best !!! 题目描述 将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示例 1: 输入:l1 [1,2,4], l2 [1,3,4] 输出:[1,1,2,3,4,4] 示例 2…...
Diving into the STM32 HAL-----DAC笔记
根据所使用的系列和封装,STM32微控制器通常只提供一个具有一个或两个专用输出的DAC,除了STM32F3系列中的少数零件编号实现两个DAC,第一个具有两个输出,另一个只有一个输出。STM32G4 系列的一些较新的 MCU 甚至提供多达 5 个独立的…...
每日一题 LCR 078. 合并 K 个升序链表
LCR 078. 合并 K 个升序链表 使用二分法就可以解决 class Solution { public:ListNode* mergeKLists(vector<ListNode*>& lists) {int n lists.size();if(n 0){return nullptr;}ListNode* ans ;ans binMerge(lists,0,n-1);return ans;}ListNode* binMerge(vector…...
如何在分布式环境中实现高可靠性分布式锁
目录 一、简单了解分布式锁 (一)分布式锁:应对分布式环境的同步挑战 (二)分布式锁的实现方式 (三)分布式锁的使用场景 (四)分布式锁需满足的特点 二、Redis 实现分…...
如何利用java爬虫获得淘宝商品评论
在当今数字化时代,数据的价值日益凸显,尤其是对于电商平台而言,商品评论作为用户反馈的重要载体,蕴含着丰富的信息。本文将详细介绍如何利用Java爬虫技术获取淘宝商品评论,包括代码示例和关键步骤解析。 淘宝商品评论的…...
SQLAlchemy,ORM的Python标杆!
嗨,Python的小伙伴们!今天咱们来了解 SQLAlchemy,这可是对象关系映射(ORM)里的超级标杆哦!它就像一座神奇的桥梁,能让我们用 Python 代码轻松地和数据库打交道,不用写复杂的 SQL 语句…...
时序论文23|ICML24谷歌开源零样本时序大模型TimesFM
论文标题:A DECODER - ONLY FOUNDATION MODEL FOR TIME - SERIES FORECASTING 论文链接:https://arxiv.org/abs/2310.10688 论文链接:https://github.com/google-research/timesfm 前言 谷歌这篇时间序列大模型很早之前就在关注ÿ…...
java http body的格式 application/x-www-form-urlencoded不支持文件上传
在Java中,HTTP请求的body部分可以包含多种格式的数据,主要包括以下几种: application/x-www-form-urlencoded:这种格式将数据编码成键值对的形式,键和值都进行了URL编码,键值对之间用&符号连接。…...
【头歌实训:利用kmp算法求子串在主串中不重叠出现的次数】
头歌实训:利用kmp算法求子串在主串中不重叠出现的次数 文章目录 任务描述编程要求测试说明输入格式输出格式样例输入1样例输出1样例输入2样例输出2 源代码: 任务描述 本关任务:编写一个程序,利用kmp算法求子串在主串中不重叠出现…...
WPF动画
在 WPF(Windows Presentation Foundation)中,主要有两种类型的动画:属性动画(Property Animation)和关键帧动画(Key - Frame Animation)。属性动画用于简单地从一个起始值平滑地过渡…...
Kafka 分区分配及再平衡策略深度解析与消费者事务和数据积压的简单介绍
Kafka:分布式消息系统的核心原理与安装部署-CSDN博客 自定义 Kafka 脚本 kf-use.sh 的解析与功能与应用示例-CSDN博客 Kafka 生产者全面解析:从基础原理到高级实践-CSDN博客 Kafka 生产者优化与数据处理经验-CSDN博客 Kafka 工作流程解析:…...
如何在 UniApp 中实现 iOS 版本更新检测
随着移动应用的不断发展,保持应用程序的更新是必不可少的,这样用户才能获得更好的体验。本文将帮助你在 UniApp 中实现 iOS 版的版本更新检测和提示,适合刚入行的小白。我们将分步骤进行说明,每一步所需的代码及其解释都会一一列出…...
Android 14.0 kenel中修改rom系统内部存储的大小
1. 前言 在14.0的系统rom产品开发定制中,在对一些产品开发中的配置需求方面,由于在产品后续订单中,有些产品是出口的,但是硬件方面已经定板,时间比较仓促,所以 就需要软件方面在rom内部存储的大小方面作假,修改rom真实的大小容量,所以就需要在kenel驱动部分来修改这部分…...
JavaScript 函数
JavaScript中也可以使用函数,但是使用的方法有些不同;需要使用function关键字定义一个函数(或者使用匿名函数或者箭头函数)。但是需要特别注意的是:在类中定义函数时,一定不可以使用箭头函数,因…...
js+new Date()+moment+时区
文章目录 概要一、Date对象基础知识1. 创建Date对象2. 获取日期和时间信息3. 设置日期和时间 二、Date对象的应用1. 日期格式化2. 时间差计算3. 倒计时功能 moment.jsmoment 常见场景应用时区差别亚洲欧洲美洲大洋洲 时区时间说明 概要 一、Date对象基础知识 1. 创建Date对象…...
OpenCV、YOLO、VOC、COCO之间的关系和区别
OpenCV、YOLO、COCO 和 VOC 是计算机视觉和深度学习领域常见的几个名词,它们分别代表不同的工具、算法和数据集,之间有一些联系和区别。下面分别说明它们的定义、用途以及相互关系。 1. OpenCV(Open Source Computer Vision Library…...
迁移学习理论与应用
迁移学习(Transfer Learning)是一种机器学习技术,旨在将一个任务(源任务)上学到的知识迁移到另一个相关但不完全相同的任务(目标任务)上,从而提高目标任务的学习效果。这种方法的核心…...
Python-简单病毒程序合集(一)
前言:简单又有趣的Python恶搞代码,往往能给我们枯燥无味的生活带来一点乐趣,激发我们对编程的最原始的热爱。那么话不多说,我们直接开始今天的编程之路。 编程思路:本次我们将会用到os,paltform,threading,ctypes,sys,…...
AI安全:从现实关切到未来展望
近年来,人工智能技术飞速发展,从简单的图像识别到生成对话,从自动驾驶到医疗诊断,AI技术正深刻改变着我们的生活。然而,伴随着这些进步,AI的安全性和可控性问题也日益凸显。这不仅涉及技术层面的挑战&#…...
集成金蝶云星空数据至MySQL的完整案例解析
金蝶云星空数据集成到MySQL的技术案例分享 在企业信息化系统中,数据的高效流动和准确同步是确保业务连续性和决策支持的重要环节。本文将聚焦于一个具体的系统对接集成案例——金蝶云星空的数据集成到MySQL,方案名称为“2金蝶物料同步到商城中间表”。 …...
C++格式化输入输出【练习版】
一、引言 在 C 编程中,准确地进行输入输出操作是构建功能强大且用户友好程序的关键。格式化输入输出允许我们以特定的格式展示数据,确保数据的可读性和准确性。本文将深入探讨 C 的格式化输入输出,通过丰富的练习例题和详细的答案解析&#x…...
aws服务(二)机密数据存储
在AWS(Amazon Web Services)中存储机密数据时,安全性和合规性是最重要的考虑因素。AWS 提供了多个服务和工具,帮助用户确保数据的安全性、机密性以及合规性。以下是一些推荐的存储机密数据的AWS服务和最佳实践: 一、A…...
CIO40: 回头再看ERP之“4问”
1、在数字化时代的今天,ERP现在的定位是? ERP软件财务化,我觉得是一个趋势,但是短期内(2-3年)ERP依然是企业的核心系统。这要看企业外部系统的建设情况,ERP系统的使用深度(特别是一些…...
数据库类型介绍
1. 关系型数据库(Relational Database, RDBMS): • 定义:基于关系模型(即表格)存储数据,数据之间通过外键等关系相互关联。 • 特点:支持复杂的SQL查询,数据一致性和完整…...
深入理解 Spring Boot 的 CommandLineRunner 原理及使用
引言 在开发 Spring Boot 应用程序时,我们经常需要在应用程序启动后执行一些初始化任务,比如加载初始数据、连接外部服务、执行健康检查等。Spring Boot 提供了 CommandLineRunner 接口,使得这些任务的实现变得非常简单和直观。本文将深入探…...
人工智能深度学习-Torch框架-数学运算
数学的基本操作 1.floor:向下取整 2.celi:向上取整 3.round:四舍五入,这里的四舍五入还要看前面整数的奇偶性,基进偶不进 4.trunc:只保留整数 5.frac:只保留小数部分 6.fix:向…...
操作系统的理解
目录 一、冯伊诺曼体系结构 二、操作系统的概念 三、如何理解“管理”? 四、系统调用和库调用的概念 一、冯伊诺曼体系结构 冯伊诺曼体系结构描述的是计算机硬件结构,相当于计算机的骨架。它大体可以分为4部分: 输入设备:键盘…...