0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

什么是外设时钟根配置

汽车电子技术 来源:程序猿搬砖 作者:坏人 2023-03-02 16:22 次阅读

外设需要工作也需要时钟驱动,通过多路选择器以及对应的寄存器配置初始化最适合的外设频率可以让外设更高频的工作。

图片

从上面截图以及红框中可以看到,外设时钟根PERCLK_CLK_ROOTIPG_CLK_ROOT为大多数常用的外设提供时钟,初始化这两个时钟根需要先对AHB_CLK_ROOT进行初始化

初始化AHB_CLK_ROOT

AHB_CLK_ROOT的时钟来源在CBCDR[PERIPH_CLK_SEL]处有一个多路选择器

图片

从上面这个图可以看出AHB_CLK_ROOT最大支持的频率是132MHz,如果在CBCDR[PERIPH_CLK_SEL]这个多路选择器这里选择了上路,那它的时钟来源最大的频率是PLL3_480,通过CBCDR[PERIPH_CLK2_RODF]分频后最大只能到120(此时分频器的值是4,如果是3的话160则超过了最大值),因为AHB_CLK_ROOT限制最大是132。因此CBCDR[PERIPH_CLK_SEL]这个多路选择器,选择下路, 同时在CBCMR[PRE_PERIPH_CLK_SEL]时选择PLL2PFD2时钟源,它的时钟频率是396MHz,最终达到AHB_CLK_ROOT时经过CBCDR[AHB_PODF]分频器处理刚好得到132MHz的频率。

/// 配置外接设备的时钟频率
    /// CBCMR[PRE_PERIPH_CLK_SEL]选择PLL2->PFD2
    /// 先将19-18两个bit位清0
    /// 再将19-18两个bit位的数据写成1,选择PFD2
    CCM->CBCMR &= ~(3 << 18);
    CCM->CBCMR |= (1 << 18);
    /// CBCDR[PERIPH_CLK_SEL]多路选择器选择下路
    CCM->CBCDR &= ~(1 << 25);
    /// 读取第5个bit位(PERIPH_CLK_ SEL_BUSY),如果是1指示正忙于握手,如果是0表示握手完成
    while ((CCM->CDHIPR >> 5) & 0x1);

/* 修改 AHB_PODF 位的时候需要先禁止 AHB_CLK_ROOT 的输出,但是
 * 我没有找到关闭 AHB_CLK_ROOT 输出的的寄存器,所以就没法设置。
 * 下面设置 AHB_PODF 的代码仅供学习参考不能直接拿来使用!!
 * 内部 boot rom 将 AHB_PODF 设置为了 3 分频,即使我们不设置 AHB_PODF, * AHB_ROOT_CLK 也依旧等于 396/3=132Mhz。
 */
#if 0
    /// 将CBCDR[AHB_PODF]的12-10三个bit位清0
    CCM->CBCDR &= ~(7 << 10);
    /// 将CBCDR[AHB_PODF]的值设置成3,即3分频
    CCM->CBCDR | (2 << 10);
    /// 等待忙位检测通过
    while ((CCM->CDHIPR >> 1) & 0x1);
#endif

初始化IPG_CLK_ROOT

IPG_CLK_ROOT的频率最大值是66MHz,从AHB_CLK_ROOT过来的频率是132MHz,所以这里只需要将CBCDR[IPG_PODF]分频器的值设置成除2即可。

/// 将9-8两个bit位的数据清0
CCM->CBCDR &= ~(3 << 8);
/// 设置成2分频
CCM->CBCDR |= (1 << 8);

初始化PERCLK_CLK_ROOT

PERCLK_CLK_ROOT的频率最大值是66MHz,在CBCDR[IPG_PODF]分频器的作用下它的频率已经是66MHz了,所以此时只需要将CSCMR1[PERCLK_CLK_SEL]多路选择器选择到IPG_CLK_ROOT,将PERCLK_PODF分频器的值设置成1分频即可。

/// CSCMR1[PERCLK_CLK_SEL]选择ipg clk root
CCM->CSCMR1 &= ~(1 << 6);
/// 将5-0 6个bit位清0,设置成1分频,此时已经是1分频了
CCM->CSCMR1 &= ~(0x3F << 0);

以上都初始化完成后IPG_CLK_ROOTPERCLK_CLK_ROOT两个时钟根的频率就工作在子66MHz,最大的发挥了SOC的性能,这两个时钟根也是大部分外设的时钟源。

特别说明

修改 AHB_PODF 位的时候需要先禁止 AHB_CLK_ROOT 的输出,但是

  • 我没有找到关闭 AHB_CLK_ROOT 输出的的寄存器,所以就没法设置。
  • 下面设置 AHB_PODF 的代码仅供学习参考不能直接拿来使用!!
  • 内部 boot rom 将 AHB_PODF 设置为了 3 分频,即使我们不设置 AHB_PODF, * AHB_ROOT_CLK 也依旧等于 396/3=132Mhz。# 外设时钟根配置
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 时钟
    +关注

    关注

    10

    文章

    1479

    浏览量

    130306
  • 外设
    +关注

    关注

    0

    文章

    30

    浏览量

    11551
  • 多路选择器
    +关注

    关注

    1

    文章

    22

    浏览量

    6439
收藏 人收藏

    评论

    相关推荐

    STM32为什么要先开启外设时钟

    相信很多朋友都曾遇到过这种坑,我最初学习STM32的时候同样也遇到过。下面,我就来说说为什么我们要先开启STM32外设模块时钟,再对其外设模块初始化配置
    的头像 发表于 10-20 14:10 3857次阅读
    STM32为什么要先开启<b class='flag-5'>外设</b><b class='flag-5'>时钟</b>?

    STM32L552系统时钟外设时钟配置错误导致系统不稳定的原因?怎么解决?

    系统时钟外设时钟配置错误导致系统不稳定
    发表于 03-20 07:59

    PWM对应的外设时钟

    1. 时钟配置时钟树上面,PWM对应的外设时钟为APB1 Timer Clock, 48MHz.2. PWM通道的
    发表于 08-06 09:08

    系统时钟的相关配置

    时钟配置概述时钟概述经过前文对GPIO、USART外设的初步学习,发现有两个基本知识需要补充学习,一个是系统时钟的相关
    发表于 08-12 06:57

    时钟配置

    时钟树见最后(stm32F407VGET6)1、首先需要明确的一点是时钟配置时钟外设对应时钟
    发表于 08-12 06:36

    浅析STM32F105RBT6使用外部晶振8M时配置外设时钟

    STM32F105RBT6使用外部晶振8M时配置外设时钟
    发表于 08-18 07:51

    为什么那么多外设选择内部48Mhz RC时钟作为root?

    时钟、MIPI_REF 时钟等。2、为什么不选用精密的外部振荡器24Mhz时钟?主要优点和缺点是什么?3.如果我要
    发表于 03-21 07:16

    基于STM32时钟系统的开发及配置

    研究过时钟来源,再来研究时钟的去向,MCU自身要能正常运作,即需要一个时钟,这个时钟既是系统时钟(SYSCLK),而基本上所有
    发表于 10-19 15:55 2112次阅读
    基于STM32<b class='flag-5'>时钟</b>系统的开发及<b class='flag-5'>配置</b>

    STM32片上外设时钟使能 失能和复位的区别

    STM32片上外设时钟使能、失能和复位的区别
    的头像 发表于 03-06 15:31 5517次阅读

    STM32的时钟配置——时钟树解析

    STM32为什么要有复杂的时钟系统首先STM32 本身非常复杂,外设非常的多,但是并不是所有外设都需要系统时钟这么高的频率,比如看门狗以及 RTC 只需要几十 k 的
    发表于 11-23 18:21 8次下载
    STM32的<b class='flag-5'>时钟</b><b class='flag-5'>配置</b>——<b class='flag-5'>时钟</b>树解析

    基本时钟配置

    DCO频率配置 MCLK,SMCLK时钟源选择,分频配置 时钟信号选择
    发表于 11-25 09:36 40次下载
    基本<b class='flag-5'>时钟</b><b class='flag-5'>配置</b>

    [单片机框架][bsp层][cx32l003][bsp_system_clock] clock配置和使用

    系统时钟时钟控制模块主要控制系统时钟以及外设时钟, 可以配置不同的
    发表于 12-01 14:21 1次下载
    [单片机框架][bsp层][cx32l003][bsp_system_clock] clock<b class='flag-5'>配置</b>和使用

    STM32F4时钟配置的操作步骤

    本文将介绍STM32F4时钟配置的操作步骤、并对比时钟配置前后LED外设闪烁的快慢以及对应代码的讲解。
    的头像 发表于 04-21 11:29 2216次阅读
    STM32F4<b class='flag-5'>时钟</b><b class='flag-5'>配置</b>的操作步骤

    STM32失能时钟和复位外设的区别

    STM32失能时钟和复位外设的区别
    的头像 发表于 10-17 11:48 556次阅读
    STM32失能<b class='flag-5'>时钟</b>和复位<b class='flag-5'>外设</b>的区别

    蓝牙开发零门槛之十四-Cube

    的方式完成外设时钟配置 丰富、易用的图形界面 启发式、交互式设计 无需文档,使用方法一目了然 自动检查,减少错误 管脚冲突 参数范围 低调 生成的代码汇总于一个文件 由开发者决定是否使用它生成的代码 不会搞乱开发者的工程设置
    的头像 发表于 11-07 18:28 432次阅读
    蓝牙开发零门槛之十四-Cube