时钟是DSP不可缺少的一部分,是运行的必要条件。
时钟输入:对于280x系列的dsp的时钟选择有多种,包括:
(1)晶体经过X1、X2输入:需要将CLKIN连接到参考地,否则在用FLASH运行程序时候,将无法运行。;
(2)外部时钟经过CLKIN引脚输入:允许时钟电压是3.3V。需要将X1引脚接到参考地。X2悬空。
(3)外部时钟经过X1引脚输入。允许时钟电压是1.8V。需要将CLKIN连接到参考地,X2悬空。
(4)而我用的没有焊接外部晶振,使用了内部晶振,那内部晶振有多大呢,那就要看数据手册了。
由图可知含有2个内部竞争,分别为10MHZ。
下面来看下系统初始化函数
InitSysCtrl();
(1)EALLOW;//EALLOW :仿真读取使能位。复位时,该位允许对仿真和其他寄存器进行读取
//一些配置寄存器是受保护的,无法直接操作。也就是说在对这些寄存器进行修改之前,
//需要先去掉保护功能 而保护状态是由状态寄存器中EALLOW标志来指示的。
//汇编指令“EALLOW”就是将该标志位置位,允许对受保护的寄存器操作 。
(2) IntOsc1Sel();//28027内部含2个内部晶振INTOSC1 INTOSC2
void IntOsc1Sel (void) {
EALLOW;
SysCtrlRegs.CLKCTL.bit.INTOSC1OFF = 0;
SysCtrlRegs.CLKCTL.bit.OSCCLKSRCSEL=0; // Clk Src = INTOSC1
SysCtrlRegs.CLKCTL.bit.XCLKINOFF=1; // Turn off XCLKIN
SysCtrlRegs.CLKCTL.bit.XTALOSCOFF=1; // Turn off XTALOSC
SysCtrlRegs.CLKCTL.bit.INTOSC2OFF=1; // Turn off INTOSC2
EDIS;
}
而所有寄存器的操作 都可以从上图中得到。
例如SysCtrlRegs.CLKCTL.bit.OSCCLKSRCSEL=0; // Clk Src = INTOSC1
(3) InitPll(DSP28_PLLCR,DSP28_DIVSEL);
也就是InitPLL(12,2);
#define DSP28_PLLCR 12 // Uncomment for 60 MHz devices [60 MHz = (10MHz * 12)/2]
其中提到的PLL的DIV以及DIVSEL等的含义都可以从如下表得到:
void InitPll(Uint16 val, Uint16 divsel)
函数中 SysCtrlRegs.PLLCR.bit.DIV = val;也就是12
DIVSEL=2,
所以频率为10MHZ*12/2=60Mhz
当然以上只是最基础的学习,进一步的还需要继续学习。