F28027的InitSysCtrl函数注释
void InitSysCtrl()
{
EALLOW; //edit allow
SysCtrlRegs.WDCR = 0x0068; // Disable the WatchDog
SysCtrlRegs.PCLKCR0.bit.ADCENCLK = 1; // Enable ADC peripheral clock
(*Device_cal)(); // Calibrate the internal oscillators and ADC
SysCtrlRegs.PCLKCR0.bit.ADCENCLK = 0; // Return ADC clock to original state
EDIS;
// CLKIN = OSCCLK x 12 / 2
if(!SysCtrlRegs.PLLSTS.bit.MCLKSTS){ // Device is not in limp mode
if(SysCtrlRegs.PLLCR.bit.DIV != 12){
EALLOW;
SysCtrlRegs.PLLSTS.bit.MCLKOFF = 1; // Turn off missing clock detect before setting PLLCR
SysCtrlRegs.PLLSTS.bit.DIVSEL = 0;// 1/4,PLLSTS[DIVSEL] must be 0 before write PLLCR,
SysCtrlRegs.PLLCR.bit.DIV = 12;
EDIS;
while(!SysCtrlRegs.PLLSTS.bit.PLLLOCKS); // Wait until PLL has locked
EALLOW;
SysCtrlRegs.PLLSTS.bit.DIVSEL = 2;// 1/2,you can modify PLLSTS only after PLL is locked,
SysCtrlRegs.PLLSTS.bit.MCLKOFF = 0; // Turn on missing clk detect
EDIS; //edit disable
/*********************************************************************
*after reset,the clock resource is INOSC1 which is 10MHz,and the above
*several codes set PLLCR.bit.DIV 12 and PLLSTS.bit.DIVSEL 2,the
*the CLKIN is (OSCCLK*12)/2 = 60MHz.
***********************************************************************/
}
}
else{ // If the PLL is in limp mode, shut the system down
// Replace this line with a call to an appropriate
// SystemShutdown(); function.
//Example_Error(101);
SCI_Reg[MT_BL_REG_UPDSTATUS] |= MT_BL_ERR_OTHER;
while(1);
}
}
首先是去能看门狗电路,然后要调用Device_cal这个函数校准时钟,但是,在校准时钟之前要首先使能ADC,然后校准完时钟之后再去能ADC,然后就是配置CPU的时钟输入是多少,首先时钟源,在DSP内部有两个振荡器,都是10MHz的,如果你设置时钟源寄存器,那么上电之后默认的时钟源是内部的晶体振荡器1,也就是10MHz,然后 设置PLL的分频一类的东西,这里设置的是 // CLKIN = OSCCLK x 12 / 2,其中CLKIN就是输入到内核的时钟,然后OSCCLK就是内部晶体振荡器的时钟,设置的时候首先检测是不是工作在limp模式,只有不是工作在limp模式的时候才能设置PLL,然后在设置SysCtrlRegs.PLLCR.bit.DIV = 12;之前必须要首先把SysCtrlRegs.PLLSTS.bit.DIVSEL = 0;另外下面在修改SysCtrlRegs.PLLSTS.bit.DIVSEL = 2的时候,要等待PLL锁定之后才能修改,所以前面加上了一个while循环。相关的寄存器以及时钟框图的说明可以看自己下载的那个中文的芯片手册的那一章。
EALLOW: edit allow
EDIS: edit disable
TI的DSP为了提高安全性能,将很多关键寄存器作了保护处理。通过状态寄存器1(ST1)的位6设置与复位,来决定是否允许DSP指令对关键寄存器进行操作。这些关键寄存器包括:器件仿真寄存器、FLASH寄存器、CSM寄存器、PIE矢量表、系统控制寄存器、GPIOMux寄存器、eCAN寄存器的一部分。
DSP由于在上电复位之后,状态寄存器基本上都是清零,而这样的状态下正是上述特殊寄存器禁止改写的状态。为了能够对这些特殊寄存器进行初始化,所以在对上述特殊寄存器进行改写之前,一定要执行汇编指令asm(“EALLOW”)或者宏定义EALLOW来设置状态寄存器1的C6位,在设置完寄存器之后,一定要注意执行汇编指令asm(“EDIS”)或者宏定义EDIS来清除状态寄存器1的C6位。
作者:cumtchw
出处:http://www.cnblogs.com/cumtchw/
我的博客就是我的学习笔记,学习过程中看到好的博客也会转载过来,若有侵权,与我联系,我会及时删除。