上篇比较详细的讲了一下GPIO跟中断,这篇打算说一说PLL和EBIU。
先说PLL吧,PLL是什么?全称Phase Locked Loop,是ADSP-BF53x 的内核和时钟设置的机制,叫做锁相环。我们通过PLL 配置当前处理器工作的内核和系统时钟。所以这个非常关键。
PLL 机制如下图:
输入时钟送给 ADSP-BF53x 后,通过DF 设置是否对输入时钟分频,然后将根据MSEL 的值对时钟进行倍频,倍频后将时钟送给VCO,由VCO 根据设置的分频系数,分出内核时钟和系统时钟。
MSEL 占用6Bit,最大可设置64 倍倍频。通常情况下,该倍频频率不要超过芯片允许的最大频率。
内核时钟分频系数占 2Bit,最大可设置8 倍分频,当为00 时,内核时钟等于VCO 时钟。设置的内核时钟原则上不要超过芯片允许的最高频率。当然也是有很多猛人玩超频的,这取决于你对自己硬件设计的强烈自信,官方不允许!
系统时钟分频系数占 4bit,最大进行15 倍的分频。设置的系统时钟不要超过133MHz。
接口寄存器说明:
寄存器 功能
PLL_DIV PLL分频寄存器,设置系统时钟和内核时钟分频系数
PLL_CTL PLL控制寄存器,设置VCO 倍频系数和一些控制开关
PLL_STAT PLL 状态寄存器,获取芯片当前工作的状态
PLL_LOCKCNT PLL 计数器,用于设置计数时钟
下面来个例子代码分析一下,会容易理解了:
*pPLL_DIV = pssel; //设置系统时钟分频系数,内核不做分频
asm("ssync;"); //系统同步
new_PLL_CTL = (pmsel & 0x3f) << 9; //将VCO 倍频系数移位至需设置的位置
*pSIC_IWR |= 0xffffffff; //将系统中断唤醒使能
if (new_PLL_CTL != *pPLL_CTL) //判断是否已经配置过倍频系数
{
*pPLL_CTL = new_PLL_CTL; //配置倍频系数
asm("ssync;"); //系统同步
asm("idle;"); //将处理器设置为空闲
}
配置完PLL 后,系统必须将系统设置为空闲后,系统再一次唤醒后,设置的值才会生效。
当然,OP还是会上传一个完整的例程来诠释这个PLL。这个例程代码就实现了将内核时钟配置为 16 倍倍频,将系统时钟配置为4 倍分频。板卡上输入时钟为25MHz,所以VCO时钟配置后为25*16 =400MHz,内核时钟没有做分频,所以内核时钟等于VCO 时钟,也为400MHz,系统时钟为400/3=100MHz。
运行代码后,处理器的内核时钟会运行在 400MHz,系统时钟运行在100MHz。
例程源码的百度云盘下载: 链接: http://pan.baidu.com/s/1dDAHim9 密码: 0h3e
PS:下一篇的EBIU讲完后,统一贴这2章的教学视频,录到一起了。 |