分类:
2007-03-08 16:26:53
禁止看门狗——》在中断控制器中屏蔽所有中断——》系统时钟设置——》初始化端口——》DMA设置——》cashe和总线设置——》存储器设置,初始化SDRAM——》初始化堆栈——》设置IRQ和FIQ的入口——》地址重映射
通常系统初始化有两个阶段组成,分别为汇编和C写成。汇编应尽量简单一些,把更多的任务交给C来做,这样可增加整个程序的可读性和灵活性。必须由汇编来完成的任务有:异常中断向量表的设置、IRQ向量表(向量模式)或ISR初始化(非向量模式)、二级ISR地址表的定义、Flash和SDRAM的设置(否则系统无法加载代码)、堆栈设置和模式切换、拷贝RW和ZI代码、设置系统时钟等。而端口初始化、cashe和总线的设置、DMA配置以及其它控制器如LCD、UART、SIO、IP等可以在C中第二阶段初始化程序完成,另外也可以继续更改时钟或存储器配置等。下面是几个关键步骤配置的注意事项。
看门狗设置
watch dog即可以作为普通的timer以产生周期性的中断,也可以周期性的产生reset信号(如果每隔一定时间不被清除的话),以防治程序跑飞。
系统时钟的初始化:
至少设置三个寄存器:LOCKTIME,PLLCON,LOCKCON。
LOCKTIME,地址0x01D8000C。用于指定PLL的初始化时间,在PLL初始化时,系统时钟为晶振输入或外部时钟直接提供,即MCLK=Fin;初始化完成后,切换,MCLK=Fout。初始值为0xfff=4095个输入时钟周期。一般将其设为初始值。
PLLCON,,地址0x01D80000。设置MDIV,PDIV,SDIV三个值,用于确定Fout和Fin的频率分配比值:Fout = (m * Fin) / (p * 2s),其中
m = (MDIV + 8), p = (PDIV + 2), s = SDIV
典型的几个值如下:
No. |
Fin |
Fout |
MDIV |
PDIV |
SDIV |
1 |
10Mhz |
40Mhz |
0x48 |
0x3 |
0x2 |
2 |
10 |
50 |
0x2a |
0x3 |
0x1 |
3 |
10 |
60 |
0x34 |
0x3 |
0x1 |
4 |
4 |
60 |
0x34 |
0x0 |
0x1 |
5 |
3 |
60 |
0x48 |
0x0 |
0x1 |
6 |
10 |
75 |
0x3a |
0x3 |
0x1 |
CLKCON,地址0x01D80004。用于设置是否向外设提供时钟,一般设为默认值0x7ff8,即所有外设提供时钟。
存储器初始化(尤其是SDRAM):
ARM7TDMI的地址映射如下:
(在ARM体制中,所有的各种内、外存储器,外设,寄存器,cashe,write buffer,通用IO口等全都采用统一编址)
注:0x10000000~0x100047f0为内部cashe/sram 及其Tag和LRU的地址。
BANK0~BANK5为ROM/SRAM/FLASH,
BANK6~BANK7为SDRAM/ROM/SRAM/FLASH
要设置的寄存器如下:
BWSCON:BANK0~BANK7的UB/LB使能、Wait信号使能、数据线宽度;
BANKCON0~BANKCON5:各bank(flash或Sram)的访问时序控制。flash或Sram主要参数如下所示:
Tacs [14:13] Address set-up before nGCSn
Tcos [12:11] Chip selection set-up nOE
Tacc [10:8] Access cycle
Toch [7:6] Chip selection hold on nOE
Tcah [5:4] Address holding time after nGCSn
Tpac [3:2] Page mode access cycle @ Page mode
PMC [1:0] Page mode configuration
不同厂家、性能、速度的器件设置有所不同。
BANKCON6~BANKCON7:主要用于SDRAM,当然也可以是Flash或SRAM。SDRAM的时序控制稍微复杂,还有:
Trcd [3:2] RAS to CAS delay
SCAN [1:0] Column address number
当然也可用于DRAM。
REFRESH 地址: 0x01C80024,DRAM/SDRAM的更新控制寄存器;
MRSRB6 ~MRSRB7:DRAM/SDRAM的模式控制寄存器,这个寄存器在系统初始时,即SDRAM使用前必须被有效地的设置。
这几个寄存器的设置比较复杂,应仔细阅读Samsang(page168)的数据手册和相关存储器的资料。
一个典型的配置如下:
ldr r0, =SMRDATA
ldmia r0, {r1-r13}
ldr r0, =0x01c80000 ; BWSCON Address
stmia r0, {r1-r13}
SMRDATA DATA
DCD 0x11222220 ; BWSCON Bank0=OM[1:0],8bits宽 Bank1~Bank5=32bit,Bank6~Bank=16bit,不使用UB/LB信号,WAIT disable; 使用little Endian存储格式
DCD 0x000056A8; GCS0 :Tacs=2clk;Tcos=2clk;Tacc=10clk;
Toch=2clk;Tcah=2clk;Tpac=4clk;PMC=normal(1data)
DCD 0x00000700 ; GCS1 除了Access cycle为14个clk外,其它均为0clk
DCD 0x00000700 ; GCS2
DCD 0x00000700 ; GCS3
DCD 0x00000700 ; GCS4
DCD 0x00000700 ; GCS5
DCD 0x00018005 ; GCS6, SDRAM;RAS to CAS delay 2 clk;Column address number:9bits
DCD 0x0001002a ; GCS7, EDO DRAM(Trcd=3, Tcas=2, Tcp=1, CAN=10bit)
DCD 0x00870441 ; Refresh enable;Auto Refresh; Trp=3, Trc=5, Tchr=3;
刷新计数:1019
DCD 0x17 ; SCLK power down mode enable;Bank6&7 Size, 16MB/16MB
DCD 0x20 ; MRSR 6:CAS Latency=2clk;burst type为线性(不支持交织访问);
burst number:1bit(不支持促发读写)
DCD 0x20 ; MRSR 7(CL=2)
注:三星的实验板中在nGCS0外接Flash,型号为SST39VF160,其datasheet中有其读写时序的详细说明和各种时间值的最大或最小值,但均以ns为单位,且各时间值的名称也与寄存器的要求不完全相同。要使Flash达到最优设置,必须读懂其时序并按其推荐值设置寄存器。显然这并不是件容易的事情。在本次实验板的boot程序中,其各时序值均是最大值给出。参见memcfg.h文件。
三星的实验板中在nGCS6外接SDRAM,型号为IC42S16800-7T,(4096ROW*512COLUM*4Bank*16bits=128Mbits=16MB)
由上面的例子可以看出需要设置的参数为:1.Banksize,UB/LB,WAITenable/disable,large/little Endian;
2.RAS to CAS delay, Column address number;
3.Refresh enable/disable,Auto/self refresh, SDRAM RAS pre-charge Time, SDRAM RC minimum Time, Refresh Counter;
4.power down mode,banksize;
4.CAS Latency,burst type,burst number。
Refresh counter的设置:Refresh period = (211-refresh_count+1)/MCLK
Ex) If refresh period is 16 us and MCLK is 60 MHz,
the refresh count is as follows;
refresh_count = 211 + 1 - 60x16 = 1089
上面的例子只是对Flash和SDRAM的一个经验设置值,可能不是最优的。最优设置还必须参考器件的数据手册。尤其是对于SDRAM的RAS to CAS delay、SDRAM RAS pre-charge Time、SDRAM RC minimum Time三个时序值。
特别注意:在线调试阶段,在AXD软件中必须引入对SDRAM初始化的seesion文件或ini文件,或者在command interface中敲入所需的配置命令(在load image之前完成),并且最后注释掉reset汇编程序中的初始化SDRAM的命令。否则程序就可能跑飞。而生成要下载的flash程序代码时,则系统reset时就必须完成此功能。
端口初始化
ARM的大部分信号在同一端口是功能复用的。为此初始化时必须指定各PA~PG口的各管脚的功能。在实验板根据外围器件的选择对各端口做如下配置:
PA(10bits):全部用作高端地址线;PCONA=0x3ff
PB(11bits):全部用作存储器控制信号;PCONB=0x7ff
PC(16bits):4~7用于LCD的VD4~VD7;12,13用于UART的TXD1,RXD1(注意:这里的UART没有使用CTS、RTS信号,只用了TX、RX);其它全部用于通用IO口,GPC0~3用于IIS;GPC10和14用于NAND Flash;GPC15用于USB Device;GPC8、9用于LCD;GPC11暂时没用。PCONC=0x5f55ff55.(这里假定IO口全为output,实际应用时再确认一下是In或是out)
PD(8bits):全部用于LCD的控制信号。PCOND=0xaaaa。
PE(9bits):8用于Endian,确定存储器格式;1,2分别为TXD0,RXD0;0,3~7用于通用IO口(暂定output),PE3用于蜂鸣器;PE4~7用于LED显示。PCONE=0x05569。
PF(9bits):0、1用于IIC总线的SCK、SDA信号;其它均为通用IO口(暂定output),其中GPF2~4用于IDE,GPF5~8用于触摸屏。PCONF=0x09255a。
PG(8bits):全部用于外部中断EXINT0~7。PCONG=0xffff。
注意:上述端口分配是S3C44b0x测试板(勤研电子)的分配情况。
另外还有下面几个寄存器需要设置:
上拉电阻寄存器,包括一些端口和数据线;
EXTIN:设置8个外中断的触发方式,low,high,rising or falling edge等。
EXTINTPND:中断待处理寄存器,用于解决EXTINT4~7共享一个中断源的问题。
Cache&Bus设置
通过内部寄存器可以设置cashe mode(cashe和sram),write buffer,non-cashable area,以及bus的优先级等。
通常,在一般的用户程序中不使用cashe(即全部用作Sram),禁用write buffer,bus优先级选择默认就可以了,即1. DRAM refresh controller-2. LCD_DMA-3. ZDMA0,1-4. BDMA0,1-5. External bus master-6. Write buffer-7. Cache & CPU。
只配置一下SYSCFG:0x0。