03_2440_裸机时钟体系

news/2025/1/3 4:31:18/

总结

这里soc从外界得到外部时钟源,通过硬件的锁相环(PLL)进行加速,
加速完的内部时钟通过分频为三个时钟源 cpu_fclk ahb_hclk apb_pclk
给不同的器件进行使用

soc内部时钟源获取和分类的流程

从datasheet中的第7章,把所有器件的时钟源说明清楚 从外部的时钟源进来
到分发到两个总线上给各种器件进行使用
在这里插入图片描述

高速设备和低速设备,和他们所在的总线上

soc 也就是system on chip, 里面有cpu和各种外设
外设分了两部分挂载在两个总线上
ahb总线 :hight 高速总线 比如lcd控制器,中断控制器,usb控制器
在这里插入图片描述

apb总线:peripheral 外围设备总线 低速设备 i2c,spi等
在这里插入图片描述
上面就有了三个时钟:cpu_fclk ahb_hclk apb_pclk 在datasheet里面能看见三个时钟的最大速率
在这里插入图片描述

外部时钟源的选择

外部时钟源有两个,一种是硬件的时钟源 一种是外部输入时钟
在原理图中,硬件时钟源是一个12Mhz的晶振
![在这里插入图片描述](https://img-blog.csdnimg.cn/67c08b2677194c50a777fc6bc9b8bb62.png在这里插入图片描述

通过一些硬件单元(PLL锁相环)产生上面三种不同内部时钟频率
在这里插入图片描述

根据datasheet 看见外部输入时钟源有两个 一个12M晶振 还有一个外部输入的时钟
通过更改OM引脚的值,修改 PLL索取时钟源的不同
datasheet上描述 有两个PLL,MPLL(main_pll)生产时钟给cpu用,UPLL生产时钟给usb用
在这里插入图片描述
OM3和OM2在下面图上都接地,根据datasheet,表示用硬件晶振12M作为时钟源
在这里插入图片描述

输出时钟频率的选择

外部晶振进入后,到MPLL控制 PMS三个参数选择输出时钟的频率
在这里插入图片描述

最后的分频

MPLL后得到时钟频率放入clkcntrl里面,直接作为FCLK传给cpu
经过HDIVN分频,得到HCLK,经过AHB总线传给各种高速设备
经过PDIVN分频,得到DPIVN,传给APB总线各种低速外设
在这里插入图片描述

cpu在软件上获得时钟的时序

先看设置时序

还是在datasheet上进行搜索 下面这个图显示了 开机重置序列过程中的时钟行为。
根据图中分了几个部分
1.电源power上拉后,nreset等待电源稳定才输出高电平
2.刚开始时,fclk等于硬件的晶振12M
3.PLL锁存OM32的引脚的值
4.设置PLL的值,根据图中lock_time拉高,时钟disalble 同时FCLK停止,cpu停止
5.FCLK等于PLL输出的时钟,cpu重新运行

在这里插入图片描述

寄存器分析

根据上面的步骤,继续在datasheet上面搜索,需要配置的寄存器

参考表中的输入频率是12MHZ的时候需要输出的频率为400MHZ 这时候配置流程图中的MPLL
给MPLLCPM寄存器写 mdiv位0x5c pdiv位0x01 sdiv位0x01 配置输出400Mhz的时钟
如果不想用参考的值,可以根据公式自己进行计算拿取想要的MPLL输出参数
在这里插入图片描述
在这里插入图片描述
设置寄存器clkcon 控制哪些外设时钟需要使能,哪些不需要
在这里插入图片描述
设置HDIVN寄存器 让CPU时钟进行分配 分为HCLK和PCLK时钟
在这里插入图片描述
根据流程图上面说的,只要控制 HDIVN才能去把FCLK 分配为 HCLK和PCKLK
翻找datasheet ->determined by HDIVN and PDIVN of CLKDIVN control register.
因为被定义在 CLKDIVN 寄存器 下面就是配置CLKDIVN 这个寄存器
在这里插入图片描述在这里插入图片描述


http://www.ppmy.cn/news/37410.html

相关文章

Linux RepoSync将yum存储库同步到本地目录

当同步开始时,RepoSync下载存储库的索引,并将它们与开始时为空的当前索引进行比较,它为每个新的、删除的或修改的包或索引创建一个操作。它每次下载一个包以减少存储需求,对其进行验证,然后将它写入目标存储库。该过程…

【MySQL】解决字符集编码问题

文章目录前言方法1:在创建数据库时,指定字符集方法2: 更改MySQL的配置文件前言 MySQL的默认编码方式是 拉丁文,如果想要设置一些汉字的数据.可能会报错.分享一下我解决这个问题时的方法.1. 在创建数据库时,指定字符集 2.更改MySQL的配置文件. 方法1:在创建数据库时,指定字符集…

Java每日一练(20230403)

目录 1. 字母异位词分组 🌟🌟 2. 删除链表的倒数第 N 个结点 🌟🌟 3. 合并区间 🌟🌟 🌟 每日一练刷题专栏 🌟 Golang每日一练 专栏 Python每日一练 专栏 C/C每日一练 专栏…

第13章_约束

第13章_约束 🏠个人主页:shark-Gao 🧑个人简介:大家好,我是shark-Gao,一个想要与大家共同进步的男人😉😉 🎉目前状况:23届毕业生,目前在某公司…

C++语言基础——函数(详解)

目录 函数是什么 函数的定义 主函数举例 空函数 函数的调用 语法格式 举例说明:计算x的n次方 递归 递归的主要点 递归的结构 条件 递归使用的场景 函数是什么 函数全名叫计算机函数,它可以帮助你完成一些特定的程序。你可以把它简单理解成一把…

03.时间和空间复杂度

1. 算法效率 算法效率分析分为两种:第一种是时间效率,第二种是空间效率。时间效率被称为时间复杂度,而空间效率被称作 空间复杂度。 时间复杂度主要衡量的是一个算法的运行速度,而空间复杂度主要衡量一个算法所需要的额外空间&am…

《SpringBoot》第03章 自动配置机制(二) 根注解@SpringBootApplication

前言 之前介绍到了把启动类封装成BeanDefinition注入进IOC容器,那么这个启动类就会跟普通的bean一样在refresh()中被实例化,那么显而易见作为启动类这个实例化并不简单,肯定会存在一些特殊处理,那么就需要研究一下其注解SpringBo…

QT Qwidget 事件处理机制

qlineEdit Qt事件处理是指在Qt应用程序中处理各种事件的过程。事件是指在应用程序中发生的各种操作,例如按键、鼠标点击、窗口移动等。Qt提供了一个事件处理机制,使得开发者可以对这些事件进行处理,以实现应用程序的各种功能。 Qt中的事件处…