历史上的今天
返回首页

历史上的今天

今天是:2024年11月11日(星期一)

正在发生

2019年11月11日 | S3C2440裸奔之SDRAM

2019-11-11 来源:51hei

先安装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                                   ;

推荐阅读

史海拾趣

First Switchtech公司的发展小趣事

面对日益激烈的全球竞争,First Switchtech公司(或类似公司)制定了积极的国际化战略。公司首先在欧洲市场设立了分支机构,通过深入了解当地市场需求和文化背景,成功推出了符合欧洲标准的电子开关产品。随后,公司进一步拓展北美、亚洲等市场,通过本地化生产和营销策略,实现了全球市场的覆盖。这一过程中,公司不仅提升了品牌知名度,还积累了丰富的国际市场运营经验。

台湾町洋(dinkle)公司的发展小趣事

町洋注重企业文化建设,倡导以人为本的管理理念。公司为员工提供了良好的工作环境和福利待遇,并积极开展各种培训和学习活动,帮助员工提升自身素质和专业技能。这种关注员工成长和发展的企业文化使得町洋的凝聚力不断增强,为公司的持续发展提供了有力保障。

Hilscher Gesellschaft für Systemautomation mbH公司的发展小趣事

随着技术实力的增强,HVPSI开始将目光投向国际市场。公司积极参与国际电子展会,与全球各地的客户建立联系,展示其高压电源解决方案的卓越性能。同时,HVPSI也加强了与跨国企业的合作,共同开发定制化的高压电源产品,满足特定行业的需求。这一系列举措极大地拓宽了公司的市场份额,使其在国际舞台上崭露头角。

Digital Voice Systems Inc公司的发展小趣事

Digital Voice Systems, Inc.(DVSI)于1988年成立,当时正值数字通信技术的兴起阶段。公司创始人凭借对语音编解码技术的深刻理解和前瞻性的市场洞察力,决定投身于这一领域。他们开发出了具有专利保护的基于鲁棒性多带激励模型(MBE Model)的低码率语音压缩算法,如IMBE和AMBE编解码系统。这些算法在当时的市场上独树一帜,为DVSI赢得了第一桶金。

在创立初期,DVSI面临着资金、技术、市场等多方面的挑战。然而,他们凭借着坚定的信念和不懈的努力,逐步克服了这些困难。他们不断投入研发,优化算法,提高产品的性能和稳定性;同时,他们积极开拓市场,与各大通信设备制造商建立合作关系,将产品推向市场。

随着时间的推移,DVSI的产品逐渐在市场上获得了认可。他们的编解码系统被广泛应用于移动通信、卫星通信、军事通信等领域,为客户提供了高效、稳定的语音通信解决方案。DVSI也因此逐渐崭露头角,成为了电子行业中一颗耀眼的明星。

故事二至五框架概述

  1. 技术创新与突破:DVSI在语音编解码技术方面的持续创新,如推出新一代的高效压缩算法,进一步提升了产品的竞争力。
  2. 市场拓展与国际化:随着公司实力的增强,DVSI开始拓展国际市场,与全球多家知名企业建立合作关系,实现了国际化发展。
  3. 合作与竞争:在电子行业中,DVSI与其他企业的合作与竞争并存。他们通过合作共赢的方式,共同推动行业的发展;同时,也面临着来自竞争对手的挑战和竞争压力。
  4. 企业文化与团队建设:DVSI注重企业文化建设,倡导创新、协作、共赢的价值观。他们注重团队建设,吸引了一批优秀人才加入公司,为公司的发展提供了有力的人才保障。

以上故事和框架概述仅供参考,您可以根据这些线索进一步挖掘和编写关于DVSI公司的故事。

Epistar Corp公司的发展小趣事

随着LED技术的不断发展,Epistar开始将目光投向国际市场。公司积极参与各类国际展会和论坛,展示其先进的LED产品和技术实力。同时,Epistar还加强了与国际知名企业的合作,共同开发新产品,拓宽销售渠道。这些努力使Epistar的品牌知名度和市场份额不断提升,公司逐渐在国际LED市场上崭露头角。

EDDING公司的发展小趣事

在2000年代初,ECLIPSE公司是一家专注于企业级软件开发的公司。公司内部的一个小型团队开发了一个名为“Eclipse”的集成开发环境(IDE),用于提高内部项目的开发效率。随着Eclipse的内部使用越来越广泛,公司高层意识到其巨大的潜力,决定将Eclipse开源,并成立专门的Eclipse部门来管理和推广这一项目。通过开放源代码和社区合作,Eclipse迅速吸引了全球开发者的关注,并逐渐成长为开源开发领域的领军者。

问答坊 | AI 解惑

基于DSP的高速实时语音识别系统的设计与实现

基于DSP的高速实时语音识别系统的设计与实现…

查看全部问答>

RS232串口usb局域网络控制温度湿度电压8路10位模拟信号转换模块(A/D转换)

本控制板具有8路10位(精度±1LSB)高速A/D转换通道,可同时对外部输入的8路模拟量(直流0-5V,也可定做其他输入方式)进行模数转换,转换后的结果(每通道转换后的结果为2字节数据)通过串口(也可以定做USB接口,局域网RJ45接口等)快速输出(默认波 ...…

查看全部问答>

相位和频率到底是什么关系

小弟最近做一个基于FPGA的DDS,但搞不懂相位和频率什么关系,有点还有相位控制字什么的,我以为只有一个频率控制字就行了呢,哪位大侠给解决下………

查看全部问答>

iimage使用问题

   最近项目中有使用到iimage组件,发现可以成功的在一个模块中使用。但是如果在另外一个模块中也使用,编译的时候便会报错。想问下高手们,如何在多个模块中使用iimage…

查看全部问答>

杭州公司借宝地招人

杭州公司招聘网络服务器、手机IM开发工程师 10名 (急) 要求: 1, 学历不限, 3年以上c++经验; 2, 有2网络开发经验,熟悉tcp/udp等协议多线程开发; 3, 有服务器端开发、IM系统开发、手机开发经验优先; 待遇面议(薪水8k起,有能力者 ...…

查看全部问答>

请教:谁知道会唱歌的圣诞贺卡的内部原理啊,谢谢了

拆了会唱歌的圣诞贺卡,发现里面的元器件很小,很好奇,电路板上连接了一个貌似喇叭的东东。 很想知道他的原理啊。…

查看全部问答>

Offset什么作用

Offset有什么功能?一般什么时候用到 谢谢!…

查看全部问答>

visual studio2005 调试WinCE6设备应用程序的问题

在Visual   Studio2005中开发一个应用程序,需要与WinCE6设备连接进行调试。 在网上看到可以通过在设备端运行conmanclient2,cMaccept,pc端运行“连接到设备” ,但是提示未安装activesync,安装以后,再运行,提示“设备未就绪“,我是 ...…

查看全部问答>

7805的电路怎么搭建啊

想问问,7805是不是为了稳压才采用,还是为了电压的转换。还有典型的7805的电路怎么搭建,请各位说说…

查看全部问答>

Keil C51 与 ARM 并存方法

  Keil C51 与 ARM 并存方法          很多朋友都在想,怎么让keil C51与ARM能够并存使用。有安装经验的朋友都知道,安好C51后再安ARm,C51不能正常工作;安好ARM后再安C51,ARM不能正常工作. 网上也 ...…

查看全部问答>