智能车制作

 找回密码
 注册

扫一扫,访问微社区

查看: 2676|回复: 5
打印 上一主题 下一主题

【XHM】PLL锁相环的设置

[复制链接]

4

主题

91

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2547
威望
1184
贡献
653
兑换币
330
注册时间
2011-9-30
在线时间
355 小时
跳转到指定楼层
1#
发表于 2011-10-24 21:33:44 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
PLL锁相环的设置还是比较简单的,因为东西很死,完全可以照搬。主要配置的就是
REFDV (范围是0到63,CRG参考分频寄存器)和 SYNR(范围是0到15,CRG合成器
寄存器)。
      计算公式是PLLCLK=2*OSCCLK*(SYNR+1)/(REFDV+1),其中OSCCLK为系统
时钟,而PLLCLK为锁相环后的时钟。想要得到PLLCLK的时钟可以对SYNR和REFDV进行
一些配置。

#include "derivative.h"      /* derivative-specific definitions */

//锁相环初始化函数
void Init_PLL_16M(void)
{                       
        CLKSEL=0X00;                // disengage PLL to system
                PLLCTL_PLLON=1;            // turn on PLL       
                                        //PLLCLK=2*OSCCLK*(SYNR+1)/(REFDV+1)
                                        //锁相环时钟=2*16*(1+1)/(1+1)=32MHz
        REFDV = 1;                //REFDV范围为0~63
       
        SYNR = 1;                        //SYNR范围为0~15

        _asm(nop);
        _asm(nop);
        _asm(nop);                //等待锁相环稳定

        while(!(CRGFLG&0X08));        //when pll is steady ,then use it;
                                        //选定锁相环位,Bus Clock=PLLCLK/2;
        CLKSEL = 0X80;          //总线时钟=32/2=16MHz
               
}

void Init_PLL_24M(void)
{                                       
        CLKSEL=0X00;                // disengage PLL to system
                PLLCTL_PLLON=1;            // turn on PLL
                                        //PLLCLK=2*OSCCLK*(SYNR+1)/(REFDV+1)
                                        //锁相环时钟=2*16*(2+1)/(1+1)=48MHz
        REFDV = 1;                //REFDV范围为0~63
       
        SYNR = 2;                        //SYNR范围为0~15
       
        _asm(nop);
        _asm(nop);
        _asm(nop);                //等待锁相环稳定

        while(!(CRGFLG&0X08));        //when pll is steady ,then use it;
                                        //选定锁相环位,Bus Clock=PLLCLK/2;
        CLKSEL = 0X80;          //总线时钟=48/2=24MHz
               
}

void Init_PLL_32M(void)
{
        CLKSEL=0X00;                // disengage PLL to system
                PLLCTL_PLLON=1;            // turn on PLL
                                        //PLLCLK=2*OSCCLK*(SYNR+1)/(REFDV+1)
                                        //锁相环时钟=2*16*(3+1)/(1+1)=64MHz
        REFDV = 1;                //REFDV范围为0~63
       
        SYNR = 3;                        //SYNR范围为0~15
               
        _asm(nop);
        _asm(nop);
        _asm(nop);                //等待锁相环稳定

        while(!(CRGFLG&0X08));        //when pll is steady ,then use it;
                                        //选定锁相环位,Bus Clock=PLLCLK/2;
        CLKSEL = 0X80;          //总线时钟=64/2=32MHz
               
}

void Init_PLL_48M(void)
{                                       
        CLKSEL=0X00;                // disengage PLL to system
                PLLCTL_PLLON=1;            // turn on PLL
                                        //PLLCLK=2*OSCCLK*(SYNR+1)/(REFDV+1)
                                        //锁相环时钟=2*16*(5+1)/(1+1)=96MHz
        REFDV = 1;                //REFDV范围为0~63
       
        SYNR = 5;                        //SYNR范围为0~15
               
        _asm(nop);
        _asm(nop);
        _asm(nop);                //等待锁相环稳定

        while(!(CRGFLG&0X08));        //when pll is steady ,then use it;
                                        //选定锁相环位,Bus Clock=PLLCLK/2;
        CLKSEL = 0X80;          //总线时钟=96/2=48MHz
               
}

void Init_PLL_64M(void)
{                                       
        CLKSEL=0X00;                // disengage PLL to system
                PLLCTL_PLLON=1;            // turn on PLL
                                        //PLLCLK=2*OSCCLK*(SYNR+1)/(REFDV+1)
                                        //锁相环时钟=2*16*(7+1)/(1+1)=128MHz
        REFDV = 1;                //REFDV范围为0~63
       
        SYNR = 7;                        //SYNR范围为0~15
               
        _asm(nop);
        _asm(nop);
        _asm(nop);                //等待锁相环稳定

        while(!(CRGFLG&0X08));        //when pll is steady ,then use it;
                                        //选定锁相环位,Bus Clock=PLLCLK/2;
        CLKSEL = 0X80;          //总线时钟=48/2=64MHz
               
}

void Init_PLL_72M(void)
{                               
        CLKSEL=0X00;                // disengage PLL to system
                PLLCTL_PLLON=1;            // turn on PLL
                                        //PLLCLK=2*OSCCLK*(SYNR+1)/(REFDV+1)
                                        //锁相环时钟=2*16*(8+1)/(1+1)=144MHz
        REFDV = 1;                //REFDV范围为0~63
       
        SYNR = 8;                        //SYNR范围为0~15
               
        _asm(nop);
        _asm(nop);
        _asm(nop);                //等待锁相环稳定

        while(!(CRGFLG&0X08));        //when pll is steady ,then use it;
                                        //选定锁相环位,Bus Clock=PLLCLK/2;
        CLKSEL = 0X80;          //总线时钟=144/2=72MHz
               
}

void Init_PLL_80M(void)
{                                       
        CLKSEL=0X00;                // disengage PLL to system
                PLLCTL_PLLON=1;            // turn on PLL
                                        //PLLCLK=2*OSCCLK*(SYNR+1)/(REFDV+1)
                                        //锁相环时钟=2*16*(9+1)/(1+1)=160MHz
        REFDV = 1;                //REFDV范围为0~63
       
        SYNR = 9;                        //SYNR范围为0~15
               
        _asm(nop);
        _asm(nop);
        _asm(nop);                //等待锁相环稳定

        while(!(CRGFLG&0X08));        //when pll is steady ,then use it;
                                        //选定锁相环位,Bus Clock=PLLCLK/2;
        CLKSEL = 0X80;          //总线时钟=160/2=80MHz
               
}

void Init_PLL_88M(void)
{                               
        CLKSEL=0X00;                // disengage PLL to system
                PLLCTL_PLLON=1;            // turn on PLL
                                        //PLLCLK=2*OSCCLK*(SYNR+1)/(REFDV+1)
                                        //锁相环时钟=2*16*(10+1)/(1+1)=176MHz
        REFDV = 1;                //REFDV范围为0~63
       
        SYNR = 10;                        //SYNR范围为0~15
               
        _asm(nop);
        _asm(nop);
        _asm(nop);                //等待锁相环稳定

        while(!(CRGFLG&0X08));        //when pll is steady ,then use it;
                                        //选定锁相环位,Bus Clock=PLLCLK/2;
        CLKSEL = 0X80;          //总线时钟=176/2=88MHz
               
}
void Init_PLL_96M(void)
{                               
        CLKSEL=0X00;                // disengage PLL to system
               PLLCTL_PLLON=1;            // turn on PLL
                                        //PLLCLK=2*OSCCLK*(SYNR+1)/(REFDV+1)
                                        //锁相环时钟=2*16*(11+1)/(1+1)=192MHz
        REFDV = 1;                //REFDV范围为0~63
       
        SYNR = 11;                        //SYNR范围为0~15
               
        _asm(nop);
        _asm(nop);
        _asm(nop);                //等待锁相环稳定

        while(!(CRGFLG&0X08));        //when pll is steady ,then use it;
                                        //选定锁相环位,Bus Clock=PLLCLK/2;
        CLKSEL = 0X80;          //总线时钟=192/2=96MHz
               
}
void Init_PLL_104M(void)
{                               
        CLKSEL=0X00;                // disengage PLL to system
                PLLCTL_PLLON=1;            // turn on PLL
                                        //PLLCLK=2*OSCCLK*(SYNR+1)/(REFDV+1)
                                        //锁相环时钟=2*16*(12+1)/(1+1)=208MHz
        REFDV = 1;                //REFDV范围为0~63
       
        SYNR = 12;                        //SYNR范围为0~15
               
        _asm(nop);
        _asm(nop);
        _asm(nop);                //等待锁相环稳定

        while(!(CRGFLG&0X08));        //when pll is steady ,then use it;
                                        //选定锁相环位,Bus Clock=PLLCLK/2;
        CLKSEL = 0X80;          //总线时钟=208/2=104MHz
               
}
void Init_PLL_120M(void)
{
        CLKSEL=0X00;                // disengage PLL to system
                PLLCTL_PLLON=1;            // turn on PLL
                                        //PLLCLK=2*OSCCLK*(SYNR+1)/(REFDV+1)
                                        //锁相环时钟=2*16*(14+1)/(1+1)=240MHz
        REFDV = 1;                //REFDV范围为0~63
       
        SYNR = 14;                        //SYNR范围为0~15
               
        _asm(nop);
        _asm(nop);
        _asm(nop);                //等待锁相环稳定

        while(!(CRGFLG&0X08));        //when pll is steady ,then use it;
                                        //选定锁相环位,Bus Clock=PLLCLK/2;
        CLKSEL = 0X80;          //总线时钟=240/2=120MHz
               
}

3

主题

16

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
323
QQ
威望
268
贡献
51
兑换币
8
注册时间
2011-6-9
在线时间
2 小时
2#
发表于 2011-12-26 22:58:49 | 只看该作者
9s12xs频率能达到百兆以上吗?
回复 支持 反对

使用道具 举报

11

主题

59

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1296
威望
746
贡献
292
兑换币
96
注册时间
2012-1-10
在线时间
129 小时
3#
发表于 2012-2-11 20:44:20 | 只看该作者
可以,我超到了!!!
回复 支持 反对

使用道具 举报

9

主题

93

帖子

0

精华

高级会员

Rank: 4

积分
706
威望
454
贡献
118
兑换币
0
注册时间
2012-2-1
在线时间
67 小时
4#
发表于 2012-3-8 19:57:26 | 只看该作者
略懂!
回复 支持 反对

使用道具 举报

14

主题

41

帖子

0

精华

高级会员

Rank: 4

积分
530
QQ
威望
288
贡献
132
兑换币
6
注册时间
2012-1-6
在线时间
55 小时
5#
发表于 2012-4-3 21:21:33 | 只看该作者
bu  dong
回复 支持 反对

使用道具 举报

5

主题

87

帖子

0

精华

高级会员

Rank: 4

积分
723
威望
374
贡献
213
兑换币
243
注册时间
2012-12-1
在线时间
68 小时
6#
发表于 2012-12-26 22:19:48 | 只看该作者
有那么长吗?
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

关于我们|联系我们|小黑屋|智能车制作 ( 黑ICP备2022002344号

GMT+8, 2024-12-28 06:12 , Processed in 0.061462 second(s), 28 queries , Gzip On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表