【车载开发系列】RH850系统时钟与外设时钟配置
【车载开发系列】RH850系统时钟配置RH850系统时钟与外设时钟配置【车载开发系列】RH850系统时钟配置一. 什么是主外部晶振二. 什么是晶振驱动增益三. 为什么需要配置驱动增益四. 如何判断主晶振是否已稳定可用五. 主晶振开启后稳定的时间六. 什么是PLL锁相环七. 什么是PLL控制寄存器八. 为什么需要PLL九. 如何判断PLL控制是否生效十. 如何配置CPU分频十一. 外设时钟的初始化1CAN时钟配置2ADC时钟源配置3定时器时钟源配置十二. 注意事项一. 什么是主外部晶振MainOSC的全称是Main Oscillator中文名叫主外部晶振主振荡器。它就是你板子上外接的无源石英晶振是整个MCU最原始的时钟基准源。在RH850当中使用CLKCTLMOSCC寄存器来设置MainOSC。用来配置外部主晶振Main Oscillator的工作参数主要是增益 / 驱动能力适配不同晶振频率。一般在MCU初始化之后马上调用来配置主外部晶振的值。不同值对应不同频率0x0424MHz0x0316MHz0x028MHzCLKCTLMOSCC0x04;// Set MainOSC gain for 24MHz//CLKCTLMOSCC就是RH850时钟控制模块里的主振荡器配置寄存器//在这里匹配的是24MHz晶振的标准驱动增益二. 什么是晶振驱动增益指的是单片机内部给外部晶振的驱动电流或驱动能力。外部无源晶振本身不会自己起振需要MCU引脚输出电流推它振荡这个推力大小就叫驱动增益。三. 为什么需要配置驱动增益不同频率的晶振起振需要的推力不一样。低频晶振8M、16M需要小推力高频晶振24M、32M需要更大推力增益不配对会出现。增益太小晶振不起振、系统卡死增益太大晶振发烫、频率飘移、EMC会变差如果把晶振比作秋千的话那么增益就是推秋千的力道。如果力道配不好的话秋千也就玩不六了。总结晶振驱动增益就是 MCU 内部调整输出电流大小专门适配不同频率外部晶振让它稳定起振工作。四. 如何判断主晶振是否已稳定可用晶振起振是否成功是否可以给系统提供一个系统时钟就需要用到主晶振状态寄存器来判断。CLKCTLMOSCS中的bit2就是MOSCACTbit2 1 → MainOSC 已稳定、可以用bit2 0 → MainOSC 未稳定、不能用Bit位名称含义bit0MOSCRDY主振荡器准备就绪备用bit1MOSCSTP主振荡器停止bit2MOSCACT主振荡器激活 / 稳定最重要//需要特别注意需要等待主晶振稳定了之后稳定后才可以继续执行while((CLKCTLMOSCS0x04u)!0x04u);五. 主晶振开启后稳定的时间在RH850中有一个叫做主振荡器起振稳定时间配置寄存器通过对CLKCTLMOSCST的赋值可以设置主晶振稳定的时间。它可以设置外部主晶振从开启到完全稳定运行的等待延时。CLK时钟CTL控制MOSCMainOSC 外部主晶振STStabilization Time 稳定时间//配置2ms的晶振稳定等待时长CLKCTLMOSCST0x00003E80;六. 什么是PLL锁相环PLL就是Phase Locked Loop锁相环的意思它是MCU内部一个频率放大器/时钟倍频器我们一般在配置完MainOSC之后就调用PLL控制寄存器来将低频时钟变成高频时钟。PLL把之后设置的24MHz倍频拉高输出高频时钟然后再分频分出不同频率分给CPU、外设(ADC/CAN)保证外设能够跑在我们期待的频率中。七. 什么是PLL控制寄存器PLL控制寄存器CLKCTLPLL1C就是专门用来配置、设定、管控锁相环工作参数的寄存器。它用来设定锁相环倍频分频规则把低频基准时钟拉升成系统高频工作时钟的配置寄存器。八. 为什么需要PLL外部晶振相当于我们家里自来水的水压因为比较小难以实用所以我们使用了PLL锁相环将增压后的水压变大也就是时钟频率变高。没有PLL这个增压泵水流不够用没有PLL单片机中的外设也跑不快。九. 如何判断PLL控制是否生效相对于PLL控制寄存器这里还有一个概念叫做PLL状态寄存器CLKCTLPLL1S。PLL有没有锁定、有没有稳定、能不能用就是像下面一样判断之后就可以得到结果。与MainOSC相同这里也只有死等PLL锁定稳定稳定了才继续跑系统时钟。while((CLKCTLPLL1S0x04u)!0x04u){}bit2PLL1ACTPLL1 激活/稳定标志1PLL1 已经锁定可以当系统时钟用0PLL1 未稳定不能用十. 如何配置CPU分频WPROTRPROTCMD0 / WPROTRPROTCMD1是RH850里写保护解锁命令寄存器属于WPROTWrite Protection模块用来给时钟、复位、低功耗等关键寄存器 “开锁”不然不让写寄存器。要注意的是先解锁Group在检查写目标寄存器是否成功只有写入成功才可以进行下一步。CLKCTLCKSC_CPUCLKD_CTL CPU时钟分频器控制寄存器RH850 时钟系统核心寄存器之一CLKCTLCKSC_CPUCLKS_CTL CPU时钟源选择寄存器它的作用是告诉我们选择CPU从哪里拿时钟信号CLKCTLCKSC_PPLLCLKS_CTL是外设PLL时钟源选择控制寄存器选择外设域 PPLLCLK 的时钟输入源用来给 CAN、ADC、定时器、SPI 等片内外设提供基准时钟。voidR_CLKC_PllInit(void){/* Prepare 16MHz MainOsc */if((CLKCTLMOSCS0x04u)!0x4u)/* Check if MainOsc needs to be started */{CLKCTLMOSCC0x04;/* Set MainOSC gain for 24MHz */CLKCTLMOSCST0x00003E80;/* Set MainOSC stabilization time to 2ms */protected_write(WPROTRPROTCMD0,WPROTRPROTS0,CLKCTLMOSCE,0x01u);/* Trigger Enable (protected write) */while((CLKCTLMOSCS0x04u)!0x04u);/* Wait for active MainOSC */}if((CLKCTLPLL1S0x04u)!0x04u)/* Check if PLL needs to be started */{/* Prepare PLL1 */CLKCTLPLL1C0x10B27;/* 24 MHz MainOSC - 480MHz VCOUT, 80MHz PPLLOUT */protected_write(WPROTRPROTCMD1,WPROTRPROTS1,CLKCTLPLL1E,0x01u);/* Enable PLL */while((CLKCTLPLL1S0x04u)!0x04u){}/* Wait for active PLL */}/* CPLL1OUT VCOOUT 1/4 120 MHz */protected_write(WPROTRPROTCMD1,WPROTRPROTS1,CLKCTLCKSC_CPUCLKD_CTL,0x11u);while(CLKCTLCKSC_CPUCLKD_ACT!0x11u);/* 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,0x03u);while(CLKCTLCKSC_PPLLCLKS_ACT!0x03u);}CPUCLKD_CTLCPU 时钟分频调快慢CPUCLKS_CTLCPU时钟源选择选来源PPLLCLKS_CTL外设 PLL 时钟源选择给外设用十一. 外设时钟的初始化在完成了MainOSC和PLL的初始化配置之后我们就可以对RS-CANADC模块以及定时器模块TAUJ等进行配置。1CAN时钟配置CLKCTLCKSC_ICANS_CTLISO‑CAN模块时钟源选择控制寄存器它是CAN模块的系统时钟负责模块寄存器访问、状态机运行CLKCTLCKSC_ICANOSCD_CTLCAN通信波特率时钟分频配置寄存器专门配置CAN位时序基准时钟直接决定CAN / CAN FD波特率voidR_CLKC_SetRscanClockDomain(uint32_tRscanModuleClockDomain,uint32_tRscanComClockDomain){/* Select RS-CAN Module Clock */protected_write(WPROTRPROTCMD1,WPROTRPROTS1,CLKCTLCKSC_ICANS_CTL,RscanModuleClockDomain);while(CLKCTLCKSC_ICANS_ACT!RscanModuleClockDomain);/* Select RS-CAN Communication Clock */protected_write(WPROTRPROTCMD1,WPROTRPROTS1,CLKCTLCKSC_ICANOSCD_CTL,RscanComClockDomain);while(CLKCTLCKSC_ICANOSCD_CTL!RscanComClockDomain);}2ADC时钟源配置ADCA0是模块时钟源选择控制寄存器配置正确的ADC采样模块的工作时钟来源决定了ADC内核的正确运行。CLKCTLCKSC_AADCAS_CTL软件配置选择时钟源选择不同时钟源直接影响ADC最大采样速率、转换精度、功耗voidR_CLKC_SetAdca0ClockDomain(uint32_tAdca0ClockDomain){protected_write(WPROTRPROTCMD0,WPROTRPROTS0,CLKCTLCKSC_AADCAS_CTL,Adca0ClockDomain);while(CLKCTLCKSC_AADCAS_ACT!Adca0ClockDomain);}3定时器时钟源配置CLKCTLCKSC_ATAUJS_CTL是TAUJ定时器模块时钟源选择控制寄存器。选定TAUJ定时器的工作基准时钟源决定定时器计数频率、定时精度voidR_CLKC_SetTaujClockDomain(uint32_tTaujClockDomain){protected_write(WPROTRPROTCMD0,WPROTRPROTS0,CLKCTLCKSC_ATAUJS_CTL,TaujClockDomain);while(CLKCTLCKSC_ATAUJS_CTL!TaujClockDomain);}十二. 注意事项1.所有关键时钟寄存器都使用protected_write保护写这样可以防止误修改。2.时钟切换后都需要while等待生效确保时钟真正稳定后再继续执行防止跑飞。3.先判断时钟是否已开启再配置4.初始化顺序MainOSC–PLL–CPU时钟分频–选择CPU时钟源–选择外设时钟源–外设时钟配置#defineprotected_write(preg,pstatus,reg,value)do{\(preg)0xa5u;\(reg)(value);\(reg)~(value);\(reg)(value);\}while((pstatus)1u)