今天看了一天的寄存器,把一些心得分享给大家,希望大家批评指正。
可能看到的东西有10分能理解的只有8分,能到总结好记住的不到五分,最后由于个人能力问题写到文档上的可能不到2分了,内容过于粗浅大家见谅。
you need to download Modified the inf file from:http://www.coocox.org/tools/patch/colinkex.inf, then do the following operation:
1.Open the Installation folder: replace the inf file with the new one.
2.Delete the file:dpinst.xml.
3. run dpinst_amd64.exe.
PS: Only Windows 64bit OS need to do the replacement.
For Nepi: Please do the same operation.If the driver is unable to be installed on vista 64bit, connect us.
We will release a new driver in a few days.
好了下面开始分析程序,在keil下建立工程就会生成对应的引导文件,也就是汇编写的,怎么引导c代码,这里掠过。
开始第一个main();
int main(void)
{
SystemInit();
GPIOInit();
CLKOUT_Setup(CLKOUTCLK_SRC_MAIN_CLK);
/*这个主要是要设置CLKOUT,WDT CLOCK,SPI,UART,等输出时钟*/
while(1)
{
}
}
好了啃掉第一个函数SystemInit(),这里涉及到各种寄存器都要亲自动手去看芯片手册,
void SystemInit (void)
{
uint32_t i;
LPC_SYSCON->SYSMEMREMAP = 0x2;
/*这个函数是内存映射函数,0x2,是将flash映射到0x0地址,我看了一下手册,发现flash就在0x0地址,所以只要程序下载到flash中就可以运行,(注意,程序默认从0x0地址开始执行的)*/
LPC_SYSCON->SYSOSCCTRL = 0x00;
/*系统晶振选择,0x00 是默认值,频率范围是1-20MHz*/
LPC_SYSCON->PDRUNCFG &= ~(0x1<<5);
/*这个用来设置power-down 的,不知道怎么翻译好了,大家应该都懂得,这种表示是将第六位清零,其他位保持不变第六位是SYSOSC_PD 系统晶振*/
for ( i = 0; i < 0x100; i++ );
/*等待200us */
Main_PLL_Setup();
/*又遇到一个函数,这个函数是对时钟进行设置的,上面选择了晶振然后设置时钟很正常的思路,具体解释看下面*/
LPC_SYSCON->SYSAHBCLKCTRL |= (1<<16);
/*使能IO时钟,注意,这里没有使能其他时钟,如果要用其他设备,可以在下面添加使能代码*/
return;
}
void Main_PLL_Setup ( void )
{
uint32_t regVal;
ClockSource = OSC_CLK;
LPC_SYSCON->SYSPLLCLKSEL = MAIN_CLKSRCSEL_Val; /* Select system OSC */
LPC_SYSCON->SYSPLLCLKUEN = 0x01; /* Update clock source */
LPC_SYSCON->SYSPLLCLKUEN = 0x00; /* toggle Update register once */
LPC_SYSCON->SYSPLLCLKUEN = 0x01;
while ( !(LPC_SYSCON->SYSPLLCLKUEN & 0x01) ); /* Wait until updated */
/*这一部分是选择时钟源的,将SYS-PLL时钟源设置为 System 晶振,并更新时钟源*/
regVal = LPC_SYSCON->SYSPLLCTRL;
regVal &= ~0x1FF;
LPC_SYSCON->SYSPLLCTRL = (regVal | (MAIN_PLL_P_Val<<5) | MAIN_PLL_M_Val);
LPC_SYSCON->PDRUNCFG &= ~(0x1<<7);
/*这个用来设置power-down 的,第八位代表 SYSPLL_PD晶振*/
while ( !(LPC_SYSCON->SYSPLLSTAT & 0x01) );
LPC_SYSCON->MAINCLKSEL = 0x03;
LPC_SYSCON->MAINCLKUEN = 0x01;
LPC_SYSCON->MAINCLKUEN = 0x00;
LPC_SYSCON->MAINCLKUEN = 0x01;
while ( !(LPC_SYSCON->MAINCLKUEN & 0x01) );
/*这一部分是选择时钟源的,将MAINCLK 时钟源设置为 PLL clock,并更新时钟源*/
LPC_SYSCON->SYSAHBCLKDIV = SYS_AHB_DIV_Val;
SystemFrequency = ClockSource * (MAIN_PLL_M_Val+1);
SystemAHBFrequency = (uint32_t)(SystemFrequency/SYS_AHB_DIV_Val);
return;
}