博主联系方式: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);
至此,时钟初始化配置完成。