15:【stm32】时钟树

ops/2024/9/20 3:55:13/ 标签: stm32, 嵌入式硬件, 单片机

时钟树

  • 1、时钟树
    • 1.1:简要的介绍
    • 1.2:基本结构
      • 1.2.1:stm32的内部结构
      • 1.2.2:树的关键节点
      • 1.2.3:系统时钟的来源
  • 2、RCC标准库编程
    • 2.1:片上外设的复位与释放
    • 2.2:时钟系统配置
    • 2.3:时钟树的初始状态
    • 2.4:配置CPU的频率
      • 2.4.1设置Flash参数
      • 2.4.2:配置时钟树

1、时钟树

1.1:简要的介绍

   由我们前面写的的代码可知,我们每次使用片上外设都需要先打开片上外设的时钟,这样才能使用片上外设。如下图所示。

在这里插入图片描述
在这里插入图片描述

那么为什么会是这样喃?
   我们查看一下时钟树的样子:如下图所示:左边的是时钟大树,右边的是时钟小树。如图:APB2/APB2/AHB分配器上面都连接的不同的片上外设,在使用某个片上外设是,我们打开连接的分频器,然后给他提供被处理过的脉冲波形。

在这里插入图片描述

1.2:基本结构

  • 小树:
    ①RTC:实时的计数器,就像是一个手表,记录当前的世界时间
    ②IWGD:独立看门狗
    ③他们由低频率的晶振(LSI(内部晶振)/LSE(外部晶振))提供频率,一般是32.768kHz的晶振,然后通过2^15分配后,得到1Hz的频率。

  • 大树
    ①HSI和HSE是高频率晶振:HSI是内部晶振,一般为8MHzHSE是外部晶振,一般为4~16MHz。我们最小系统板上面的外部晶振是8MHz。
    ②锁相环PLL:是一个倍频器,倍率一般为2~16。
    ③AHB/APB1/APB2:都是分频器,对频率做除法。AHB(1~512),APB1/APB2(1~16)

  • 分频的实现:
    通过计数器,比较器来实现的。

在这里插入图片描述如图:想要分频率的频率脉冲连接计数器,作为输入信号。当计数器从1开始计数,数值和计数周期通过比较器相较,如果计数值 > 计数周期时,比较器输出一个脉冲,计数值归0,重新开始计数。

如上图所示:计数周期为7,输入脉冲输入了8个脉冲,比较器才输出1个脉冲,实现8分频

stm32_41">1.2.1:stm32的内部结构

在这里插入图片描述
在这里插入图片描述

1.2.2:树的关键节点

在这里插入图片描述

1.2.3:系统时钟的来源

在这里插入图片描述

2、RCC标准库编程

RCC也是stm32内部的一个片上外设,①它负责控制芯片的复位,②负责对时钟系统的配置

2.1:片上外设的复位与释放

在使用片上外设之前,最好是对其总线的时钟进行复位和释放。

RCC_APB2PeriphResetCmd(RCC_APB2Periph_USART1,ENABLE);//对APB2总线上USART1进行复位,相当于对里面的所有寄存器数据清除
RCC_APB2PeriphResetCmd(RCC_APB2Periph_USART1,DISABLE);//对APB2总线上USART1进行释放

2.2:时钟系统配置

标准库对时钟系统配置的接口如下图所示:

在这里插入图片描述
在这里插入图片描述

RCC_PLLConfig(uint32_t RCC_PLLSource,uint32_t RCC_PLLMul);//PLL来源的选择,倍率的设定。

在这里插入图片描述

RCC_SYSCLKConfig(uint32_t RCC_SYSCLKSource);//系统时钟来源的选择

在这里插入图片描述

RCC_HCLKConfig(uint32_t RCC_SYSCLK);//对AHB分频器倍率的选择

在这里插入图片描述

2.3:时钟树的初始状态

在这里插入图片描述

但是,当stm32执行代码的时候时:stm32会执行启动文件里面的SystemInit()函数,执行完这个函数后,才去执行用户编写的main()函数里面的代码。

在这里插入图片描述
而SystemInit()函数,就是将时钟树里面频率时钟为最大值。

在这里插入图片描述
在这里插入图片描述

2.4:配置CPU的频率

配置流程图

在这里插入图片描述

2.4.1设置Flash参数

为什么要设置Flash参数喃?
在这里插入图片描述
在这里插入图片描述

  • 指令配置Flash
    先设置指令预取模式,为什么要设置为这个模式喃?因为这样能避免指令的丢失
    在这里插入图片描述
  • 设置对Flash的访问延迟
    为什么需要设置对Flash的访问延迟喃?因为Flash的最大频率为24MHz,当我们要把系统时钟的频率配置为>24MHz的时钟,为了更好的接收到指令,所以需要设置访问延迟。
    在这里插入图片描述

代码①:

#include "stm32f10x.h"int main(void)
{FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);//开启指令预取模式FLASH_SetLatency(FLASH_Latency_2);//我们想要将系统时钟设置为72M,所以等待2个周期while(1){}
}

2.4.2:配置时钟树

  • 开启HSE---->配置锁相环PLL---->配置系统时钟来源SYSCLK----->配置AHB/APB1APB2的系数
    == 默认情况下,HSI是开启的,HSE是关闭的,所以如果我们想要使用HSE时,我们需要开启HSE==
#include "stm32f10x.h"int main(void)
{FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);//开启指令预取模式FLASH_SetLatency(FLASH_Latency_2);//我们想要减系统时钟设置为72M,所以等待2个周期//开启HSERCC_HSEConfig(RCC_HSE_ON);while(RCC_GetFlagStatus(RCC_FLAG_HSERDY) == RESET);//等待HSE开启成功//配置锁相环PLLRCC_PLLConfig(RCC_PLLSource_HSE_Div1,RCC_PLLMul_9);//选择HSE,9倍RCC_PLLCmd(ENABLE);while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET);//等待PLL配置成功//配置系统时钟SYSCLK的来源RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);//选择来自锁相环PLL//配置AHB,APB1,APB2RCC_HCLKConfig(RCC_SYSCLK_Div1);//AHB分频系数为1 72MHzRCC_PCLK1Config(RCC_HCLK_Div2);//APB1分频系数为2 72MHzRCC_PCLK2Config(RCC_HCLK_Div1);//APB2分频系数为1 72MHz//关闭HSIRCC_HSICmd(DISABLE);}

http://www.ppmy.cn/ops/95701.html

相关文章

ElasticSearch的Mapping和DSL语言

ElasticSearch的Mapping和DSL语言 文章目录 ElasticSearch的Mapping和DSL语言mapping(映射)动态映射类型自动识别 静态映射关于后期更改mapping字段类型?重建索引步骤 常用mapping参数配置index_template 和mapping_template Query DSL数据初始化无条件查询&#xf…

Jedis的使用以及Java和redis的连接

一、Jedis 我们要使用 Java 来操作 Redis&#xff0c;什么是Jedis 是 Redis 官方推荐的 java连接开发工具&#xff01; 使用Java 操作 Redis 中间件&#xff01; 1、导入对应的依赖 <!--导入jedis的包--> <dependencies><!-- https://mvnrepository.com/artif…

haproxy实验

基本介绍 http://t.csdnimg.cn/Z64QVhttp://t.csdnimg.cn/Z64QV 实验环境 功能IP客户端172.25.254.233haproxy eth0:172.25.254.100 eth1:192.168.0.10 rs1eth0:192.168.0.101rs2eth0:192.168.0.102 安装haproxy yum install haproxy -y 多进程和多线程 vim /etc/hap…

关于xilinx的FFTIP的使用和仿真

工具&#xff1a;vivado2018.3&#xff0c;modelsim10.6d 场景&#xff1a;在进行数据进行频谱分析的时候&#xff0c;使用FPGA来完成FFT的计算可以加快数据的计算速度。 下面使用仿真完成DDS产生的数据的FFT以及IFFT。原始数据使用DDSIP产生&#xff0c;通过IP产生的波形数据…

一次不严谨的C++、C、Pascal、Rust等对比

起因 现在ACM用得多的基本上就两种语言&#xff0c;C和Python3&#xff0c;还有部分Java&#xff0c;但是当年ACM必学的Pascal、新近流行的rust也有人用&#xff0c;只不过用户很少。 就以一道codeforce上的算法小题为样本&#xff0c;来对比一样用户数量、执行效率、易写程度…

浙大数据结构慕课课后题(06-图3 六度空间)

题目要求&#xff1a; 输入格式: 输入第1行给出两个正整数&#xff0c;分别表示社交网络图的结点数N&#xff08;1<N≤103&#xff0c;表示人数&#xff09;、边数M&#xff08;≤33N&#xff0c;表示社交关系数&#xff09;。随后的M行对应M条边&#xff0c;每行给出一对正…

【LeetCode】无重复字符的最长子串

给定一个字符串 s &#xff0c;请你找出其中不含有重复字符的最长子串的长度。 示例 1: 输入: s “abcabcbb” 输出: 3 解释: 因为无重复字符的最长子串是 “abc”&#xff0c;所以其长度为 3。 示例 2: 输入: s “bbbbb” 输出: 1 解释: 因为无重复字符的最长子串是 “b”&…

截屏工具:PixPin

省流&#xff1a;使用 PixPin 截图&#xff0c;设置格式为 JPG。 ‍ 一、介绍 PixPin ‍ 一个好用的截图工具。 官网&#xff1a;https://pixpinapp.com/ ​​ ‍ 支持功能&#xff1a; 截图。支持界面元素识别&#xff0c;支持 CtrlC​ 复制到剪贴板&#xff0c;Ctrl…

docker做Llm开发时可能会遇到的问题

如果没有开启GPU&#xff0c;会报错 docker: Error response from daemon: could not select device driver "" with capabilities: [[gpu]]. 原因可能是 &#xff1a;没有安装 GPU Docker 运行时 则按照如下参照安装&#xff0c; 基于 Docker 的深度学习环境&…

【数据结构与算法】选择排序

选择排序目录 一.问题引入二.图解三.具体实现四.每次找最小值实现五.完整代码 一.问题引入 假设我们想要将此排序按从小到大,那么我们可以怎么排呢? 我们可以每次从里面选择最大的,放在最后面,继续选剩下的最大的放在刚刚放在最后面的前面一个. 每次选择最小的放在前面也是同样…

57qi5rW35LqRZUhS pc.mob SQL注入漏洞复现

0x01 产品简介 57qi5rW35LqRZUhS是大中型企业广泛采用人力资源管理系统。某云是国内顶尖的HR软件供应商,是新一代eHR系统的领导者。 0x02 漏洞概述 57qi5rW35LqRZUhS pc.mob 接口存在SQL注入漏洞,未经身份验证的远程攻击者除了可以利用 SQL 注入漏洞获取数据库中的信息(例…

政务大数据解决方案(六)

政务大数据解决方案通过构建全面的数据集成平台&#xff0c;将来自不同政府部门和公共服务领域的多维度数据汇聚起来&#xff0c;运用先进的数据分析和人工智能技术进行深度挖掘与预测&#xff0c;从而为政府提供实时、精准的信息支持&#xff0c;优化决策流程&#xff0c;提高…

JDBC连接Mysql

一、JDBC实战技术 1.1JDBC概念 JDBC&#xff08;Java DataBase Connectivity&#xff1a;java数据库连接&#xff09;是一种用于执行SQL语句的Java API&#xff0c;可以为多种关系型数据库提供统一访问&#xff0c;它是由一组用Java语言编写的类和接口组成的。JDBC的作用&…

C语言—函数递归

一、递归概念 递归其实是⼀种解决问题的⽅法&#xff0c;在C语⾔中&#xff0c;递归就是函数⾃⼰调⽤⾃⼰。下面举一个例子&#xff1a; 上述就是⼀个简单的递归程序&#xff0c;只不过上⾯的递归只是为了演⽰递归的基本形式&#xff0c;不是为了解决问题&#xff0c;代码最终…

gitlab设置中文

Centos7&#xff08;最小化&#xff09;系统安装部署私人gitlab远程仓库-CSDN博客 目录 登录gitlab 点击edit profile 点击preferences&#xff08;偏好&#xff0c;爱好&#xff09;&#xff0c; 下滑找到Localization&#xff08;本地&#xff09; 点击language&#xf…

redis五种数据结构以及一些基本操作

Redis 支持五种基本的数据结构&#xff0c;这些数据结构使得 Redis 能够灵活应用于各种场景。 字符串&#xff08;Strings&#xff09; 是 Redis 中最基本的数据类型&#xff0c;可以被理解为简单的 key-value 对&#xff0c;其中 value 是字符串。字符串类型的数据可以是任何…

为什么要有二级指针

提示&#xff1a;文章 文章目录 前言一、背景二、 2.1 2.2 总结 前言 前期疑问&#xff1a; 本文目标&#xff1a; 一、背景 之前一直疑问为什么要有二级指针&#xff0c;一直没有写这个帖子&#xff0c;今天整理了一下&#xff0c;收获颇丰 二、 2.1 // 增加对二级指针…

数据可视化之旅,从数据洞察到图表呈现,可视化的产品设计

图表作为数据可视化的重要工具&#xff0c;是对原始数据进行深度加工与解读的有效手段&#xff0c;它助力我们洞悉数据背后的真相&#xff0c;使我们能更好地适应这个由数据驱动的世界。无论是工作汇报、项目实施、产品设计、后台界面还是数据大屏展示&#xff0c;图表都扮演着…

【学习笔记】Day 16

一、进度概述 1、ddnet_main 相关代码学习 二、详情 今天的主要内容是逐句分析 ddnet_main 相关代码&#xff0c;暂未完成&#xff0c;具体整理见明天的笔记。 在阅读代码的过程中&#xff0c;发现自己的 Python 相关代码能力还有些弱&#xff0c;很多语法&#xff0c;用法上的…

已解决ArkTS开发webview,html页面中的input和按钮等操作均无响应

在使用 ArkTS 开发 HarmonyOS 应用时&#xff0c;如果遇到 WebView 中的 HTML 页面元素&#xff08;如 input 输入框和 button 按钮&#xff09;无法响应操作的情况&#xff0c;通常与 WebView 的配置或权限设置有关。以下是常见的原因和解决方法。 1. 启用交互权限 确保你的…