从简单的谈起吧。
1、程序先进行了HWREG(SYSCTL_MWRALLOW) = 0xA5A5A5A5; 因为 //必须写入0xA5A5A5A5,之后才能够改写一些被MWRALLOW保护的寄存器
关于哪些寄存器被保护可以参考1.13.1 System Control, Configuration Register Map
2、之后进行了 SysCtlClockConfigSet(SYSCTL_USE_PLL | (SYSCTL_SPLLIMULT_M & 0xA) |
SYSCTL_SYSDIV_1 | SYSCTL_M3SSDIV_1 |
SYSCTL_XCLKDIV_4);
//设置 PLL,PLLSYSCLK=200M,M3 = 100MHz and = 100MHz,XPLLCLKOUT=50MHZ
//SysCtlClockConfigSet(unsigned long ulConfig)
//bits 21, 20 of ulConfig 代表SYSDIVSEL,设定C28X内核的速度是PLLSYSCLK除1、2、4、8,这里设为1
//bits 19, 18 of ulConfig 代表M3SSDIVSEL,设定M3内核的速度是PLLSYSCLK除1、2、4,,这里设为1
//bits 17, 16 of ulConfig 代表XPLLCLKCFG,设定XPLLCLKOUT的速率为PLLSYSCLK除1、2、4,这里设为4
//bits 9-0 of ulConfig 代表SYSPLLMULT的整数和小数部分,这里设为10;PLLSYSCLK = Fref * SYSPLLMULT /2 /SYSDIVSEL divider,
//bit 31 of ulConfig代表SYSPLLCTL[0],允许PLL上电
3、 SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOC);
// 用于设定Run Mode Clock Gating Control Register (RCGC)寄存器
4、 // 禁止看门狗模块
SysCtlPeripheralDisable(SYSCTL_PERIPH_WDOG1);
SysCtlPeripheralDisable(SYSCTL_PERIPH_WDOG0);
//允许中断
IntMasterEnable();
// 设置相应的GPIO引脚为输出状态,为推挽输出,无弱上拉.
GPIOPinTypeGPIOOutput(GPIO_PORTC_BASE, GPIO_PIN_7);
GPIOPinWrite(GPIO_PORTC_BASE, GPIO_PIN_7, ~0);
这个例程中唯一值得讨论的就是 SysCtlClockConfigSet
这个设置了F28M35的28X内核和M3内核的时钟。
Fout = Fref * SYSPLLMULT 在TI的开发板上,Fref=20MHZ,所以这里Fout =200MHZ
PLLSYSCLK = Fref * SYSPLLMULT /2 /SYSDIVSEL 给到28x内核SYSDIVSEL为1,也就是给28X内核的是100MHZ的时钟
M3SSCLK = Fref * SYSPLLMULT / 2 / SYSDIVSEL divider / M3SYSDIVSEL divider 设定M3内核的速度是PLLSYSCLK除SYSDIVSEL后除1、2、4,,这里设为1,也就是给M3内核的是100MHZ的时钟
XPLLCLKOUT = PLLSYSCLK/XPLLCLKOUTDIV 这里设为4,也就是给CLKOUT的是50MHZ的时钟
具体的可以看下面的图: