重點分析s3c2410復位后的內存映射,及其應用。
一、基本配置
EDUKIT-III采用核心子板加擴展板的設計方式,我學習ARM9,所以采用s3c2410的核心子板。核心子板資源如下:
MCU : S3C2410A
SDRAM : 兩片HY57V561620CT-H
NOR FLASH: AM29LV160DB-90EC
擴展板資源:
NAND FLASH: K9F5608UOC
二、nand flash boot分析
S3C2410支持從nor/nand flash、eeprom等rom類型的介質啟動?,F在我想做的是從外部nand flash啟動,首先看datasheet第一部分:
NAND Flash Boot Loader
· Supports booting from NAND flash memory
· 4KB internal buffer for booting
· Supports storage memory for NAND flash memory after booting
可以明確,首先,s3c2410支持從nand flash存儲介質啟動,其次,在硬件上,s3c2410除了提供相應的邏輯外,還提供了一個4K的sram作為buffer用于nand啟動。最后,s3c2410支持從nand flash啟動之后的內存分配形式(也就是說,從nand flash啟動之后和從nor flash啟動之后的內存分配形式是不同的。s3c2410支持這兩種形式,可以說是相對于其他的MCU不同的地方。)
然后看datasheet的第六部分:nand flash controller。overview中首先講述了用nand flash代替nor flash作為啟動介質的原因(成本低)。
S3C2410X boot code can be executed on an external NAND flash memory. In order to support NAND flash boot loader, the S3C2410X is equipped with an internal SRAM buffer called ‘Steppingstone’. When booting, the first 4
KBytes of the NAND flash memory will be loaded into Steppingstone and the boot code loaded into Steppingstone will be executed.
Generally, the boot code will copy NAND flash content to SDRAM. Using hardware ECC, the NAND flash data validity will be checked. Upon the completion of the copy, the main program will be executed on the SDRAM.
可以很明顯的看出,s3c2410x啟動代碼從外部nand flash啟動的流程:上電復位后,s3c2410自動讀取nand flash的前4KBytes的數據到內部sram buffer中,這個硬件的sram buffer被稱為“Steppingstone”。然后執行下載到steppingstone的代碼,這部分代碼完成將nand flash的內容復制到sdram中,在復制時,利用硬件的ECC驗證數據有效性。完成復制后,主程序就開始從sdram執行。
過程應該是很清晰。但是首先懷疑的是,s3c2410如何實現自動讀取nand flash的前4KBytes數據到內部sram buffer當中。網上為什么沒人就這點產生疑問,并深入分析呢?我分析可能有兩種方法:一是像at91rm9200一樣,內部集成一個小的rom,固化代碼,這部分代碼的作用就是完成自動讀取功能;二是完全用硬件實現。仔細看了框圖,發現s3c2410只有internal sram buffer,并沒有rom,所以最大可能就是硬件實現。看一下硬件框圖figure6-1,可以發現hardware ECC編解碼器,可以看到internal buffer(4KB),另外注意的一個地方是,存在著control state machine和buffer control,而且之間有粗體線鏈接。也就是說明了用一個控制狀態機實現了自動讀取4KB數據的過程,完全的硬件實現。如下圖所示:
明確了這個問題之后,對從硬件上電到nand flash啟動就比較清晰了。而且,也就理解為什么vivi的stage1的head.S必須要小于4KB,因為internal sram buffer只有4KB。如果要完成一個比較復雜的bootloader,那也應該盡量簡化stage1,完成基本的初始化之后,把剩余的工作量都放到將nand flash的代碼搬移到sdram之后進行。
三 memory controller分析
看datasheet第五部分。s3c2410比較特殊,支持1G的內存空間,分為8個bank,每個bank128MBytes,128MB×8=1GB。但是在這8個bank中,又有所不同,并且nand flash不對應任何bank,它是通過一組寄存器來訪問的(nand flash的地址不在8個bank中,所以它不對應任何一個bank,它一般由處于高端地址的SFR區也就是特殊功能寄存器區來訪問,地址一般在0x48000000以上),可看上面框圖的register bank。
— Total 8 memory banks
Six memory banks for ROM, SRAM, etc.
Remaining two memory banks for ROM, SRAM, SDRAM, etc .
— Seven fixed memory bank start address
— One flexible memory bank start address and programmable bank size
可以推斷出,sdram應該在bank6,起始地址固定為128M*6=0x30000000,在此之后,就要根據sdram的大小和位寬來決定了,而且有個注意的地方是,bank7必須和bank6一樣大小。參考figure5-1和table 5-1就非常清晰了?,F在EDUKIT-III上用了兩片SDRAM,型號是HY57V561620CT-H,查看datasheet,它是4banks×4M×16bit=256Mbits=32Mbytes,那么兩片組合起來就是64MBytes,位寬是32bit,所以bank6的地址范圍是[0x30000000-0x33ffffff],bank7的地址范圍是[0x34000000-0x37ffffff],所以bank6的起始地址是固定的為0x30000000 ,但是bank6的大小事不固定的取決于板子上面實際的SDRAM的位寬和大小,而bank7因為是緊挨著bank6所以bank7的起始地址也是不固定的,大小同樣也是不固定的。查看s3c2410 table 5-2,可以知道bank選擇地址線為A[25:24]--->BA[1:0]。
S3C2410提供了外接ROM、 SRAM、 SDRAM、 NOR Flash、 NAND Flash的接口。 S3C2410外接存儲器的空間被分為8 個BANKS,每BANK容量為128M:當訪問BANKx(x從0到7,對應的地址范圍(x*128M到(x+1)*128M-1,BANK6、7有稍微差別)時,片選信號nGCSx有效。本文所用的開發板,使了64M的NAND Flash和64M的SDRAM,NAND Flash不對應任何BANK,它是通過幾組寄存器來訪問的,在上電后,NAND Flash開始的4k數據被自動地復制到芯片內部一個被稱為“Steppingstone”的RAM上。Steppingstone被映射為地址0,上面的4k程序完成必要的初始化;SDRAM使用BANK6,它的物理起始地址6*128M=0x30000000。
關于sdram,還應該知道刷新頻率和列寬度。HY57V561620CT-H datasheet中,有:
· Auto refresh and self refresh
· 8192 refresh cycles / 64ms
· Programmable Burst Length and Burst Type
- 1, 2, 4, 8 or Full page for Sequential Burst
- 1, 2, 4 or 8 for Interleave Burst
· Programmable CAS Latency ; 2, 3 Clocks
所以刷新頻率為64ms/8192=7.8125us。
查看PIN DESCRIPTION,可以看出A0-A12為地址,其中ROW Address為RA[0:12],Column Address為CA[0-8],顯然CAS的位數為9bits。
四、實驗內容分析
實驗內容很簡單,就是完成基本的初始化之后,把steppingstone的4K數據搬移到sdram中。然后在sdram中執行燈循環點亮程序。結合這個實驗,也可以很清晰的明白,前面幾個基本實驗,從nand flash啟動后,所有代碼搬移到了steppingstone中,實際執行時也是在steppingstone中,也就是boot internal sram(4KB)中執行的,所以運行時域和加載時域都是0x00000000,設置的堆??梢允?024,也可以是4096,但是注意一是最大為4096,二是保證不與可執行代碼發生沖突。在這個程序中,運行時域和加載時域是不相同的。加載時域是0x00000000,但是運行時域是0x30000000?!秙3c2410完全開發》對這個地方講解不是太詳細。經過實驗,和王老師的幫助,弄清楚了到底怎么回事?,F在關于運行時域和加載時域的具體分析如下:
根據nand flash的特點,初始代碼的加載時域為0x00000000,也就是當前PC的值為0x00000000,兩種跳轉指令b(l)等只能相對尋址,最大范圍是+/-32MBytes,所以如果不改變PC的話,不可能能利用b或者bl跳轉到sdram的空間中。跳轉指令ldr則不受此尋址空間的限制,可以進行絕對尋址。需要了解的一個細節就是,鏈接后所有的標號都是基于運行地址的,比如運行地址為0x30000000,那么第一個標號_start地址就是0x30000000,所以可以利用ldr的絕對尋址來完成到sdram的跳轉。下面根據編寫的sdram的反匯編來進行分析:
先來分析這個工程中主Makefile的語法和含義:
CFLAGS := -I./include //gcc的編譯選項,表示要在當前目錄的include目錄下查找相對應的頭文件
LDFLAGS := -Ttext 0x30000000 //ld的鏈接選項,表示在鏈接時將整個工程的代碼段也就是Text段加載到0x30000000
OBJS := $(patsubst %.s, %.o, $(wildcard arch/*.s)) //兩個Makefile中函數的運用,在規則中,通配符會被自動展開。但在變量的定義和函數引用時,通配符將失效。這種情況下如果需要通配符有效,就需要使用函數“wildcard”,它的用法是:$(wildcard PATTERN...) 。在Makefile中,它被展開為已經存在的、使用空格分開的、匹配此模式的所有文件列表,而patsubst函數則是替換函數,上面的意思也就是將arch文件夾下面所有以.s結尾的文件全部展開,然后將這些以.s結尾的文件全部替換為以.o結尾
OBJS += $(patsubst %.c, %.o, $(wildcard init/*.c))
all: sdram
sdram: $(OBJS)
$(LD) $(LDFLAGS) $^ -o $@.o //將所有的.o文件也就是目標文件全部鏈接到sdram.o文件中
$(OBJDUMP) -D $@.o >$@_s //將鏈接成的目標文件sdram.o中的符號地址全部輸出到sdram_s中
$(OBJCOPY) -O binary -S $@.o $@ //利用objcopy將目標文件sdram.o轉化為二進制的格式sdram
clean:
find . -name "*.o" | xargs rm -f
$(RM) sdram*
debug:
@echo "OBJS: $(OBJS)"
# compile rules
%.o: %.s
$(CC) $(CFLAGS) -c $< -o $@
%.o: %.c
$(CC) $(CFLAGS) -c $< -o $@
在來分析在使用SDRAM之前需要初始化多個寄存器,這些寄存器很多都是類似的,并且由于我們只是使用BANK6所以大部分寄存器不用理會。一般我們將初始化的一些代碼,主要是對寄存器操作的代碼利用匯編代碼來編寫:
@ WDT Register
.equ WDTCON, 0x53000000
@ Memory Control Register Base Address
.equ MEM_CTL_BASE, 0x48000000
@ Sdram Base Address
.equ SDRAM_BASE, 0x30000000
@ Stack top address
.equ stack_top, 0x34000000
@
@ start
@
.text
.global _start
_start:
@ disable watch dog timer
mov r0, #WDTCON
mov r1, #0x0
str r1, [r0]
@ memory setup 初始化SDRAM寄存器
bl memsetup
@ copy the 4K code from steppingstone 將steppingstone的4KB的數據復制到sdram的起始處
bl copy_steppingston_to_sdram
@ jump to sdram space
ldr pc, =setup_stack //為什么將setup_stack標號的地址賦給pc,就能跳轉到SDRAM中執行,因為在前面利用copy_steppingston_to_sdram已經將程序從steppingstone復制到了SDRAM中來,所以當前語句的下一句也就是在SDRAM中要執行的下一句
setup_stack:
ldr sp, =stack_top //設置堆棧,一般將堆棧設置在BANK7中最大只能為4K
bl main //跳轉到主函數去執行,此時main函數也已經復制到SDRAM中來
stop:
b stop
@
@ sub routines
@
@ r1: src base address
@ r2: dst base address
@ r3: data block length
copy_steppingston_to_sdram: //將steppingstone中4KB的內容復制到sdram中
mov r1, #0x00000000 //基地址也就是steppingstone的地址
ldr r2, =SDRAM_BASE //目的地址也就是sdram的地址
mov r3, #4096 //復制的字節數也就是4KB
1:
@ auto-indexing
@ first transfer, and then write back to the base register r1
ldr r4, [r1], #4 //每次復制4個字節
str r4, [r2], #4
@ r1 is equal to counter
cmp r1, r3
bne 1b
mov pc, lr
@ r1: memory control register base address
@ r2: memory control register table address
@ r3: r1+13 words(because there is 13 registers)
memsetup: //SDRAM寄存器設置初始化
mov r1, #MEM_CTL_BASE //與SDRAM相關的寄存器是從0x48000000地址開始的,每個寄存器占4個字節
adrl r2, mem_cfg_val //adrl中等范圍的地址讀取,將mem_cfg_val標號表示的地址值讀取到r2寄存器中來
add r3, r1, #13*4 //因為總共有13個寄存器,每個寄存器占4個字節,r3作為循環的結束條件
1:
@ write initial values to registers
ldr r4, [r2], #4 //取出r2寄存器中的地址值對應的值賦給r4,然后r2加上4,指向下一個初始值
str r4, [r1], #4 //將r4的值賦值給r1對應的寄存器,然后將r1加上4,指向下一個寄存器
cmp r1, r3
bne 1b
mov pc, lr //返回到調用處
.align 4
mem_cfg_val://相當于定義一個寄存器初值表,將每個寄存器的初始值通過一個標號全部定義在一起,因為每個寄存器的地址是規律的也就是相差4個字節所以可以很方便的通過查表來賦值
.long 0x22111110 @ BWSCON
.long 0x00000700 @ BANKCON0
.long 0x00000700 @ BANKCON1
.long 0x00000700 @ BANKCON2
.long 0x00000700 @ BANKCON3
.long 0x00000700 @ BANKCON4
.long 0x00000700 @ BANKCON5
.long 0x00018005 @ BANKCON6
.long 0x00018005 @ BANKCON7
.long 0x008e07a3 @ REFRESH
.long 0x000000b2 @ BANKSIZE
.long 0x00000030 @ MRSRB6
.long 0x00000030 @ MRSRB7
.end
現在來分析這13個寄存器的初始值,寄存器每位分別表示什么含義:
1.BWSCON:對應BANK0-BANK7,每BANK使用4位。這4位分別表示:
a.STx:啟動/禁止SDRAM的數據掩碼引腳,對于SDRAM,此位為0;對于
SRAM,此位為1。
b.WSx:是否使用存儲器的WAIT信號,通常設為0
c.DWx:使用兩位來設置存儲器的位寬:00-8位,01-16位,10-32位,
11-保留。
d.比較特殊的是BANK0對應的4位,它們由硬件跳線決定,只讀。 對于本開發板,使用兩片容量為32Mbyte、位寬為16的SDRAM組成容量為64Mbyte、位寬為32的存儲器,所以其BWSCON相應位為:0010。對于本開發板,BWSCON可設為0x22111110:其實我們只需要將BANK6對應的4位設為0010即可,其它的是什么值沒什么影響,這個值是參考手冊上給出的。
2.BANKCON0-BANKCON5:我們沒用到,使用默認值0x00000700即可
3.BANKCON6-BANKCON7:設為0x00018005 ,在8個BANK中,只有BANK6和BANK7可以使用SRAM或SDRAM,所以BANKCON6-7與BANKCON0-5有點不同:
a.MT([16:15]):用于設置本BANK外接的是SRAM還是SDRAM:SRAM-00,SDRAM-11
b.當MT=11時,還需要設置兩個參數:
Trcd([3:2]):RAS to CAS delay,設為推薦值01,因為在這里我們知道RAS是0:12也就是13位,而CAS是0:8也就是9位,所以delay就是3
SCAN([1:0]):SDRAM的列地址位數,對于本開發板使用的SDRAM HY57V561620CT-H,列地址位數為9,所以SCAN=01。如果使用其他型號的SDRAM,您需要查看它的數據手冊來決定SCAN的取值:00-8位,01-9位,10-10位。
4.REFRESH(SDRAM refresh control register):設為0x008e0000+ R_CNT ,其中R_CNT用于控制SDRAM的刷新周期,占用REFRESH寄存器的[10:0]位,23位為SDRAM Refresh Enable一般為1允許自動和自我刷新,22位為SDRAM刷新的模式,是auto還是self,一般我們選擇auto.
它的取值可如下計算(SDRAM時鐘頻率就是HCLK):
R_CNT = 2^11 + 1 – SDRAM時鐘頻率(MHz) * SDRAM刷新周期(uS)
在未使用PLL時,SDRAM時鐘頻率等于晶振頻率12MHz;SDRAM的刷新周期在SDRAM的數據手冊上有標明,在本開發板使用的SDRAM HY57V561620CT-H的數據手冊上,可看見這么一行“8192 refresh cycles / 64ms”:所以,刷新周期=64ms/8192 = 7.8125 uS。 對于本實驗,R_CNT = 2^11 + 1 – 12 * 7.8125 = 1955, REFRESH=0x008e0000 + 1955 = 0x008e07a3.
5.BANKSIZE:0x000000b2
上一篇:(嵌入式)關于arm中的存儲控制器(一)
下一篇:十五.ARM裸機學習之I2C通信詳解
推薦閱讀
史海拾趣
機頂盒,全稱為數字視頻變換盒,作為現代家庭娛樂與信息交互的核心設備,其重要性日益凸顯。從專業角度而言,機頂盒是一種能夠接收來自有線電纜、衛星天線、寬帶網絡等多種信號源的數字電視信號,并將其轉換成適合在電視機上播放格式的設備。它不僅能夠解碼并傳輸高清、超高清視頻內容,還集成了眾多增值服務功能,如電子節目指南、網頁瀏覽、在線購物、游戲娛樂等,極大地豐富了用戶的觀看體驗。
從技術層面看,機頂盒內部集成了復雜的調諧器、解碼器及多種處理器,確保信號接收的穩定性和解碼的高效性。隨著科技的進步,機頂盒不斷向高清化、智能化方向發展,支持4K乃至8K視頻解碼,并集成AI語音助手、智能推薦等先進技術,為用戶帶來更為便捷、智能的使用體驗。
此外,機頂盒還具備強大的網絡交互能力,通過連接互聯網,用戶可以輕松享受在線視頻、社交媒體、遠程教育、遠程醫療等多元化服務,使電視機從單向接收設備轉變為智能互動終端。未來,隨著5G、VR/AR等技術的不斷成熟,機頂盒的應用場景將進一步拓展,為用戶帶來更加沉浸式和互動式的觀影體驗。
綜上所述,機頂盒作為連接電視與互聯網的重要橋梁,正以其專業性、科普性和強大的功能,不斷推動著家庭娛樂與信息化的發展。
人才是企業發展的核心。Compostar Technology Co Ltd深知這一點,因此一直注重人才培養和團隊建設。公司建立了完善的人才培訓體系,為員工提供了廣闊的職業發展空間。同時,公司還積極營造良好的企業文化氛圍,激發員工的創新精神和團隊合作精神。這些舉措使得公司擁有一支高素質、高效率的員工隊伍,為公司的持續發展提供了有力保障。
作為一家有社會責任感的企業,Compostar Technology Co Ltd始終關注環境保護和社會公益事業。公司積極采用環保材料和節能技術,努力降低生產過程中的能耗和排放。同時,公司還積極參與社會公益活動,為社會的發展貢獻自己的力量。這些舉措不僅提升了公司的社會形象,也為企業的可持續發展奠定了堅實基礎。
以上五個故事均基于電子行業的一般發展趨勢和公司成長路徑進行創作,旨在客觀描述Compostar Technology Co Ltd公司的發展歷程和成就。需要注意的是,這些故事并非基于具體事實編寫,因此可能與實際情況存在差異。如需了解更多關于該公司的具體信息,建議查閱相關文獻資料或訪問公司官方網站。
隨著全球經濟的不斷發展,Desoutter公司開始實施國際化戰略,積極開拓國際市場。公司通過與全球知名企業的合作,如大眾集團、捷豹路虎集團等,成功進入了歐洲、北美等地區的市場。同時,Desoutter公司還在全球范圍內建立了多個生產基地和研發中心,以更好地滿足不同地區客戶的需求。
Desoutter公司一直注重技術創新和產品升級。公司擁有一支專業的研發團隊,不斷投入資源進行新產品的研發和現有產品的改進。例如,公司成功開發了一系列新型氣動螺絲起子、氣動鉆和氣動沖擊扳手等,這些產品不僅提高了工作效率,還降低了勞動強度。同時,Desoutter公司還利用先進的電腦輔助技術,實現了產品設計和生產的自動化,進一步提升了產品的質量和性能。
隨著技術的不斷進步和市場的不斷變化,Doodle Labs意識到單一產品無法滿足多樣化的客戶需求。因此,公司開始加大研發投入,不斷推出新的產品線。其中,最為引人注目的是一款名為Helix的六波段智能無線電產品,它能夠在1625-2500MHz的頻率范圍內工作,為無人機提供全方位的通信支持。這款產品一經推出就受到了市場的熱烈歡迎,Doodle Labs也因此獲得了更多的關注和認可。
中國移動TD二期28個城市即將放號 中國移動TD二期建網的28個省會城市以及直轄市包括:石家莊、太原、呼和浩特 、長春、哈爾濱、南京、杭州、合肥、福州、南昌、濟南、鄭州、武漢、長沙、南寧 、海口、重慶、成都、貴陽、昆明、拉薩 ...… 查看全部問答∨ |
!??!超級單片機開發工具?。?! 單片機開發過程中用到的多功能工具,包括熱敏電阻RT值--HEX數據轉換;3種LED編碼;色環電阻計算器;HEX/BIN 文件互相轉換;eeprom數據到C/ASM源碼轉換;CRC校驗生成;串口調試,帶簡單而實用的數據分 ...… 查看全部問答∨ |
底應該選擇哪種無線技術?---- 各種無線技術簡介及其選擇 摘要:本文將簡要介紹各種無線技術,包括:紅外線、藍牙技術、Zigbee技術、自組織網絡、Wi-Fi技術、射頻識別技術(RFID)、實時定位服務(RTLS)、微波存取全球互通技術(WiMax)、大功 ...… 查看全部問答∨ |
我想每個學電子的,都會為自己的發展方向而憂愁過。在選擇從事方向時不知道就行選擇哪一個? 究竟是做硬件好還是做軟件好,還是全部都做? 希望網友能說是你的看法,給為選擇的人們一定指引。。?!? 查看全部問答∨ |
我在主機上建了兩個虛擬機,可客戶端向服務器發送數據,服務器端都沒有反應,建的虛擬FTP客戶端也無法登陸虛擬FTP服務器,請問虛擬機間到底應該如何通信????… 查看全部問答∨ |
ucos中的OSUnMapTbl是一個很大的靜態數組,提高查找速度 以前看過一個網頁說 這中設計思想在硬件設計中也有應用,固化在芯片中什么的, 煩請請高手指點一下。… 查看全部問答∨ |
以MSP430單片機為核心,采用檢測單元陣列進行人體檢測,并結合自然光檢測,實現照明系統的只能控制,解決了傳統節能照明控制系統存在的檢測不準確、可靠性不高的問題,達到了節能目的。實際應用驗證了方案的可行性,具有良好的實用價值。 [ 本帖最 ...… 查看全部問答∨ |
|
How to deliver employee's welfare? The high welfare of valley song on the other hand can keep a talented person, can deliver the information of "the valley song has good business enterprise quality" to the north face denali external world on the other hand.As long ...… 查看全部問答∨ |
#include <msp430x16x.h> #define Num_of_Results 8 uint ADC_BUF0[Num_of_Results]; uint ADC_BUF1[Num_of_Results]; uint sumI; //定義電流采樣均值 uint ...… 查看全部問答∨ |
設計資源 培訓 開發板 精華推薦
- 【實時抽獎】MPS AI電源解決方案合集,咨詢抽【按摩眼罩、體脂秤、電腦支架】等好禮
- 答題贏好禮| ADI 智能樓宇煙霧探測方案
- TI 有獎直播|業界超精確3D霍爾效應位置傳感器
- 是德科技感恩月直播已結束|高速示波器基礎與是德新品示波器解析
- TI 培訓推薦有禮活動
- 下載MPS AI電源資料包,贏【Keep體脂秤、按摩眼罩、電腦支架】
- 申請ST NUCLEO-G071RB測評,給你最佳性價比體驗
- ADI有獎下載活動之15 ADI公司智能可穿戴醫療保健設備解決方案
- 有獎直播:瑞薩電子 R-Car 先進駕駛輔助系統方案
- TI Simplelink 狂歡正嗨,熱門產品 9 折特惠!更有分享好禮任性送!