在bootloader里驱动DM9000

原以为很简单的事,自从调通简单的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

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值