• 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/
    我的博客就是我的学习笔记,学习过程中看到好的博客也会转载过来,若有侵权,与我联系,我会及时删除。

  • 相关阅读:
    20169207 2016-2017-2 《移动平台应用开发实践》第五周学习总结
    20169212 2016-2017-2《网络攻防实践》第八周学习总结
    20169212 2016-2017-2 《网络攻防实践》第七周学习总结
    20169212 2016-2017-2 《网络攻防实践》第六周学习总结
    20169212 2016-2017-2 《网络攻防实践》第五周学习总结
    20169212 2016-2017-2 《网络攻防实践》第四周学习总结
    20169212 2016-2017-2 《网络攻防实践》第三周学习总结
    20169212 2016-2017-2 《网络攻防实践》第二周学习总结
    20169212《网络攻防实践》第一周学习总结
    20169212《Linux内核原理与分析》课程总结
  • 原文地址:https://www.cnblogs.com/cumtchw/p/7218473.html
Copyright © 2020-2023  润新知