S3C2440裸奔之SDRAM

发布者:SereneSoul55最新更新时间:2019-11-11 来源: 51hei关键字:S3C2440  裸奔  SDRAM 手机看文章 扫描二维码
随时随地手机看文章

先安装ADS1.2,该软件主要用来编译并调试ARM处理器的程序的。下面所有的源程序都将通过ADS编译并最终链接成可执行文件,即.bin文件。


下面的程序主要是先初始化SDRAM,然后将程序跳转到SDRAM中,并点亮4个LED灯。


在ARM处理器启动的最开始,一般都需要:

1、关闭“看门狗”;

2、关闭中断;


然后再初始化SDRAM,因为在初始化SDRAM时,要用到时钟频率,所以也需要设置时钟频率。

以下是用汇编语言写的起动代码,为后面的C语言环境作铺垫。


WTCON    EQU  0x53000000     ;Watch-dog timer mode

INTMSK     EQU  0x4a000008     ;Interrupt mask control

INTSUBMSK  EQU  0x4a00001c     ;Interrupt sub mask

CLKDIVN   EQU  0x4c000014     ;Clock divider control

LOCKTIME  EQU  0x4c000000     ;PLL lock time counter

MPLLCON   EQU  0x4c000004     ;MPLL Control

BWSCON    EQU  0x48000000     ;Bus width & wait status

GPBCON    EQU  0x56000010     ;Port B control

GPBDAT    EQU  0x56000014     ;Port B data

M_MDIV   EQU  92 

M_PDIV   EQU  1 

M_SDIV   EQU  1    


_STACK_BASEADDRESS EQU 0x33ff8000

_MMUTT_STARTADDRESS EQU 0x33ff8000

_ISR_STARTADDRESS  EQU 0x33ffff00

USERMODE    EQU  0x10

FIQMODE     EQU  0x11

IRQMODE     EQU  0x12

SVCMODE     EQU  0x13

ABORTMODE   EQU  0x17

UNDEFMODE   EQU  0x1b

MODEMASK    EQU  0x1f

NOINT       EQU  0xc0

UserStack EQU (_STACK_BASEADDRESS-0x3800) ;0x33ff4800 ~

SVCStack EQU (_STACK_BASEADDRESS-0x2800) ;0x33ff5800 ~

UndefStack EQU (_STACK_BASEADDRESS-0x2400) ;0x33ff5c00 ~

AbortStack EQU (_STACK_BASEADDRESS-0x2000) ;0x33ff6000 ~

IRQStack EQU (_STACK_BASEADDRESS-0x1000) ;0x33ff7000 ~

FIQStack EQU (_STACK_BASEADDRESS-0x0) ;0x33ff8000 ~

         IMPORT  |Image$$RO$$Base| ; Base of ROM code

         IMPORT  |Image$$RO$$Limit|  ; End of ROM code (=start of ROM data)

         IMPORT  |Image$$RW$$Base|   ; Base of RAM to initialise

         IMPORT  |Image$$ZI$$Base|   ; Base and limit of area

         IMPORT  |Image$$ZI$$Limit|  ; to zero initialise

         IMPORT  Main    ; The main entry of mon program

         AREA    Init,CODE,READONLY

         ENTRY

ResetEntry

;===============================

;关闭看门狗

;===============================

ldr r0, =WTCON

mov r1, #0x0

str r1, [r0]  

;===============================

;关闭所有的中断

;===============================

ldr r0, =INTMSK

ldr r1, =0xffffffff

str r1, [r0]  

;===============================

;关闭所有的子中断

;===============================

ldr r0, =INTSUBMSK

ldr r1, =0x7fff

str r1, [r0]  

;===============================

;设置FCLK:HCLK:PCLK = 1:4:8

;===============================

ldr r0, =CLKDIVN

mov r1, #5

str r1, [r0]

;===============================

;设置异步总线模式

;===============================

mrc p15, 0, r1, c1, c0, 0 

orr r1, r1, #0xc0000000  

mcr p15, 0, r1, c1, c0, 0 

;===============================

;设置锁存时间

;===============================

ldr r0, =LOCKTIME

ldr r1, =0xffffffff

str r1, [r0]


;===============================

;设置MPLL

;===============================

ldr r0, =MPLLCON

ldr r1, =((M_MDIV << 12) + (M_PDIV << 4) + M_SDIV)

str r1, [r0]

      

;===============================

;Set memory control registers

;===============================

  adrl r0, SMRDATA

  ldr  r1, =BWSCON 

  add  r2, r0, #52 

0

ldr  r3, [r0], #4

str  r3, [r1], #4

cmp  r2, r0

bne  %B0

;===============================

;点亮一个led灯GPB5

;===============================

ldr r0, =GPBCON

ldr r1, =0x00000400

str r1, [r0]


ldr r0, =GPBDAT

ldr r1, =0x00000000

str r1, [r0]


;===============================

;Clear SDRAM 

;=============================== 

; mov r1,#0

; mov r2,#0

; mov r3,#0

; mov r4,#0

; mov r5,#0

; mov r6,#0

; mov r7,#0

; mov r8,#0


; ldr r9,=0x4000000   ;64MB

; ldr r0,=0x30000000

;0 

; stmia r0!,{r1-r8}

; subs r9,r9,#32 

; bne %B0


;===============================

;Initialize stacks

;===============================

bl InitStacks

;===============================

;从nor flash启动

;===============================

ldr r0, =BWSCON

ldr r0, [r0]

ands r0, r0, #6  ;OM[1:0] != 0, NOR FLash boot

bne copy_proc_beg  


copy_proc_beg

;===============================

;点亮一个led灯GPB6

;===============================

ldr r0, =GPBCON

ldr r1, =0x00001400

str r1, [r0]

;===============================

;复制程序到SDRAM中

;===============================

adr r0, ResetEntry

ldr r2, BaseOfROM

cmp r0, r2

ldreq r0, TopOfROM

beq InitRam 

ldr r3, TopOfROM

ldmia r0!, {r4-r7}

stmia r2!, {r4-r7}

cmp r2, r3

bcc %B0


sub r2, r2, r3

sub r0, r0, r2    

  

InitRam 

ldr r2, BaseOfBSS

ldr r3, BaseOfZero 

0

cmp r2, r3

ldrcc r1, [r0], #4

strcc r1, [r2], #4

bcc %B0 

mov r0, #0

ldr r3, EndOfBSS

cmp r2, r3

strcc r0, [r2], #4

bcc %B1


gocomp

ldr pc, =%F2  ;goto compiler address


2

;===============================

;熄灭led灯GPB5、6

;===============================

; ldr r0, =GPBCON

; ldr r1, =0x00000000

; str r1, [r0]


;===============================

;进行主函数

;===============================

bl Main 

b  .

InitStacks

;Do not use DRAM,such as stmfd,ldmfd......

;SVCstack is initialized before

;Under toolkit ver 2.5, 'msr cpsr,r1' can be used instead of 'msr cpsr_cxsf,r1'

mrs r0,cpsr

bic r0,r0,#MODEMASK

orr r1,r0,#UNDEFMODE|NOINT

msr cpsr_cxsf,r1  ;UndefMode

ldr sp,=UndefStack  ; UndefStack=0x33FF_5C00

orr r1,r0,#ABORTMODE|NOINT

msr cpsr_cxsf,r1  ;AbortMode

ldr sp,=AbortStack  ; AbortStack=0x33FF_6000

orr r1,r0,#IRQMODE|NOINT

msr cpsr_cxsf,r1  ;IRQMode

ldr sp,=IRQStack  ; IRQStack=0x33FF_7000

orr r1,r0,#FIQMODE|NOINT

msr cpsr_cxsf,r1  ;FIQMode

ldr sp,=FIQStack  ; FIQStack=0x33FF_8000

bic r0,r0,#MODEMASK|NOINT

orr r1,r0,#SVCMODE

msr cpsr_cxsf,r1  ;SVCMode

ldr sp,=SVCStack  ; SVCStack=0x33FF_5800

;USER mode has not be initialized.

;The LR register will not be valid if the current mode is not SVC mode.

mov pc,lr



;==================================================================

; Memory configuration should be optimized for best performance

; The following parameter is not optimized.

; Memory access cycle parameter strategy

; 1) The memory settings is  safe parameters even at HCLK=75Mhz.

; 2) SDRAM refresh period is for HCLK<=75Mhz.

;http://blog.csdn.net/mr_raptor/article/details/6555786

;==================================================================

;BWSCON

DW8   EQU (0x0)

DW16  EQU (0x1)

DW32  EQU (0x2)

WAIT  EQU (0x1<<2)

UBLB  EQU (0x1<<3)


B1_BWSCON EQU (DW16) ; AMD flash(AM29LV800B), 16-bit,  for nCS1

B2_BWSCON EQU (DW16) ; PCMCIA(PD6710), 16-bit

B3_BWSCON EQU (DW16) ; Ethernet(CS8900), 16-bit

B4_BWSCON EQU (DW32) ; Intel Strata(28F128), 32-bit, for nCS4

B5_BWSCON EQU (DW16) ; A400/A410 Ext, 16-bit

B6_BWSCON EQU (DW32) ; SDRAM(K4S561632C) 32MBx2, 32-bit

B7_BWSCON EQU (DW32) ; N.C.

;BANK0CON

B0_Tacs  EQU 0x3 ;0clk

B0_Tcos  EQU 0x3 ;0clk

B0_Tacc  EQU 0x7 ;14clk

B0_Tcoh  EQU 0x3 ;0clk

B0_Tah  EQU 0x3 ;0clk

B0_Tacp  EQU 0x1

B0_PMC  EQU 0x0 ;normal

;BANK1CON

B1_Tacs  EQU 1;0x0 ;0clk

B1_Tcos  EQU 1;0x0 ;0clk

B1_Tacc  EQU 6;0x7 ;14clk

B1_Tcoh  EQU 1;0x0 ;0clk

B1_Tah  EQU 1;0x0 ;0clk

B1_Tacp  EQU 0x0

B1_PMC  EQU 0x0 ;normal

;Bank 2 parameter

B2_Tacs  EQU 1;0x0 ;0clk

B2_Tcos  EQU 1;0x0 ;0clk

B2_Tacc  EQU 6;0x7 ;14clk

B2_Tcoh  EQU 1;0x0 ;0clk

B2_Tah  EQU 1;0x0 ;0clk

B2_Tacp  EQU 0x0

B2_PMC  EQU 0x0 ;normal

;Bank 3 parameter

B3_Tacs  EQU 0x1;0 ;0clk

B3_Tcos  EQU 0x1;0 ;0clk

B3_Tacc  EQU 0x6;7 ;14clk

B3_Tcoh  EQU 0x1;0 ;0clk

B3_Tah  EQU 0x1;0 ;0clk

B3_Tacp  EQU 0x0

B3_PMC  EQU 0x0 ;normal

;Bank 4 parameter

B4_Tacs  EQU 0x1;0 ;0clk

B4_Tcos  EQU 0x1;0 ;0clk

B4_Tacc  EQU 0x6;7 ;14clk

B4_Tcoh  EQU 0x1;0 ;0clk

B4_Tah  EQU 0x1;0 ;0clk

B4_Tacp  EQU 0x0

B4_PMC  EQU 0x0 ;normal

;Bank 5 parameter

B5_Tacs  EQU 0x1;0 ;0clk

B5_Tcos  EQU 0x1;0 ;0clk

B5_Tacc  EQU 0x6;7 ;14clk

B5_Tcoh  EQU 0x1;0 ;0clk

B5_Tah  EQU 0x1;0 ;0clk

B5_Tacp  EQU 0x0

B5_PMC  EQU 0x0 ;normal

; When 100MHz HCLK is used.

;Bank 6 parameter

B6_MT   EQU 0x3 ;SDRAM

B6_Trcd  EQU 0x1 ;3clk

B6_SCAN  EQU 0x1 ;9bit

;Bank 7 parameter

B7_MT   EQU 0x3 ;SDRAM

B7_Trcd  EQU 0x1 ;3clk

B7_SCAN  EQU 0x1 ;9bit

;REFRESH parameter

REFEN   EQU 0x1 ;Refresh enable

TREFMD  EQU 0x0 ;CBR(CAS before RAS)/Auto refresh

Trp    EQU 0x1 ;3clk

Tsrc   EQU 0x1 ;5clk Trc= Trp(3)+Tsrc(5) = 8clock

Tchr   EQU 0x2 ;3clk

REFCNT  EQU 1268;1463;1268 ;HCLK=100Mhz, (2048+1-7.81*100);75M->1463

SMRDATA DATA

DCD (0+(B1_BWSCON<<4)+(B2_BWSCON<<8)+(B3_BWSCON<<12)+(B4_BWSCON<<16)+(B5_BWSCON<<20)+(B6_BWSCON<<24)+(B7_BWSCON<<28)) ;0x2212_1110

DCD ((B0_Tacs<<13)+(B0_Tcos<<11)+(B0_Tacc<<8)+(B0_Tcoh<<6)+(B0_Tah<<4)+(B0_Tacp<<2)+(B0_PMC))   ;GCS0         ;0x7ff4

DCD ((B1_Tacs<<13)+(B1_Tcos<<11)+(B1_Tacc<<8)+(B1_Tcoh<<6)+(B1_Tah<<4)+(B1_Tacp<<2)+(B1_PMC))   ;GCS1         ;

DCD ((B2_Tacs<<13)+(B2_Tcos<<11)+(B2_Tacc<<8)+(B2_Tcoh<<6)+(B2_Tah<<4)+(B2_Tacp<<2)+(B2_PMC))   ;GCS2         ;

DCD ((B3_Tacs<<13)+(B3_Tcos<<11)+(B3_Tacc<<8)+(B3_Tcoh<<6)+(B3_Tah<<4)+(B3_Tacp<<2)+(B3_PMC))   ;GCS3         ;

DCD ((B4_Tacs<<13)+(B4_Tcos<<11)+(B4_Tacc<<8)+(B4_Tcoh<<6)+(B4_Tah<<4)+(B4_Tacp<<2)+(B4_PMC))   ;GCS4         ;

DCD ((B5_Tacs<<13)+(B5_Tcos<<11)+(B5_Tacc<<8)+(B5_Tcoh<<6)+(B5_Tah<<4)+(B5_Tacp<<2)+(B5_PMC))   ;GCS5         ;

DCD ((B6_MT<<15)+(B6_Trcd<<2)+(B6_SCAN))    ;GCS6                                   ;

[1] [2]
关键字:S3C2440  裸奔  SDRAM 引用地址:S3C2440裸奔之SDRAM

上一篇:访问CP15寄存器的指令
下一篇:S3C2440裸奔之环境搭建

推荐阅读最新更新时间:2024-11-08 11:20

六 ARM9(S3C2440)的LCD显示-理论知识
今天和大家一起讨论一下S3C2440的LCD显示的问题,希望大家能够多多指教,我说的不对的地方希望大家及时帮我改正,以使我可以增长知识,才能不至于给别人的学习带来不便,呵呵 下面先看一下我从别人那转过来的一篇文章,我觉得很有用,看完之后我再说一下自己对这一块的了解,也可以先看看我的理解(下面红字标出)再看开始的这篇文章,因为我说的更通俗,O( _ )O哈哈~。 1. LCD工作的硬件需求: 要使一块LCD正常的显示文字或图像,不仅需要LCD驱动器,而且还需要相应的LCD控制器。在通常情况下,生产厂商把LCD驱动器会以COF/COG的 形式与LCD玻璃基板制作在一起,而LCD控制器则是由外部的电路来实现,现在很多
[单片机]
基于S3C2440嵌入式系统主板的电磁兼容性设计
作者:许凯华,董淑云,刘玉华,胡立祥 华中师范大学  随着电子设备的频率越来越高,世界各国对电子产品电磁辐射标准的执行变得越来越严格,如何保证能在有限时间很好地在设计阶段发现并解决EMI/EMC问题非常重要,而PCB往往是一个电子系统的核心构成部分,一个经仔细电磁干扰设计的PCB板,能大幅度降低阻抗不匹配、传输线问题、信号互相耦合等现象引发的信号反射、延迟等线路不稳定因素,同时也可达到降低电磁辐射发射干扰,大大提高系统的稳定性和可靠性。本文将以嵌入式系统主板为平台,运用 EMIStream仿真软件,并采用源端串联端接阻抗的方法分析了解决嵌入式高速主板存在的电磁干扰问题。 1 电磁兼容性 1.1 电磁兼容和电磁干扰
[嵌入式]
S3C2440芯片时钟配置
S3C2440A芯片中的时钟控制逻辑可以生成所需的时钟信号,包括用于CPU的FCLK、AHB (Advanced High-performance Bus) 总线外围设备的HCLK,以及APB (Advanced Peripheral Bus)总线外围设备的PCLK。S3C2440A有两个相锁循环(PLLs):一个用于FCLK、HCLK和PCLK,另一个用于USB块(48 Mhz)。时钟控制逻辑可以使用无PLL的慢时钟,并且可以通过软件控制决定将时钟是否连接到外围块,这将减少芯片的功耗。 1 时钟源的选择 S3C2440A芯片的时钟来源有两个,一个是外部晶振(XTIpll 和 XTOpll),一个来自外部时钟输入(EXTC
[单片机]
<font color='red'>S3C2440</font>芯片时钟配置
s3c2440裸机-清bss原理及实现
1.清bss的引入(为什么要清bss)我们先举个例子: #include s3c2440_soc.h #include uart.h char g_Char = 'A'; //.data char g_Char3 = 'a'; const char g_Char2 = 'B'; //.rodata int g_A = 0; //bss int g_B; //bss int main(void) { uart0_init(); puts( nrg_A = ); printHex(g_A); puts( nr ); while (1) {
[单片机]
S3C2440 测试程序(二)RTC显示实验
源代码: void RTC_Display(void) { U16 year ; U8 month, day ; // week U8 hour, minute, second ; RTC_Time_Set() ; 注: 初始日期和时间的设置 Uart_Printf( \nRTC TIME Display, press ESC key to exit !\n ) ; while( Uart_GetKey() != ESC_KEY ) { rRTCCON = 1 ; //RTC read and write enable year = 0x2000+rBCDYEAR ; //2012 month = rBCDMON
[单片机]
(6)s3c2440用I2C接口访问EEPROM
在前面阅读理解了I2C的官方协议文档后,就拿s3c2440和EEPROM来验证一下. 本来是想用s3c2440的SDA和SCL管脚复用为GPIO来模拟的,但在没有示波器的情况下搞了一周,怎么都出不来,最后还是放弃了.甚至参考了linux下i2c-algo-bit.c和i2c-gpio.c,依然没调出来.如果有示波器,可能很快就能找到原因,现在完全不知道问题出在哪里.其实想用GPIO模拟I2C的目的很简单,以一种简单而又深刻的方式来理解I2C. 既然这条路暂时没法走,退而求其次,用s3c2440的I2C接口来访问EEPROM,只要按照datasheet的来做,基本上不用考虑时序咯. 从s3c2440和AT24
[单片机]
(6)<font color='red'>s3c2440</font>用I2C接口访问EEPROM
s3c2440头文件之Def.h
#ifndef __DEF_H__ #define __DEF_H__ #define U32 unsigned int #define U16 unsigned short #define S32 int #define S16 short int #define U8 unsigned char #define S8 char #define TRUE 1 #define FALSE 0 #define OK 1 #define FAIL 0 #define ESC_KEY ('q') // 0x1b #endif /*__DEF_H__*/
[单片机]
ARM S3C2440 时钟初始化流程
1.设置lock time 2.设置分频系数 3.设置CPU到异步工作模式 4.设置 FCLK 了解 芯片的时钟原理图,以及寄存器的作用 了解芯片的晶振频率,锁相环,分频系数,以及有哪些时钟
[单片机]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
随便看看

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved