【裸机开发】指定外设根时钟配置实验(三)—— 寄存器分析篇(PERCLK_CLK_ROOT、IPG_CLK_ROOT)

news/2025/2/4 2:45:28/

前面已经完成了 PLL1 和 8 路 PFD 的初始化,至于其他 PLL 路,等实际需要的时候再初始化也不迟。接下来我们就挑选几个具体的外设时钟进行配置。

假设我们要初始化下面两个根时钟PERCLK_CLK_ROOTIPG_CLK_ROOT。(中途可能还涉及到根时钟 AHB_CLK_ROOT


目录

一、路线选择

1、PERCLK_CLK_ROOT 路线分析

2、IPG_CLK_ROOT 路线分析

3、AHB_CLK_ROOT 路线分析

二、寄存器分析

1、AHB_CLK_ROOT 路线寄存器分析

(1) CBCMR 寄存器的 PRE_PERIPH_CLK_SEL 位

(2) CBCDR 寄存器的 PERIPH_CLK_SEL 位

(3) 总结

2、IPG_CLK_ROOT 路线寄存器分析

3、PERCLK_CLK_ROOT 路线寄存器分析


一、路线选择

1、PERCLK_CLK_ROOT 路线分析

PERCLK_CLK_ROOT 的时钟来源有两个,一个是直接来自于晶振 OSC,一个是来自于 IPG_CLK_ROOT。选择哪一个由 CSCMR1 寄存器的 PERCLK_CLK_SEL 位决定,分频数由 PERCLK_PODF 位来决定。(我们实际进行的是“选择2”)

配置步骤如下:

  • 第一步,设置 CSCMR1 寄存器的 PERCLK_CLK_SEL 位,选择时钟源 IPG_CLK_ROOT
  • 第二步,设置 CSCMR1 寄存器的 PERCLK_PODF 位,设置成 1 分频

2、IPG_CLK_ROOT 路线分析

IPG_CLK_ROOT 的时钟源只有一个,来自于上面的 AHB_CLK_ROOT,一环扣一环,所以接下来的关键就是分析 AHB_CLK_ROOT 的时钟来源。

配置步骤如下:

  • 只需要设置 CBCDR 寄存器的 IPG_PODF 位,设置成 2 分频

3、AHB_CLK_ROOT 路线分析

按照箭头顺序,配置步骤如下:

  • 设置 CBCMR 寄存器的 PRE_PERIPH_CLK_SEL 位,选择 PLL2_PFD2 时钟源
  • 设置 CBCDR 寄存器的 PERIPH_CLK_SEL 位,选择下面那条路线

注意:原本要设置 CBCDR 的 AHB_PODF 位,虽然这里 CBCDR 写的是 4 分频,但是内部 boot rom已初始化成了 3 分频,所以这一步就无需做

二、寄存器分析

1、AHB_CLK_ROOT 路线寄存器分析

这一步要做的是:

  • 设置 CBCMR 寄存器的 PRE_PERIPH_CLK_SEL 位,选择 PLL2_PFD2 时钟源
  • 设置 CBCDR 寄存器的 PERIPH_CLK_SEL 位,设为 0

(1) CBCMR 寄存器的 PRE_PERIPH_CLK_SEL 位

我们先找到 CBCMR 寄存器的 PRE_PERIPH_CLK_SEL 位,设为 01。

(2) CBCDR 寄存器的 PERIPH_CLK_SEL 位

然后是 CBCDR 寄存器的 PERIPH_CLK_SEL 位,设为 0。这里需要搭配总线设计图来看(在第18章的functional description)

我们还需要注意到 PERIPH_CLK_SEL 位的第二个提示信息(NOTE),无论哪个选择都会涉及与MMDC的握手,这个需要参考 CCDR CDHIPR 寄存器的 handshake bypass 和 busy字段。

CCDR 的  MMDC_CH0_ MASK

凡是涉及 mmdc_ch0_axi_podf 字段或者 periph_clk_sel 字段的变化,都需要修改下面这个字段,是允许握手还是屏蔽握手。很显然选择允许,MMDC_CH0_ MASK 位 设为 0。

 CDHIPR 的 PERIPH_CLK_ SEL_BUSY

判断 PERIPH_CLK_SEL 是否在处理其他选择器的选择事件。

  • 0:如果处于空闲状态,便可以处理 CBCDR 寄存器的 PERIPH_CLK_SEL 位的选择
  • 1:如果处于忙线状态,说明需要先等待上一个选择器的占用结束

(3) 总结

寄存器: CCM_CBCMR
基地址: 0x20C4018
初始化操作:CCM_CBCMR &= ~(3 << 18);    // 19-18 位清零CCM_CBCMR |= (1 << 18);     // 19-18 设为01/** 在操作CCM_CBCDR之前需要做两步:*     1、允许和MMDC握手               —— CCDR 寄存器*     2、检查 PERIPH_CLK_SEL 是否忙线 —— CDHIPR 寄存器** 做完上述两步以后才是操作 CCM_CBCDR 寄存器*/
寄存器: CCM_CCDR
基地址: 0x20C4004
初始化操作:CCM_CCDR &= ~(1 << 17);    // 第 17 位置0寄存器: CCM_CDHIPR
基地址: 0x20C4048
初始化操作:while((CCM_CDHIPR >> 5) & 0x01 != 0);    // 为 0 时表示空闲,跳出循环寄存器: CCM_CBCDR
基地址: 0x20C4014
初始化操作:CCM_CBCDR &= ~(1 << 25);            // 第 25 位设为0

2、IPG_CLK_ROOT 路线寄存器分析

这一步比较简单,只需要找到 CBCDR 寄存器的 IPG_PODF 位,设置成 2 分频

寄存器: CCM_CBCDR
基地址: 0x20C4014
初始化操作:CCM_CBCDR &= ~(3 << 8);    // 9-8 位清零CCM_CBCDR |= (1 << 8);     // 9-8 设为01

3、PERCLK_CLK_ROOT 路线寄存器分析

这一步要做的是:

  • 第一步,设置 CSCMR1 寄存器的 PERCLK_CLK_SEL 位,选择时钟源 IPG_CLK_ROOT
  • 第二步,设置 CSCMR1 寄存器的 PERCLK_PODF 位,设置成 1 分频

寄存器: CCM_CSCMR1
基地址: 0x20C401C
初始化操作:CCM_CSCMR1 &= ~(0x7F);    // 6-0 位清零

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

相关文章

【Qt】Ubuntu安装GCC9.3.0版本的Qt5.15.5

目录 一、安装GCC9.3.0 1.下载GCC9.3.0源码 2.获取依赖项的包 3.生成Makefile文件 4.编译并安装 5.生成软链接 6. 查看GCC版本 二、安装Qt 1.下载Qt安装包 2.创建Qt项目并运行 一、安装GCC9.3.0 1.下载GCC9.3.0源码 https://ftp.gnu.org/gnu/gcc/gcc-9.3.0/gcc-9.3…

电商人看过来,这个 AI 工具可以一键生成商品背景图

在2023年&#xff0c;如果你还不会玩AI&#xff0c;那你就out了。如果AI只是作为娱乐的话&#xff0c;学起来还是挺费劲的&#xff0c;但是如何将AI嵌入到我们的工作流程中&#xff0c;从而提升工作效率&#xff0c;这很重要。 于是&#xff0c;经过小编一个下午的疯狂测试&am…

AI+低代码:开发革命的崭新纪元!带你一文速通了解

信息技术、通信技术和计算能力的迅速发展&#xff0c;AI技术在诸多领域中掀起了一股革命浪潮&#xff0c;成为推动社会进步和发展的重要力量&#xff0c;也是许多国家和企业日益重视和投资的方向。 而全球化和技术革新的深入推进&#xff0c;传统产业对劳动力的需求逐渐减少&am…

【涨粉秘籍】如何快速涨粉并转化为铁粉。

如何快速涨粉并转化为铁粉。 前言在这一百天里&#xff0c;我在csdn获得了什么如何100天涨粉一万参加新星计划发布优质文章 什么是铁粉如何快速转化粉丝为铁粉多与读者互动鼓励读者也创作高质量的内容 后记 &#x1f3d8;️&#x1f3d8;️个人简介&#xff1a;以山河作礼。 &a…

中国电子学会2023年05月份青少年软件编程C++等级考试试卷一级真题(含答案)

1. 输出第二个整数 输入三个整数&#xff0c;把第二个输入的整数输出。 时间限制&#xff1a;1000 内存限制&#xff1a;65536 输入 只有一行&#xff0c;共三个整数&#xff0c;整数之间由一个空格分隔。整数是32位有符号整数。 输出 只有一行&#xff0c;一个整数&#xff0…

网页版愤怒的小鸟Angry Birds

如果你用Chrome或者Firefox&#xff0c;玩儿在线版愤怒的小鸟吧。 http://chrome.angrybirds.com/ 作者&#xff1a; 峻祁连 邮箱&#xff1a;junqilian163.com 出处&#xff1a; http://junqilian.cnblogs.com 转载请保留此信息。 本文转自峻祁连. Moving to Cloud/Mobile博…

C++实现愤怒小鸟小游戏

C低配版愤怒小鸟小游戏&#xff08;转载&#xff09; 相信大家都玩过愤怒小鸟 如果还想玩玩的话 就试下这个代码吧 #include <bits/stdc.h> #include <windows.h> #include <stdio.h> #include <conio.h> #include <time.h> using namespace st…

《游戏学习》java代码实现《愤怒的小鸟》实战源码

项目代码结构目录 部分代码展示 import javax.swing.ImageIcon; import org.jbox2d.collision.shapes.CircleShape; import org.jbox2d.common.Vec2; import org.jbox2d.dynamics.Body; import org.jbox2d.dynamics.World;/**** author tarzan*/ public class AngryBirdsModel …