上周我们的老大甩了一个KF8A100的车前灯的单片机,要求加一个渐亮渐灭的呼吸灯。但是该单片机小灯引脚并无pwm,所以只能自己自定义pwm。拿到板子,我采用固定时间给高低脉冲的方法,结果不行。原因就在老大给我们的源代码中,没有初始化系统时钟,默认的是将总线时钟分频32,这样频率太小,不能满足呼吸灯的频率。重点是 单片机一定进行系统时钟初始化,否则有些功能就会出现冲突。
void PLL_Init(void)
{
CPMUPROT = 0x26;
CPMUOSC_OSCE = 1;
while(!CPMUOSC_OSCPINS_EN);
while (CPMUFLG_UPOSC); //等待
CPMUCLKS_PSTP = 0; //禁用PLL
CPMUCLKS_PLLSEL = 1; //选择PLL作为系统时钟源
CPMUREFDIV = 0x41; //fREF = fSOC/(REFDIV+1) = 8/(1+1) = 4
CPMUSYNR = 0x03; //通过两步算出fvco = 2*fREF*(SYNR+1) = 32
CPMUPOSTDIV = 0x01; //fPLL = fvoc/(DIV+1) 32/2 = 16
//fbus = fPLL/2 = 16/2 = 8mhz
CPMUPLL = 0X10;
while(CPMUFLG_LOCK == 0); //等待PLL稳定
CPMUPROT = 0x00; //关闭保护时钟
}
这里我就不解释寄存器了,直接上原理 fbus 总线时钟 fPLL 环回时钟
fbus = fPLL ④
fPLL = fCOV /CPMUPOSTIV ③
fCOV = 2*fREF*(SYN+1) ②
fREF = fosc /(REFDIV+1) //fOSC是外部晶振时钟 ①
重点寄存器
CPMUFLG_UPOSC 振荡器状态位-UPSC反映振荡器的状态。写入无效。
UPOSC=0时,前往MSCAN模块的OSCCLK关闭。进入完全停止模式UPOSC被清除。
CPMUOSC_OSCPINS_EN :振荡器引脚EXTAL和XTAL启用位如果OSCE=1,则设置此只读位。它只能在下一次重置时清除。启用外部振荡器将保留EXTAL和XTAL引脚专用于振荡器应用。(主要判断外部晶振设置完毕)
0 EXTAL和XTAL引脚未保留给振荡器。
1只为振荡器保留EXTAL和XTAL引脚
S12CPMU参考除法器寄存器(CPMUREFDIV)

If XOSCLCP is enabled (OSCE=1) fREF = fOSC/(REFDIV +1)
通过算出的时钟频率选择出所在的范围,在给REFFRQ赋值。

S12CPMU合成器寄存器(CPMUSYNR)

If PLL has locked (LOCK=1) fVCO = 2 *fREF*( SYNDIV +1)
通过算出的时钟频率选择出所在的范围,在给VCOFRQ赋值。

S12CPMU后分频器寄存器(CPMUPOSTIV)

