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

这篇具有很好参考价值的文章主要介绍了【裸机开发】指定外设根时钟配置实验(三)—— 寄存器分析篇(PERCLK_CLK_ROOT、IPG_CLK_ROOT)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

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

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

【裸机开发】指定外设根时钟配置实验(三)—— 寄存器分析篇(PERCLK_CLK_ROOT、IPG_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 分频

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

2、IPG_CLK_ROOT 路线分析

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

配置步骤如下:

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

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

3、AHB_CLK_ROOT 路线分析

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

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

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

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

二、寄存器分析

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。

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

(2) CBCDR 寄存器的 PERIPH_CLK_SEL 位

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

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

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

我们还需要注意到 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。

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

 CDHIPR 的 PERIPH_CLK_ SEL_BUSY

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

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

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

(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 分频

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

寄存器: 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 分频

【裸机开发】指定外设根时钟配置实验(三)—— 寄存器分析篇(PERCLK_CLK_ROOT、IPG_CLK_ROOT)文章来源地址https://www.toymoban.com/news/detail-482344.html

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

到了这里,关于【裸机开发】指定外设根时钟配置实验(三)—— 寄存器分析篇(PERCLK_CLK_ROOT、IPG_CLK_ROOT)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • STM32的以太网外设+PHY(LAN8720)使用详解(3):PHY寄存器详解

    前面介绍到,站管理接口(SMI)允许应用程序通过2线时钟和数据线访问任意PHY寄存器,同时该接口支持访问最多32个PHY,也就是说PHY地址共有5位。 应用程序可以从32个PHY中选择一个PHY,然后从任意PHY包含的32个寄存器中选择一个寄存器,发送控制数据或接收状态信息。任意给

    2024年02月03日
    浏览(47)
  • 【STM32】读写BKP备份寄存器&RTC实时时钟

    目录 BKP BKP简介 BKP基本结构 BKP测试代码 RTC RTC简介 RTC框图 RTC基本结构 硬件电路 RTC操作注意事项 接线图 初始化 使用BKP解决只初始化一次时间  初始化参考代码 RTC设置时间 RTC读取时间 完整代码 MyRTC.c MyRTC.h main.c BKP(Backup Registers)备份寄存器 BKP可用于存储用户应用程序数据

    2024年04月22日
    浏览(47)
  • STM32萌新学习日志——用GPIO外设寄存器输出点亮LED对比库函数点亮LED——谈学习感悟

            本周学习STM32单片机,由于之前学过51单片机,为了便于切入,先学习了寄存器点亮LED灯的方法,整体思路与51单片机相似。在基本掌握后,尝试自己构建库函数雏形,过程比较困难,后面开始借鉴野火官方库函数。         这里其实建议大家在学会构建库函数后

    2024年03月17日
    浏览(93)
  • 【正点原子STM32】RTC实时时钟(RTC方案、BCD码、时间戳、RTC相关寄存器和HAL库驱动、RTC基本配置步骤、RTC基本驱动步骤、时间设置和读取、RTC闹钟配置和RTC周期性自动唤醒配置)

    一、RTC简介 二、STM32 RTC框图介绍 2.1、STM32 F1 RTC结构框图 2.2、STM32 F4 / F7 / H7 RTC结构框图 三、RTC相关寄存器介绍 3.1、RTC基本配置步骤 3.2、RTC相关寄存器(F1) 3.3、RTC相关寄存器(F4 / F7 / H7) 四、RTC相关HAL库驱动介绍 4.1、RTC相关HAL库驱动(F1) 4.2、RTC相关HAL库驱动(F4 / F7 /

    2024年03月27日
    浏览(67)
  • 【寄存器实验】

    一、实验目的 1.熟悉通用寄存器的数据通路。 2.了解通用寄存器的构成和运用。 二、实验要求 掌握通用寄存器R3~R0的读写操作。 三、实验原理 实验中所用的通用寄存器数据通路如下图所示。由四片8位字长的74LS574组成R1 R0(CX)、R3 R2(DX)通用寄存器组。图中X2 X1 X0定义输出

    2024年01月18日
    浏览(38)
  • 计算机组成原理实验——二、寄存器实验

    1.掌握寄存器堆的工作原理和接口。 2.掌握寄存器堆的实现方法。 3.掌握寄存器堆在微处理器中承担的功能。 设计一32*32bit 的寄存器文件,即32 个 32 位的寄存器文件(寄存器组) –具备两组读端口及一组写端口; –通过读端口可从0~31 号的任意地址读取 数据; –通过写端口可

    2024年02月06日
    浏览(46)
  • STM32CubeMX教程10 RTC 实时时钟 - 周期唤醒、闹钟A/B事件和备份寄存器

    开发板(正点原子stm32f407探索者开发板V2.4) STM32CubeMX软件(Version 6.10.0) keil µVision5 IDE(MDK-Arm) ST-LINK/V2驱动 野火DAP仿真器 XCOM V2.6串口助手 使用STM32CubeMX软件配置STM32F407开发板 实现RTC周期唤醒、闹钟A/B事件功能 ,具体为在周期唤醒时利用串口输出当前RTC记录时间,当闹钟

    2024年02月03日
    浏览(52)
  • MIPS寄存器文件设计实验

    学生了解 MIPS text{MIPS} MIPS 寄存器文件基本概念,进一步熟悉多路选择器、译码器、解复用器等 Logisim text{Logisim} Logisim 组件的使用,并利用相关组件构建 MIPS text{MIPS} MIPS 寄存器文件。 利用 Logisim text{Logisim} Logisim 平台构建一个简化的MIPS寄存器文件,内部包含 4 4 4 个 32 32

    2024年02月05日
    浏览(50)
  • 【机组】通用寄存器单元实验的解密与实战

    ​ 🌈个人主页: Sarapines Programmer 🔥 系列专栏: 《机组 | 模块单元实验》 ⏰诗赋清音:云生高巅梦远游, 星光点缀碧海愁。 山川深邃情难晤, 剑气凌云志自修。 ​ 目录 🌺一、 实验目的 🌼二、 实验内容 🌻三、 实验详情 实验1:数据输入通用寄存器 实验2:寄存器内

    2024年01月18日
    浏览(43)
  • STM32-ADC电压采样实验(寄存器版)

    STM32F10X系列支持三路ADC,其ADC通道及对应IO口如下表所示: 其能接受的电压输入范围一般为0-3.3V(V REF- ≤ V IN ≤ V REF+ ),因此,如果需要测量超出0-3.3v量程范围的电压数据,需要在外围硬件增加分压电阻,将电路转换到0-3.3V量程范围内再进行采集。 这里用于做ADC采集的引脚使

    2024年02月15日
    浏览(52)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包