|
“简简单单DSP”系列学习活动第三期IO口的学习及使用之时钟学习
在开始学习GPIO前,我们先了解一下DSP281x的时钟,因为只有在时钟的驱动下,它才能跑起来。
大家打开任何一个281X的工程都会看到主函数里最前面有这么几句:
- void main()
- {
- InitSysCtrl();
- DINT;
- IER = 0x0000;
- IFR = 0x0000;
- InitPieCtrl();
- InitPieVectTable();
- }
复制代码
既然每一个工程的主函数中都包括这几句,那么这几句必然是非常重要的。那么第一句肯定是这里面最最重要的,下面我们就开始学习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/B,SPI,McBSP
eCAN直接由CPU输出时钟SYSCLKOUT驱动
4、外设时钟时能C代码,代码段在DSP281X_SysCtrl.c
- void InitPeripheralClocks(void)
- {
- EALLOW;
- // HISPCP/LOSPCP prescale register settings, normally it will be set
- to default values
- SysCtrlRegs.HISPCP.all = 0x0003;
- /*HSPCLK=SYSCLKOUT/(2xHISPCP),如果HISPCP=0的话,HSPCLK=SYSCLKOUT。
- HISPCP是3位有效,此例HSPCLK=SYSCLKOUT/(2x3)*/
- SysCtrlRegs.LOSPCP.all = 0x0002;
- /*LSPCLK=SYSCLKOUT/(2xLOSPCP),如果LOSPCP=0的话,LSPCLK=SYSCLKOUT。
- LOSPCP是3位有效,此例LSPCLK=SYSCLKOUT/(2x2)*/
- // Peripheral clock enables set for the selected peripherals.
- SysCtrlRegs.PCLKCR.bit.EVAENCLK=1;
- SysCtrlRegs.PCLKCR.bit.EVBENCLK=1;
- SysCtrlRegs.PCLKCR.bit.SCIAENCLK=1;
- SysCtrlRegs.PCLKCR.bit.SCIBENCLK=1;
- SysCtrlRegs.PCLKCR.bit.MCBSPENCLK=1;
- SysCtrlRegs.PCLKCR.bit.SPIENCLK=1;
- SysCtrlRegs.PCLKCR.bit.ECANENCLK=1;
- SysCtrlRegs.PCLKCR.bit.ADCENCLK=1;
- EDIS;
- }
复制代码
5、振荡器和锁相环
CPU时钟输入引脚是X1/XCLKIN和X2,有两种模式,一种是外部时钟,一种是晶振工作方式,靠GPIOF14接高低电平来选择。GPIOF14复位后为低电平,选择外部钟源,X2引脚没有用,悬空;GPIOF14复位后为高电平,选择晶振模式,X1/XCLKIN和X2连接到无源晶振的两个引脚,2812选择30M,负载电容选择10P.内部振荡器和外部晶振一起工作产生CPU时钟。在外部时钟源的模式下,内部PLL被禁止,外部时钟直接输入到CPU.在晶振模式下,晶振时钟先过PLL倍频,然后给CPU.CPU再把相同频率的时钟输出给外设,这就和上面外设时钟设置先联系了。
6、PLL倍频初始化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位的看门狗计数器达到最大值而溢出,看门狗模块就产生一个512个OSCCLK周期宽的脉冲,使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学习小组~!
|
|