13114|18

180

帖子

0

TA的资源

五彩晶圆(中级)

楼主
 

“简简单单DSP”系列学习活动——第三期 [复制链接]

“简简单单DSP”系列学习活动第三期IO口的学习及使用之时钟学习
在开始学习GPIO前,我们先了解一下DSP281x的时钟,因为只有在时钟的驱动下,它才能跑起来。
大家打开任何一个281X的工程都会看到主函数里最前面有这么几句:
  1. void main()
  2. {

  3. InitSysCtrl();

  4. DINT;

  5. IER = 0x0000;

  6. IFR = 0x0000;

  7. InitPieCtrl();

  8. InitPieVectTable();
  9. }
复制代码

既然每一个工程的主函数中都包括这几句,那么这几句必然是非常重要的。那么第一句肯定是这里面最最重要的,下面我们就开始学习InitSysCtrl()

InitSysCtrl()
是一个函数调用,这个子函数在DSP281X_SysCtrl.c中,它的功能是完成DSP的时钟及看门狗的初始化。

一、281x的时钟



1 DSP281X时钟图


281X
的时钟如图1所示,这个图是从TI的官方文档上截下来的,朋友们也可以看推荐的教材上的图。对这个图我进行以下分析,就会明白它的时钟结构。

1、外部晶振时钟首先输入到锁相环倍频,倍频后的时钟给CPU,同时CPU输出与输入频率一样的时钟,供给外设,即外设时钟是CPU的输出时钟
2、每一个外设都有自己的时钟控制单元,受EALLOW保护,应用到哪一个外设一定要把它的时钟控制位使能。
3、高速时钟、低速时钟
高速时钟HSPCLK:控制的外设有事件管理器EVA/B,ADC
低速时钟LSPCLK:控制SCIA/BSPIMcBSP
eCAN直接由CPU输出时钟SYSCLKOUT驱动
4、外设时钟时能C代码,代码段在DSP281X_SysCtrl.c
  1. void InitPeripheralClocks(void)
  2. {

  3. EALLOW;
  4. // HISPCP/LOSPCP prescale register settings, normally it will be set

  5. to default values

  6. SysCtrlRegs.HISPCP.all = 0x0003;
  7. /*HSPCLK=SYSCLKOUT/(2xHISPCP),如果HISPCP=0的话,HSPCLK=SYSCLKOUT。

  8. HISPCP是3位有效,此例HSPCLK=SYSCLKOUT/(2x3)*/


  9. SysCtrlRegs.LOSPCP.all = 0x0002;
  10. /*LSPCLK=SYSCLKOUT/(2xLOSPCP),如果LOSPCP=0的话,LSPCLK=SYSCLKOUT。

  11. LOSPCP是3位有效,此例LSPCLK=SYSCLKOUT/(2x2)*/

  12. // Peripheral clock enables set for the selected peripherals.


  13. SysCtrlRegs.PCLKCR.bit.EVAENCLK=1;

  14. SysCtrlRegs.PCLKCR.bit.EVBENCLK=1;

  15. SysCtrlRegs.PCLKCR.bit.SCIAENCLK=1;

  16. SysCtrlRegs.PCLKCR.bit.SCIBENCLK=1;

  17. SysCtrlRegs.PCLKCR.bit.MCBSPENCLK=1;

  18. SysCtrlRegs.PCLKCR.bit.SPIENCLK=1;

  19. SysCtrlRegs.PCLKCR.bit.ECANENCLK=1;

  20. SysCtrlRegs.PCLKCR.bit.ADCENCLK=1;

  21. EDIS;
  22. }
复制代码

5、振荡器和锁相环
CPU时钟输入引脚是X1/XCLKINX2,有两种模式,一种是外部时钟,一种是晶振工作方式,靠GPIOF14接高低电平来选择。GPIOF14复位后为低电平,选择外部钟源,X2引脚没有用,悬空;GPIOF14复位后为高电平,选择晶振模式,X1/XCLKINX2连接到无源晶振的两个引脚,2812选择30M,负载电容选择10P.内部振荡器和外部晶振一起工作产生CPU时钟。在外部时钟源的模式下,内部PLL被禁止,外部时钟直接输入到CPU.在晶振模式下,晶振时钟先过PLL倍频,然后给CPU.CPU再把相同频率的时钟输出给外设,这就和上面外设时钟设置先联系了。
6PLL倍频初始化C代码
void InitPll(Uint16 val)输入的是倍频的一半,即val=10,就是5倍频,150M.
{

volatile Uint16 iVol;

   

if (SysCtrlRegs.PLLCR.bit.DIV != val)


{

   

EALLOW;


SysCtrlRegs.PLLCR.bit.DIV = val;

/*PLLCR寄存器的DIV最后三位是设置倍频的,CPU的时钟CLKIN=F X

DIV/2,DIV=0时,CLKIN=F,F是外部晶振的频率*/

EDIS;


for(iVol= 0; iVol< ( (131072/2)/12 ); iVol++)


{

   

}

/*延时等待PLL配置完成*/

}

}
7、看门狗
2812里面有一个8位的看门狗计数器,一旦8位的看门狗计数器达到最大值而溢出,看门狗模块就产生一个512OSCCLK周期宽的脉冲,使DSP复位。DSP上电时看门狗是使能的,因此需要在主函数里面首先关闭看门狗,以免程序跑飞。
DisableDog();是屏蔽看门狗的程序,它在DSP281X_SysCtrl.c文件的void InitSysCtrl(void)函数中,mian首先调用的是void InitSysCtrl(void)函数,所以应该把DisableDog();放到void InitSysCtrl(void)函数的最前面,上电后首先屏蔽看门狗,
屏蔽看门狗的C代码:
void DisableDog(void)
{

EALLOW;


SysCtrlRegs.WDCR= 0x0068;


EDIS;

}
281x支持动态改变时钟频率,也就是动态改变倍频系数,但是一般情况下我们不会这么做,时钟初始化后就不去改变他了。281x最高工作频率可以达到150M,我们知道频率越高,抗干扰能力越差,因此他在内部设计了锁相环倍频,这样就可以减少外部干扰。再者就是为了降低功耗,用不到的外设就把它的时钟关掉。
时钟这一块很重要,但是它好操作,学起来也简单,我们也没有必要对了解的非常非常透,会设置就可以了。
这一期就谈这些,有什么问题积极讨论~!!


预祝大家学习进步,工作舒畅~
AQUA学习小组~


时钟.doc

72 KB, 下载次数: 354

最新回复

谢谢了,加深理解  详情 回复 发表于 2011-6-13 09:32
 
点赞 关注

回复
举报

180

帖子

0

TA的资源

五彩晶圆(中级)

沙发
 
欢迎跟贴讨论
 
 

回复

2498

帖子

0

TA的资源

至上芯片

板凳
 

回复 楼主 superwangyang 的帖子

void DisableDog(void)
{

EALLOW;

SysCtrlRegs.WDCR= 0x0068;

EDIS;
}


建议你解释一下wdcr的各个位,不然的话0X0068就没得来源。。。
 
个人签名我的邮箱gaoxiaoan123@163.com!回帖是一种美德!互相帮助,共同进步!
口头禅:生活在于创造机会,把握机会!
 
 

回复

180

帖子

0

TA的资源

五彩晶圆(中级)

4
 

回复 板凳 gaoxiao 的帖子

多谢版主关注,解释一下为什么是0x0068
WDCR是看门狗控制寄存器,
第0~2位(WDPS)是配置看门狗时钟的的。在WDPS=0时看门狗时钟WDCLK=OSCCLK/512/1,WDPS不等于0时,WDCLK=OSCCLK/512/2的WDPS次方
第3~5位必须写入101,否则立即引起看门狗复位
第6位 看门狗使能位 写1屏蔽看门狗,写0使能看门狗
第7位 复位状态标志位
第8~15位被保留,因此设置为0,
 
 
 

回复

7

帖子

0

TA的资源

一粒金砂(初级)

5
 

回复 楼主 superwangyang 的帖子

有个问题不解,请问下楼主。
函数 InitPll()  在初始化的时候,是一定要调用吗?我使用的例程里没调用此函数也可以正常运行,是不是2812复位后会自动初始化PLL?如果是,怎样初始化的?

然后,我希望写个CpuTimer0的中断程序,10ms中断一次。之前Timer0的设置是:
ConfigCpuTimer(&CpuTimer0,150 ,15000),晶振为30M,Freq设为150是否合理?中断周期应如何计算?

初学dsp,谢谢解答。
 
 
 

回复

180

帖子

0

TA的资源

五彩晶圆(中级)

6
 

回复 5楼 run4win 的帖子

你的例程里面没有调用InitPll() ,你看一下在你的例程里面会有跟InitPll() 里面代码一样的代码。复位后可能会有默认的值,但是默认值不一定和你的要求,所以要初始化,达到自己所需的时钟。定时器的应用在另一篇里面有详细的介绍,你自己找一下看看就明白了
 
 
 

回复

7

帖子

0

TA的资源

一粒金砂(初级)

7
 
我又试了试,好像是void ConfigCpuTimer(struct CPUTIMER_VARS *Timer, float Freq, float Period)中的Period就决定了周期,以us为单位。对吗?
 
 
 

回复

7

帖子

0

TA的资源

一粒金砂(初级)

8
 
楼主回的真快,太赞了~!!
懂了,找到那篇文章了,还是看的不认真,感谢!
 
 
 

回复

81

帖子

0

TA的资源

一粒金砂(中级)

9
 

回复 楼主 superwangyang 的帖子

void InitPll(Uint16 val)输入的是倍频的一半,即val=10,就是5倍频,150M.
{
   为什么输入的是倍频的一半???
  InitPll(6,DSP28_DIVSEL);  这个是多少? DSP28_DIVSEL 这个是什么意思?
 
 
 

回复

180

帖子

0

TA的资源

五彩晶圆(中级)

10
 

回复 9楼 votex威 的帖子

首先请您认真看一下我发的代码和你问的这个是否一样,再有你问的问什么是一半,这个你去看寄存器内容的,认真看一下就会明白了
 
 
 

回复

81

帖子

0

TA的资源

一粒金砂(中级)

11
 

回复 10楼 superwangyang 的帖子

终于明白了,,那个一半时/2模块,在PLL没屏蔽的情况下,倍频后值的一半才是输入的频率了。。嘿嘿!~
 
 
 

回复

11

帖子

0

TA的资源

一粒金砂(初级)

12
 

谢谢楼主

谢楼主分享学习经验,以后就跟你的贴子了,希望多贴啊。
 
 
 

回复

23

帖子

0

TA的资源

一粒金砂(初级)

13
 
先回复,再看贴,真是好东西 再论坛里多学习
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

14
 
for(iVol= 0; iVol< ( (131072/2)/12 ); iVol++)

为什么还要除以12呢?
DSP初学者,谢谢指导
 
 
 

回复

104

帖子

0

TA的资源

一粒金砂(中级)

15
 
dsp的学习任重而道远啊!
 
 
 

回复

104

帖子

0

TA的资源

一粒金砂(中级)

16
 
DSP初学者,谢谢指导
 
 
 

回复

104

帖子

0

TA的资源

一粒金砂(中级)

17
 
简简单单DSP
 
 
 

回复

104

帖子

0

TA的资源

一粒金砂(中级)

18
 
简简单单DSP
 
 
 

回复

38

帖子

1

TA的资源

一粒金砂(中级)

19
 

谢谢了,加深理解

 
 
 

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

查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/7 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表