MC9S12G128 系统总线时钟配置(选择外部晶振为时钟源8MHZ)

文章讲述了在KF8A100单片机上添加呼吸灯功能遇到的问题,由于单片机无内置PWM,需要自定义PWM。作者发现源代码未初始化系统时钟导致频率过低,无法满足呼吸灯效果。通过详细的PLL初始化过程,包括设置参考除法器、合成器和后分频器寄存器来调整时钟频率,以实现所需的呼吸灯频率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

上周我们的老大甩了一个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)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值