文章目錄
示例代碼下載
1.CPU如何控制外設?
- CPU控制相應外設的寄存器,有外設控制器發出特定的波形
2.CPU如何選擇寄存器?
- CPU通過內存控制器選擇
3.外設共用地址、數據總線,如何互不干擾?
- 通過片選CS引腳,選擇不同的外設
4.誰控制片選引腳
- 由芯片手冊得知:當CPU發出地址是0x00000000時
nGCS0
爲低電平選擇(有效)
5.CPU如何讀寫數據的方向?
- 通過外設芯片的讀寫引腳控制
6.CPU不同位寬設備如何連接並讀取數據【內存控制器】
6.1 連接方式
-
8bit ROM (從A0開始對應連接)
-
16bit ROM (A0不接,從A1開始)
-
32bit ROM(A0、A1不接,從A2開始)
6.2 CPU讀取ROM數據1個字節
- 例如在 地址3上讀取一個字節數據
mov R0.#3
LDRB R1,[R0]
過程 | CPU發出的地址 | ROM接收到的地址 | ROM返回的數據 | 內存控制器挑出指定字節送給CPU |
---|---|---|---|---|
8bit | 000011 | 000011 | 第3個byte | 第3個byte |
16bit | 000011 | 00001 | 第1個16bit | 根據A0=1,挑出16bit中的第1個byte給CPU(從0byte開始) |
32bit | 000011 | 00000 | 第0個32bit | 根據A0 A1=11挑出第3個byte給CPU(從0byte開始) |
- 綜上,也就是所有的地址線都會用到,內存控制器根據未接的地址線狀態判斷挑出指定的byte
6.3 CPU讀取ROM數據4個字節
mov R0,#4
LDR R1,[R0] ;從地址4上取出4個字節
過程 | CPU發出的地址 | 內存控制器轉發給ROM的地址 | ROM返回的數據 | 內存控制器組裝數據返回給CPU |
---|---|---|---|---|
8bit | 000100 | 000100、000101、000110、000111(共四次) | 得到地址4、5、6、7上的byte | 組裝給一個32bit數據給CPU |
16bit | 000100 | 00010、00011(共兩次) | 得到第2、3個16bit | 組裝給一個32bit數據給CPU |
32bit | 000100 | 0001(共一次) | 得到第1個32bit | 直接發送給CPU |
7.如何根據原理圖確定芯片訪問地址
7.1 方法
- 1.根據片選引腳確定基地址,見4.誰控制片選引腳
- 2.根據芯片所接地址線確定範圍
7.2 Nor Flash確定訪問地址
- 例如Nor Flash芯片:用到A20~A0共21條線
- 地址線21:即可訪問2M內存,
0x1FFFFF
- 根據它片選信號爲
nGCS0
可以得到基地址BASE = 0x00000000 - 其範圍爲
BASE+0x0000 0000 ~ BASE+0x001F FFFF
,即0x0000 0000 ~ 0x001F FFFF
7.3 Net芯片確定訪問地址
- 例如網卡net芯片:只連接了A2,但是其A0是用來確定16bit(網卡數據線爲16位)中的高8位還是低8位,因此A2 A0
- 根據其片選引腳爲
nGCS4
,可以得到基地址BASE = 0x2000 0000 - 其範圍爲
BASE+0x0000 0000 ~ BASE+0x0000 0101
,即0x2000 0000 ~ 0x2000 0005
8. Nor Flash時序分析
8.1 MX29LV160 讀數據時序
- Taa:發出地址信號之後多長時間數據有效
- Tce:發出片選信號之後多長時間數據有效
- Toe:發出讀信號之後多長時間數據有效
- Toh:數據保持時間
- Tdf:數據浮動時間
- Trc:讀取週期時間(70ns,即讀取速率最大爲70ns)
8.2 S3C2440 可編程訪問週期時序
- 爲了方便,使得
Addr、CS、OE
信號同時拉低使能,然後確保Tacc>=70ns,即可滿足Nor Flash的時序 - 則當HCLK=100M,內存控制器週期爲T=10ns,Tacc = 8T即可
9.代碼重定位
1.Nand啓動時,一上電,硬件會把前4K
數據複製到SRAM
2.CPU從0地址運行
如果程序大於4K,前4K的代碼需要把整個程序讀取出來放到SDRAM
【重定位
:重新確定程序地址】
9.1 Nor Flash特點
- 可以像內存一樣的讀取
- 不可以像內存一樣直接寫入(寫入有保護)
9.2 Nor直接寫入的結果
- 程序中含有需要修改(寫入)的變量,寫在Nor上,直接修改變量是無效的
- 因此需要
重定位
,放到SDRAM上
9.3 實驗
-
以Nor Flash 啓動,修改一變量,改變量並不會被修改,即無效
-
以Nand Flash 啓動,修改一變量,改變量會被修改
9.4 程序包含哪幾部分
代碼段text | 代碼 | |
---|---|---|
數據段data | (一般的全局變量) | |
只讀數據段rodata | const 全局變量 | |
bss | 初值爲0或無初值的全局變量 | 不保存在bin文件中 |
comment | 註釋 | 不保存在bin文件中 |
- bss:是“Block Started bySymbol”的縮寫,意爲“以符號開始的塊”。 BSS是Unix鏈接器產生的未初始化數據段。
- bss段與註釋段不保存在bin文件中
char g_Char = 'A'; //定義全局變量
const char g_Char2 = 'B'; //只讀全局變量
int g_A = 0; //初值爲0的全局變量
int g_B; //未定義初值的全局變量