原以为很简单的事,自从调通简单的bootloader后,已经实现跳转到c程序,我想控制起来应该就简单多了
哪知道,费了4 5天了就是认不到DM9000,从怀疑地址不是0x20000300, 怀疑时钟频率不对,怀疑memory control设置的有问题。
哪想到最后却是因为c语言里 u16* 和 u8* 对寄存器赋值的区别,造成没有读到值,其实参数都设对了,不过折腾也好,倒是把时钟频率的设置好好学了一遍。接下来就来说说
我们知道每个CPU都需要一个时钟输入,而主板上一般就只有一个固定频率的晶振提供时钟,比如12MHz,而对于CPU需要的200M,400Mhz,就需要针对原始频率不断分频来得到,而相对于CPU主频,一般还有总线的主频,比如主管内存时钟的HCLK ,主管UART等接口的PCLK,所以一般确定CPU主频,通过MDIV 主分频, PDIV SPIV,来确定,公式如下
#define vMPLLCON_NOW_USER ((MDIV_400_148 << 12) | (PDIV_400_148 << 4) | (SDIV_400_148)) /*FCLK = (MDIV+8)*FIN / ((PDIV+2 )* 2^SDIV) */
得到CPU主频后,再确定HCLK,PCLK 公式如下,由CLKDIVN寄存器决定
#define vCLKDIVN_NOW CLKDVIN_400_148 /*bit2 1 1:1/4:1/4 bit1 1 HCLK=1/2FCLK bit0 1PCLK=1/2HCLK 1:1/4:1/8*/
这3个频率确定后,就可以计算内存的刷新率,公式如下
#define vREFRESH vREFRESH_400_148 /*0x008e0000 + (2^11 + 1 - HCLK (MHz) * (7.8125 us) ) 7.8125 = 8192 cycles/64ms*/
还可以确定指定波特率下 UART的分频寄存器该如何设置,公式如下
/*uBRDIV #define UART_BRD ((UART_PCLK / (UART_BAUD_RATE * 16)) - 1) */
这样,基本上就把几个跟时钟相关的寄存器都设置好了
另外一个是时序的问题,在设置BANKCON4的时候用到,具体可参考下面这篇文章,讲得挺清晰的。
http://blog.chinaunix.net/u1/57901/showart_2023852.html