找回密码
 注册
关于网站域名变更的通知
查看: 316|回复: 1
打印 上一主题 下一主题

ARM体系结构与编程学习(9)

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2020-12-25 14:50 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x

SDRAM初始化过程如下:

1、加电

2、延迟指定时间,从第一个sdram的clk开始,通常为100us。具体值请参考SDRAM手册

3、延迟一些自动刷新周期,通常为两个

4、设置自动刷新寄存器

5、等待一定时间以后开始写模式寄存器

以下程序以L7205SDB为例

AREA   STARTUP  ,CODE, READONLY

           ENTRY

; f+ R9 D% h; u0 ^% V' i

start

        ;关中断

         LDR  R4,=0X90001000

         MVN  R5,#0

         STR   R5,[R4,#0X0C]

         STR   R5,[R4,#0X10C]


; B) q! q4 `% W" N2 V/ Q

         ;延时

         LDR  R4,=0XFF

01     SUBS  R4,R4,#0X01

         BNE   %B01     ;%B01表示向后搜索标号01


$ |9 P" U& v- ?7 i  J5 @

         ;1)NEXT寄存器

         LDR  R4,=0X80050004

         LDR  R5,=0X05FD4717

         STR  R5,[R4]

6 ^1 ~2 w# A# y- f! [3 ]

         ;2)运行寄存器

         LDR  R4,=0X8005000C

         LDR  R5,=0X014717

         STR  R5,[R4]

4 g4 L. ]& L6 ~% z

         ;3)命令寄存器

         LDR  R4,=0X80050010

         LDR  R5,=0X01

         STR  R5,[R4]

( {2 }( W+ F$ H8 c2 q. Y# Y

         ;4)设置enable

         LDR  R4, =0X80050030

         LDR  R5,[R4]

         0RR  R5,R5,#0X4

         STR  R5,[R4]


, ?; e. e( }1 p& T" [2 E

         ;5)延时200us

         MOV  R4,#0X1000

15    SUBS R4, R4,#1

         BNE   %B15

& x& a7 G7 K6 Y7 H4 g* j

         ;6)使能slot1、slot2的7、3位

         LDR  R4,=0XD0000000

         LDR  R5,[R4]

         ADD  R5,R5,#0X88

         STR   R5,[R4]

9 E" C* ^! l, X* Y

         ;7)refresh timer

         LDR  R4,=0XD0000004

         LDR  R5,=0X8

         STR  R5,[R4]


! I) _! G1 F9 ^" T

        ;8)auto refresh enable  23位

        LDR  R4,=0XD0000000

        LDR  R5,[R4]

        ADD  R5,R5,#(1<<23)

        STR   R5,[R4]


1 J/ Z  p% G' x0 ?: E8 D

        ;9)延时1us

        MOV  R4,#0X16

15    SUBS  R4,R4,#1

         BNE   %B15

- |% b; Z, V& J: ?& h5 ~" Z

         ;10)设置模式寄存器

         LDR  R4,=0XE0000000+(3<<11)+(2<<15)

         LDR  R5,[R4]

         ADD  R5,R5,#(1<<24)

         STR   R5,[R4]

! w0 T: \. h4 Z

         ;11)WD,WM位

          LDR  R4,=0XD0000000

          LDR  R5,=0X00EF00CE

          ORR  R5,R5,#0X30000

          STR   R5,[R4]


+ F7 S. Z0 R4 J) }: P$ C

           ;12)refresh timer

           LDR  R4,=0XD0000000

           LDR  R5,=0X200

           STR  R5,[R4,#4]


+ L" `  {7 y. Q9 q  ~9 a

           ;13)timer buffer register

            LDR  R4,=0XD0000000

            LDR  R5,=0X55

            STR  R5,[R4,#0X8]

/ E9 a7 G0 ^6 |# E

            ;14)禁止MMU

            MOV  R4,#0X0

            MCR   P15,0,R4,C1,C0,0


) m' X* T5 Q7 D

            ;15)halt

            MOV  R4,#0X0   ;这个无意义


. X) d( x* c" h2 {) ?# @/ Q/ m- \2 X

             ;16)设置MMU

              SETUPMMU  R4,R5,R2,R3,R9,R7  ;通过SETUPMMU宏来设置MMU

' b& p: u: a$ _. m4 |6 u% ?

            ;17)halt

            MOV  R4,#0X0

; a+ }) O  O' O; d9 M$ V1 F; t9 w

            ;18)重映射

            UNMAPROM  R4,R5     ;通过宏UMMAPROM来把R5映射到地址R4即0X0处


: E! j* H8 d, }8 E, Y7 l1 ]

haltthere

            ;19)halt

            MOV  R4,#0X0

Config32                            EQU   0X0

MMUOn                              EQU   0X01

CacheOn                            EQU   0X04

WriteBufferOn                     EQU    0X08

PageTableSize                     EQU    (1<<14)

SDRAM_Bank1_High              EQU    (0XF1000000)

SDRAM_Bank2_High              EQU    (0XF2000000)

SDRAM_Bank1_Low              EQU    (0XF0000000)

SDRAM_Bank2_Low              EQU    (0XF1000000)

PageTableBase2                  EQU    SDRAM_Bank2_High-PageTableSize

PageTableBase1                  EQU    SDRAM_Bank1_High-PageTableSize

PageTableEntryCount           EQU    (0X1000)

VirtualPageTableBase           EQU    PageTableBase2  

IOCS0Base                         EQU    (0X24000000)

IOCS0Size                         EQU    (0X4000000)

IOCS1Base                         EQU    (0X10000000)

IOCS0Size                         EQU    (0X4000000)

SRAMBase                         EQU    (0X60000000)


/ g$ ~5 d' a/ B. \; E* x' q5 u

DisableMMU                       EQU   (Config32:OR:0X40)

EnableMMU32                    EQU   (Config32:OR:0X40:OR:MMUOn)

EnableMMUCW32                EQU   (Config32:OR:0X40:OR:MMUOn:OR:CacheOn:OR:WriteBufferOn)

;宏SETUPMMU生成一级页表,建立以1MB为单位的4G虚拟存储空间的地址映射关系。

7 P2 N+ g% S2 v  M2 t) L: P; H

MACRO

$label    SETUPMMU   $base,$desc,$tmp,$tmp2,$cnt,$indx


0 _# n, }3 x6 D

ROUT

      ;用于调试时增加可读性

      [   O=0     ;IF

          NOP

          NOP

      ]             ;ENDIF


& ~( ?' ~' u( P' X# E

;禁止MMU

       MOV  $tmp,#DisableMMU

       WriteCP15_Control  $tmp

9 P4 `. \4 p0 S1 O, G

;自动识别系统中SDRAM大小,并把结果保存到系统中特定位置

       AutoSizESDRAM   $tmp,$tmp2,$base,$desc,$cnt,$indx


& }+ u4 ^1 n. a5 z  e0 S) T

       MOVS  $tmp2,$tmp,LSR #16

       EOR     $cnt ,$tmp,$tmp2,LSL #16

       LDRNE  $base ,=PageTableBase2

       LDREQ  $base,=PageTableBase1

       STR   $tmp2, [$base,#-4]

       STR   $cnt  ,[$base,#-8]

       ;保存一级页表的物理地址

       STR  $base   ,[$base,#-12]

       ;计算扩展槽1中SDRAM的起始地址,以便使SDRAM1和SDRAM2地址连续

       ;address=Bank 1 base address +Total possible size of bank1-actual size of bank 1

       ;address =0xF0000000+16MB-Size

       LDR  $indx  ,=SDRAM_Bank1_High

       SUB  $indx,$indx,$cnt,LSL #20

       ;保存该起始地址

        STR   $indx, [$base,#-16]

        ;建立4G的虚拟地址空间到物理空间的映射关系

        ;各块的存储访问属性设置成uncached、unbuffered

        ;各块的域标识设置成domain 0 客户类型

        ;各块的存储访问权限设置成允许所有权限

        LDR   $desc,=MMU_STD_ACCESS

        MOV  $indx ,$base

        LDR   $cnt ,=PageTableEntryCount

9 B( O: ?2 T; [$ v9 c" g. [$ C

01    STR   $desc  ,[$indx],#4

        ADD  $desc,$desc,#(1<<20)

        SUBS $cnt ,$cnt ,#1

        BNE   %B01

;建立包含页表的页存储的地址映射关系

;该页默认的虚拟空间在扩展槽2的高端16KB的区域

;如果系统扩展槽2中有SDRAM存在,则该存储页的地址映射关系不变

;如果系统扩展槽2中没有SDRAM存在,则将该存储页映射到扩展槽1的高端

         LDR $desc,=MMU_STD_ACCESS
* Y; J4 k9 E1 M( A; m* _2 K( Z         LDR $indx,=VirtualPagetableBase, q7 V( r8 j9 I0 j- R" P( d
         LDR $tmp,=0xfff00000
# w: P, O# ]2 ~. V         AND $indx,$tmp,$index   ;读取虚拟地址的高12位* f( d4 J, Z% f. x, h6 I" W
         ORR $desc,$desc,$indx    ;得到(高12+存储访问属性)
- F8 U5 c) C$ v" o2 n% X         ADD $indx,$base,$base,lsr #(20)

         STR  $desc,[$indx]

   ;建立CS0选择的静态存储器的虚拟地址空间到物理地址空间的映射关系

   ;CS0选择的SDRAM的物理地址空间为0X24000000

   ;现在将虚拟空间0X0映射到0X24000000

   ;各块得存储访问属性设置成cacheable、bufferable

   ;各块的与标识设置为domain 0客户属性

   ;各块的存储访问权限设置成允许所有权限

         LDR   $desc,  =(MMU_STD_ACCESS+MMU_C_BIT+MMU_B_BIT)

         LDR   $indx,   =IOCS0Base

         LDR   $tmp,  =0xFFF00000

         AND   $indx,$tmp,$indx

         ORR $desc,$desc,$indx    ;得到(高12+存储访问属性)

         ADD   $indx ,$base,$indx,LSR #20

         LDR    $cnt ,=(IOCS0Size>>20)

& g; v1 S- T- e/ V4 Q/ X- J5 c

03    STR   $desc  ,[$indx],#4

        ADD  $desc,$desc,#(1<<20)

        SUBS $cnt ,$cnt ,#1

        BNE   %B03

   ;建立CS1选择的静态存储器的虚拟地址空间到物理地址空间的映射关系

   ;CS1选择的SDRAM的物理地址空间为0X1000 0000

   ;现在将虚拟空间0X0映射到0X1000 0000

   ;各块得存储访问属性设置成cacheable、bufferable

   ;各块的与标识设置为domain 0客户属性

   ;各块的存储访问权限设置成允许所有权限

         LDR   $desc,  =(MMU_STD_ACCESS+MMU_C_BIT+MMU_B_BIT)

         LDR   $indx,   =IOCS1Base

         LDR   $tmp,  =0xFFF00000

         AND   $indx,$tmp,$indx

         ORR $desc,$desc,$indx    ;得到(高12+存储访问属性)

         ADD   $indx ,$base,$indx,LSR #20

         LDR    $cnt ,=(IOCS1Size>>20)

6 f; b7 O* L- x& r

04    STR   $desc  ,[$indx],#4

        ADD  $desc,$desc,#(1<<20)

        SUBS $cnt ,$cnt ,#1

        BNE   %B04

' N$ I4 ]4 ~, ]5 k8 y

   ;建立片内SRAM的虚拟地址空间到物理地址空间的映射关系

   ;SRAM的物理地址空间为0X60000000

   ;现在将虚拟空间0X0映射到0X60000000

   ;各块得存储访问属性设置成cacheable、bufferable

   ;各块的与标识设置为domain 0客户属性

   ;各块的存储访问权限设置成允许所有权限

         LDR   $desc,  =(MMU_STD_ACCESS+MMU_C_BIT+MMU_B_BIT)

         LDR   $indx,   =SRAMBase

         LDR   $tmp,  =0xFFF00000

         AND   $indx,$tmp,$indx

         ORR $desc,$desc,$indx    ;得到(高12+存储访问属性)

         ADD   $indx ,$base,$indx,LSR #20

         LDR    $cnt ,=(SRAMSize>>20)


2 y4 q- Q) j  ]/ j2 ]6 u, O1 `

05    STR   $desc  ,[$indx],#4

        ADD  $desc,$desc,#(1<<20)

        SUBS $cnt ,$cnt ,#1

        BNE   %B05

  l6 v0 s/ w9 v, ^# H: O. s7 i

       ;清空cache以及写缓冲区

       ;重新使能MMU

       ;设置域访问控制寄存器为domain 0

       ;其他域没有任何访问权限

       LDR       $tmp,  =0x5555 5555

       WriteCP15_DAControl   $tmp

       WriteCP15_TTBase       $base

       MOV        $tmp  ,#0

       ;清空cache

       CP15_FlushIDC     $tmp

       ;清空TLB

        CP15_FlushTLB     $tmp

        ;重新使能cache和写缓冲区

        MOV     $tmp   , #EnableMMUCW32

        WriteCP15_Control   $tmp


, v) s# }6 A% l7 D7 T! a, b

        ;等待流水线上指令执行完

         NOP

         NOP

         NOP

         NOP

         NOP

         MEND


& P6 u/ ^# \& n1 Z5 }! l" A, k

该用户从未签到

2#
发表于 2020-12-25 16:11 | 只看该作者
ARM体系结构与编程学习(9)
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-11-24 22:53 , Processed in 0.187500 second(s), 23 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

快速回复 返回顶部 返回列表