前言
上一篇文章完成了RH850时钟源寄存器配置,外设要正常工作,必须要配置对应的时钟,这篇文章说明RH850外设时钟配置。
- 时钟选择寄存器
下面表格是RH850-F1K技术规格书列出的外设时钟寄存器。
外设时钟寄存器基本都相同,如TAUJ代表的是定时器J的时钟,ADCA代表是A/D转换时钟。下面以RH850-F1K 定时器TAUJ为例,介绍外设时钟相关寄存器。
1.1 TAUJ时钟源选择寄存器 C_AWO_TAUJ Source Clock Selection Register
CKSC_ATAUJS_CTL定时器TAUJ时钟源选择寄存器可以32bit读写。地址:FFF8 2100H,复位值0000 0001H。
Bit position | Bit Name | Function |
31 - 3 | 保留 |
|
2 - 0 | ATAUJSCSID[2:0] | 000: 禁止配置 001: 内部高速振荡器 010: 外部主晶振 011: 内部低速晶振 100: PPLLCLK2 其他禁止配置 |
这个寄存器选择定时器时钟的来源,比较简单,按需要选择。
1.2 TAUJ时钟源激活状态寄存器 C_AWO_TAUJ Source Clock Active Register
CKSC_ATAUJS_ACT定时器TAUJ时钟源激活状态寄存器可以32bit读。地址:FFF8 2108H,复位值0000 0001H。
Bit position | Bit Name | Function |
31 - 3 | 保留 |
|
2 - 0 | ATAUJSACT [2:0] | 000: 禁止配置 001: 内部高速振荡器 010: 外部主晶振 011: 内部低速晶振 100: PPLLCLK2 其他禁止配置 |
时钟源选择寄存器配置后,需要读这个寄存器,直到这个寄存器值和时钟源选择寄存器值一致,说明时钟源选择寄存器配置成功。
1.3 TAUJ时钟分频寄存器 C_AWO_TAUJ Clock Divider Selection Register
CKSC_ATAUJD_CTL定时器TAUJ时钟分频寄存器可以32bit读写。地址:FFF8 2200H,复位值0000 0001H。
Bit position | Bit Name | Function |
31 - 3 | 保留 |
|
2 - 0 | ATAUJDCSID [2:0] | 000: 禁止配置 001: 选择时钟/1 010: 选择时钟/2 011: 选择时钟/4 100: 选择时钟/8 其他禁止配置 |
1.4 TAUJ时钟分频激活状态寄存器C_AWO_TAUJ Clock Divider Active Register
CKSC_ATAUJD_ACT定时器TAUJ时钟分频激活状态寄存器可以32bit读。地址:FFF8 2208H,复位值0000 0001H。
Bit position | Bit Name | Function |
31 - 3 | 保留 |
|
2 - 0 | ATAUJDACT [2:0] | 000: 禁止配置 001: 选择时钟/1 010: 选择时钟/2 011: 选择时钟/4 100: 选择时钟/8 其他禁止配置 |
时钟分频寄存器配置后,需要读这个寄存器,直到这个寄存器值和时钟时钟分频寄存器值一致,说明时钟分频寄存器配置成功。
1.5 TAUJ时钟待机模式停止寄存器C_AWO_TAUJ Stop Mask Register
CKSC_ATAUJD_STPM定时器TAUJ待机模式停止寄存器可以32bit读写。地址:FFF8 2218H,复位值0000 0002H。
Bit position | Bit Name | Function |
31 - 1 | 保留 |
|
0 | ATAUJD STPMSK | 0: 待机模式停止 1: 待机模式不停止 |
其他外设寄存器和TAUJ基本相同,这里就不介绍了。
二、RH850-F1K时钟源及外设时钟配置例程
void Init_Clocks(void)
{
/*配置主晶振 16M*/
if((CLKCTLMOSCS&0x04u) != 0x4u) /* 检测MainOsc 有没有启动 */
{
CLKCTLMOSCC=0x06; /* 10B,(8MHz < MOSC frequency =< 16MHz) */
CLKCTLMOSCST=0x8000; /* 设置稳定延时时间(8,19 ms) */
protected_write(WPROTRPROTCMD0,WPROTRPROTS0,CLKCTLMOSCE,0x01u); /* MOSCE=0x01,使能主晶振*/
while (((CLKCTLMOSCS&0x04u) != 0x04u) != 0x04u); /* 等待MainOSC正常工作 */
}
/*配置PLL 80M*/
if((CLKCTLPLLS&0x04u) != 0x04u) /* 检测PLL有没有启动 */
{
CLKCTLPLLC=0x00010B3B; /* 配置PLL控制寄存器,主晶振 16M,CPLLOUT,PPLLOUT输出80M,数据来源见前面分析*/
protected_write(WPROTRPROTCMD1,WPROTRPROTS1,CLKCTLPLLE,0x01u); /*使能 PLL */
while((CLKCTLPLLS&0x04u) != 0x04u){} /*等待 PLL正常工作 */
}
/*配置CPU时钟80M*/
protected_write(WPROTRPROTCMD1,WPROTRPROTS1,CLKCTLCKSC_CPUCLKD_CTL,0x01u); /*CPU时钟480/6=80M */
while(CLKCTLCKSC_CPUCLKD_ACT!=0x01u);
protected_write(WPROTRPROTCMD1,WPROTRPROTS1,CLKCTLCKSC_CPUCLKS_CTL,0x03u); /*CPU时钟源选择,BIT1-0, 3-PLL输出CPLLCLK*/
while(CLKCTLCKSC_CPUCLKS_ACT!=0x03u); /*等待 CPU时钟正常工作 */
/* 设置PERI2总线 40 MHZ (PPLLCLK2) */
protected_write(WPROTRPROTCMD1,WPROTRPROTS1,CLKCTLCKSC_IPERI2S_CTL,0x02u);
while(CLKCTLCKSC_IPERI2S_ACT!=0x02u);
/*设置ADCA0时钟 40 MHZ (PPLLCLK2) */
protected_write(WPROTRPROTCMD0,WPROTRPROTS0,CLKCTLCKSC_AADCAS_CTL,0x03u);
while(CLKCTLCKSC_AADCAS_ACT!=0x03u);
/*设置ADCA1时钟 40 MHZ (PPLLCLK2) */
protected_write(WPROTRPROTCMD1,WPROTRPROTS1,CLKCTLCKSC_IADCAS_CTL,0x03u);
while(CLKCTLCKSC_IADCAS_ACT!=0x03u);
/*设置RLIN时钟 40 MHZ (PPLLCLK2) */
protected_write(WPROTRPROTCMD1,WPROTRPROTS1,CLKCTLCKSC_ILINS_CTL,0x03u);
while(CLKCTLCKSC_ILINS_ACT!=0x03u);
/*设置CAN时钟80 MHZ (CPUCLK) */
protected_write(WPROTRPROTCMD1,WPROTRPROTS1,CLKCTLCKSC_ICANS_CTL,0x03u);
while(CLKCTLCKSC_ICANS_ACT !=0x03u);
/*设置CAN通讯时钟16 MHZ (main osc) */
protected_write(WPROTRPROTCMD1,WPROTRPROTS1, CLKCTLCKSC_ICANOSCD_CTL,0x01u);
while(CLKCTLCKSC_ICANOSCD_CTL !=0x01u);
/* Select the Low Speed IntOsc(240kHz) as TAUJ Clock */
/*设置TAUJ时钟40 MHZ (PPLLCLK2) */
protected_write(WPROTRPROTCMD0,WPROTRPROTS0,CLKCTLCKSC_ATAUJS_CTL,0x04u); //??
while(CLKCTLCKSC_ATAUJS_CTL!=0x04u);
}
RH850时钟相关说明完成了,时钟是单片机系统最基本部分,时钟初始化完成后,系统就可以跑起来了。