Chinaunix首页 | 论坛 | 博客
  • 博客访问: 379601
  • 博文数量: 87
  • 博客积分: 983
  • 博客等级: 准尉
  • 技术积分: 685
  • 用 户 组: 普通用户
  • 注册时间: 2012-06-25 07:20
文章分类

全部博文(87)

文章存档

2016年(1)

2015年(3)

2014年(55)

2013年(13)

2012年(15)

分类: 嵌入式

2014-01-28 19:13:42

一、设置时钟:
本板子是外接的12MHz晶振。通PLL(设置MPLLCON寄存器的)倍频到200MHz,并设置时钟分频比(CLKDIVN寄存器)为
FCLK:HCLK:PCLK = 1:2:4 。s3c2440手册clock中有这么一个note:If HDIVN is not 0, the CPU bus mode has to be changed from the fast bus mode to the asynchronous bus mode using following instructions(S3C2440 does not support synchronous bus mode).                             
    mrc p15,0,r0,c1,c0,0
    orr r0,r0,#R1_nF:OR:R1_iA
    mcr p15,0,r0,c1,c0,0
 If HDIVN is not 0 and the CPU bus mode is the fast bus mode, the CPU will operate by the HCLK.
#R1_nF:OR:R1_iA之类的是什么东东。对协处理器不懂,网上搜了下,也转载了一篇文章,在这copy过来主要注释,
mrc p15,0,r0,c1,c0,0是用于读取控制寄存器C1到R0中。orr r0,r0,#R1_nF:OR:R1_iA的意义就是先判断R1_nF是否为1,如为1,则对C1的nF位做或运算,也即把CPU的时钟模式设置为Synchronous模式;如为0,则对C1的iA位做或运算,也即把CPU的时钟模式设置为FastBus模式,接着通过mcr     p15,0,r0,c1,c0,0语句把运算后的结果写回C1控制寄存器。最终个得到#R1_nF:OR:R1_iA 就是 #0xc0000000的意思。暂时先不对这个了解了,先顾全大局了,若有高手,还请不吝赐教。
    
二、SDRAM的几个难点:
1. 看s3c2440手册第五章内存控制器时,那个列表不是很清楚,经过查阅资料和分析如下解释,记下笔记便于以后查阅。


SDRAM 一般分为4个逻辑bank(L-Bank)。
以 H57V2562GTR 为例, 其容量为 256Mbit (16Mbit * 16bit 即 4Mb * 4Bank * 16I/O)  使用 两片16H57V2562GTR ,并联成32
行地址数位13,列地址数位9. datasheet中并没有明确给定有多少行,关于L-Bank 行数的确定,看下面第二点的介绍。
Bank Size
外接内存容量大小(H57V2562GTR 是 4Mbit*16bit*4Bank*2Chips/8=64MB)注意,Bank Size 中的Bank 和前面说4Bank 中的 Bank 不是一回事。
Bus Width: 总线宽度:32bit (应该是两片16H57V2562GTR 并联后的32位)
Base Component单个芯片容量(bit)256Mb
Memory Configration内存配置 (4M * 16b * 4Banks* 2Chips )

Bank Address:4 个 bank 的选择位

2.关于SDRAM的刷新周期
SDRAM要隔多长时间重复一次刷新呢?目前公认的标准是,存储体中电容的数据有效保存期上限是64ms(毫秒,1/1000秒),也就是说每一行刷新的循环周期是64ms。这样刷新速度就是:行数量/64ms。我们在看内存规格时,经常会看到4096 Refresh Cycles/64ms或8192 Refresh Cycles/64ms的标识,这里的4096与8192就代表这个芯片中每个L-Bank的行数。刷新命令一次对一行有效,发送间隔也是随总行数而变化,4096行时为15.625μs(微秒,1/1000毫秒),8192行时就为7.8125μs。

三、串口
编译,烧写,启动板子,出现乱码,可能是串口的寄存器(波特率与时钟方面)设置的不对,查找其波特率的设置,在get_PLLCLK()函数处发现错误(get_HCLK()函数设置也不对,需要对照改下),最后一行改成 return (2 * CONFIG_SYS_CLK_FREQ * m) / (p * 2 << s));重新烧写,仍旧出现乱码,找了半天,看了别人的文档才发现上面那没改对,犯了两个超2b的错误:首先手册是这样写的 "Mpll = (2 * m * Fin) / (p * 2^s)".第一个错误就是优先级弄错了,"*"的优先级大于"<<";第二个就是对左移运算掌握的不熟了,左移n位就相当于"*2^n" 而"<< s"就是"2*2^s",自然就不对了,修改正确后,编译、烧写,OK。
阅读(1025) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~