关于RH850系统时钟初始化的分析解读

博主联系方式:QQ:1256153255 ,邮箱:1256153255@qq.com

点击这里可申请RH850开发板
点击这里可申请瑞萨E1仿真器

RH850的时钟初始化,有些是自己配置的,有些是用Smart configure图形配置后自动生成的;不管是自己配置还是自动生成,其原理及步骤都是相同的。在此分析自己配置的情况,代码如下

void R_CGC_Create(void)
{ 
    /* Prepare 16MHz MainOsc */
  if((CLKCTLMOSCS&0x04u) != 0x4u)                                       /* Check if MainOsc needs to be started */
  {
   CLKCTLMOSCC=0x06;                                                    /* Set MainOSC gain for 16MHz */
   CLKCTLMOSCST=0x00008000;                                             /* Set MainOSC stabilization time to 2ms */
   protected_write(WPROTRPROTCMD0,WPROTRPROTS0,CLKCTLMOSCE,0x01u);      /* Trigger Enable (protected write) */
   while ((CLKCTLMOSCS&0x04u) != 0x04u);                                /* Wait for active MainOSC */
  }

  if((CLKCTLPLLS&0x04u) != 0x04u)                                      /* Check if PLL needs to be started */
  {
    /* Prepare PLLC */
    CLKCTLPLLC=0x00010B3B;                                             /* 16 MHz MainOSC -> 480MHz VCOUT */
                                                                        /* 5% @ 100kHz SSCG */
                                                                        
//    protected_write(WPROTRPROTCMD0,WPROTRPROTS0,CLKCTLPLL0ST,0x1B80);   /* Set stabilization time to recommended value */
    protected_write(WPROTRPROTCMD1,WPROTRPROTS1,CLKCTLPLLE,0x01u);     /* Enable PLL */
    while((CLKCTLPLLS&0x04u) != 0x04u){}                               /* Wait for active PLL */
  }
  
  /* CPLLOUT = VCOOUT ?1/4 = 120 MHz (for Premium Device) */
  protected_write(WPROTRPROTCMD1,WPROTRPROTS1,CLKCTLCKSC_CPUCLKD_CTL,0x11);
  while(CLKCTLCKSC_CPUCLKD_ACT!=0x11);  
  
  /* CPLLOUT -> CPU Clock */ 
  protected_write(WPROTRPROTCMD1,WPROTRPROTS1,CLKCTLCKSC_CPUCLKS_CTL,0x03u);
  while(CLKCTLCKSC_CPUCLKS_ACT!=0x03u);
  
  /* PPLLOUT -> PPLLCLK = 80MHz */
  protected_write(WPROTRPROTCMD1,WPROTRPROTS1,CLKCTLCKSC_PPLLCLKS_CTL,0x3);
  while(CLKCTLCKSC_PPLLCLKS_ACT!=0x3);  
}

这么一大段代码,究竟在配置什么?跟着我的手一行行分析吧.
↓↓↓

前言:

首先来一段前戏吧,要不然你都不知道后边在干啥

前戏1:RH850支持哪些时钟源?时钟源频率分别是多少?

UM(User Manual)曰:
在这里插入图片描述
图1

我们的例程选用的时钟源是MainOSC,也就是16MHz的外部晶振源。

前戏2:既然选用MainOSC,那它怎么用?

UM(User Manual)曰:
在这里插入图片描述
图2

前戏3:启用了MainOSC之后,接下来怎么用?

其实对于一款MCU来说,使用到时钟频率的无非就两个单元:①CPU单元 ②外设单元
从UM的时钟树可知,CPU时钟CPUCLK是从PLL来的,外设时钟PPLLCLK也是从PLL来的,而PLL又是从MainOSC来的
所以我们的配置步骤应该是这样的
①配置并启用MainOSC
②配置MainOSC生成PLL
④配置生成PPLLOUT和CPLLOUT
⑤配置生成CPUCLK和PPLLCLK
记住这5步配置,因为整篇博文都是在围绕这5步开展的
在这里插入图片描述
图3

正式分析:

接下来开始分析代码了

①配置并启用MainOSC
if((CLKCTLMOSCS&0x04u) != 0x4u) 

分析这行配置,首先要搞清楚寄存器CLKCTLMOSCS的功能
UM(User Manual)曰:
在这里插入图片描述
图4在这里插入图片描述
图5

也就是说CLKCTLMOSCS. MOSCCLKACT用于指示 MainOSC是否激活状态的,这行代码用于判断MainOSC是否激活态,如果已经激活则跳过,如果没激活则执行以下

CLKCTLMOSCC=0x06;                                                    /* Set MainOSC gain for 16MHz */
CLKCTLMOSCST=0x00008000;                                             /* Set MainOSC stabilization time to 2ms */
protected_write(WPROTRPROTCMD0,WPROTRPROTS0,CLKCTLMOSCE,0x01u);      /* Trigger Enable (protected write) */
while ((CLKCTLMOSCS&0x04u) != 0x04u);                                /* Wait for active MainOSC */

从图2可知,要使用MainOSC需要①选择振荡器 ②设置MainOSC稳定时长 ③激活MainOSC,这段代码就做了这三件事。
至于为什么是这几个值,请大家自行查询手册。

②配置MainOSC生成PLL

在这里插入图片描述
图6

  if((CLKCTLPLLS&0x04u) != 0x04u)                                      /* Check if PLL needs to be started */
  {
    /* Prepare PLLC */
    CLKCTLPLLC=0x00010B3B;                                             /* 16 MHz MainOSC -> 480MHz VCOUT */
                                                                        /* 5% @ 100kHz SSCG */
                                                                        
//    protected_write(WPROTRPROTCMD0,WPROTRPROTS0,CLKCTLPLL0ST,0x1B80);   /* Set stabilization time to recommended value */
    protected_write(WPROTRPROTCMD1,WPROTRPROTS1,CLKCTLPLLE,0x01u);     /* Enable PLL */
    while((CLKCTLPLLS&0x04u) != 0x04u){}                               /* Wait for active PLL */
  }

由于时钟源是16Mhz,而我们的CPU频率是80MHz,毫无疑问要倍频。
在这里插入图片描述
图7
从图7可知,配置PLLCLKIN,由MainOSC生成VCOOUT,再由VCOOUT生成CPLLOUT和PPLLOUT
在这里插入图片描述
此处fPLLCLKIN = 16MHz
CLKCTLPLLC=0x00010B3B
↓↓↓↓↓
PLLC = 00000000 00000001 00001011 00111011
↓↓↓↓↓
M[1:0] = 01
N[5:0] = 111011
↓↓↓↓↓
fvcoout = 480MHz
在这里插入图片描述
图8
在这里插入图片描述
图9

④配置生成PPLLOUT和CPLLOUT

由图9可得
CPLLOUT = 80MHz
PPLLOUT = 80MHz

⑤配置生成CPUCLK和PPLLCLK

在这里插入图片描述
图10
在这里插入图片描述
图11
从图10和图11可知,CPUCLK由CPLLOUT生成,CPUCLK = CPLLOUT = 80MHz

  /* CPLLOUT -> CPU Clock */ 
  protected_write(WPROTRPROTCMD1,WPROTRPROTS1,CLKCTLCKSC_CPUCLKS_CTL,0x03u);
  while(CLKCTLCKSC_CPUCLKS_ACT!=0x03u);

在这里插入图片描述
图12
PPLLCLK = PPLLOUT = 80MHz

  /* PPLLOUT -> PPLLCLK = 80MHz */
  protected_write(WPROTRPROTCMD1,WPROTRPROTS1,CLKCTLCKSC_PPLLCLKS_CTL,0x3);
  while(CLKCTLCKSC_PPLLCLKS_ACT!=0x3);  

至此,时钟初始化配置完成。

  • 6
    点赞
  • 42
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值