嵌入式芯片自己的ram和rom都很小,但有時須要處理的數據有很大,因而出現了EMC,EMC能夠外接norflash,sdram等來增長存儲區域。編程
CPU能夠經過AHB從機寄存器接口對EMC寄存器進行編程.爲了不可能發生的字順序問題,操做EMC寄存器的過程當中,全部數據的牀上必須是32位寬的字.
經過數據緩衝區進行讀寫操做,可提供存儲器帶寬並減小傳輸等待時間.數據寬城區可用做讀緩衝區,寫緩衝區或讀寫緩衝區.spa
訪問外部存儲器須要注意幾點:code
1.數據傳輸的字節順序接口
2.數據產生的寬度flash
3.對寫保護的存儲器區域進行寫操做.it
EMC與NOR_FLASH接線方式。class
EMC_OE輸出使能,EMC_WE寫使能,EMC_CS片選效率
EMC操做norflash用到的寄存器
配置
咱們再看看EMC的基本操做過程:im
1.首先是使能EMC: lpc1788爲例
在使用EMC前必定要先在功率控制寄存器中將其使能: 有的芯片不須要這兩步操做,自己就開啓的
LPC_SC->SCS |= (0x01 << 0); LPC_SC->PCONP |= 0x00000800; /* 使能EMC功率控制 */
接下來,設置EMC控制寄存器EMCControl的第0位置1,使能EMC:
LPC_EMC->Control = 0x00000001; /* 使能EMC */ LPC_EMC->Config = 0x00000000; /*小端模式,ROP復位 */
2.引腳鏈接:
將相關的引腳鏈接到EMC模塊.
LPC_IOCON->P3_0 = 1; /* D0 @ P3.0 */ LPC_IOCON->P3_1 = 1; /* D1 @ P3.1 */ LPC_IOCON->P3_2 = 1; /* D2 @ P3.2 */ LPC_IOCON->P3_3 = 1; /* D3 @ P3.3 */ LPC_IOCON->P3_4 |= 1; /* D4 @ P3.4 */ LPC_IOCON->P3_5 = 1; /* D5 @ P3.5 */ LPC_IOCON->P3_6 = 1; /* D6 @ P3.6 */ LPC_IOCON->P3_7 = 1; /* D7 @ P3.7 */ LPC_IOCON->P3_8 = 1; /* D8 @ P3.8 */ LPC_IOCON->P3_9 = 1; /* D9 @ P3.9 */ LPC_IOCON->P3_10 = 1; /* D10 @ P3.10 */ LPC_IOCON->P3_11 = 1; /* D11 @ P3.11 */ LPC_IOCON->P3_12 = 1; /* D12 @ P3.12 */ LPC_IOCON->P3_13 = 1; /* D13 @ P3.13 */ LPC_IOCON->P3_14 = 1; /* D14 @ P3.14 */ LPC_IOCON->P3_15 = 1; /* D15 @ P3.15 */ LPC_IOCON->P4_0 = 1; /* A0 @ P4.0 */ LPC_IOCON->P4_1 = 1; /* A1 @ P4.1 */ LPC_IOCON->P4_2 = 1; /* A2 @ P4.2 */ LPC_IOCON->P4_3 = 1; /* A3 @ P4.3 */ LPC_IOCON->P4_4 = 1; /* A4 @ P4.4 */ LPC_IOCON->P4_5 = 1; /* A5 @ P4.5 */ LPC_IOCON->P4_6 = 1; /* A6 @ P4.6 */ LPC_IOCON->P4_7 = 1; /* A7 @ P4.7 */ LPC_IOCON->P4_8 = 1; /* A8 @ P4.8 */ LPC_IOCON->P4_9 = 1; /* A9 @ P4.9 */ LPC_IOCON->P4_10 = 1; /* A10 @ P4.10 */ LPC_IOCON->P4_11 = 1; /* A11 @ P4.11 */ LPC_IOCON->P4_12 = 1; /* A12 @ P4.12 */ LPC_IOCON->P4_13 = 1; /* A13 @ P4.13 */ LPC_IOCON->P4_14 = 1; /* A14 @ P4.14 */ LPC_IOCON->P4_15 = 1; /* A15 @ P4.15 */ LPC_IOCON->P4_16 = 1; /* A16 @ P4.16 */ LPC_IOCON->P4_17 = 1; /* A17 @ P4.17 */ LPC_IOCON->P4_18 = 1; /* A18 @ P4.18 */ LPC_IOCON->P4_19 = 1; /* A19 @ P4.19 */ LPC_IOCON->P4_20 = 1; /* A20 @ P4.20 */ LPC_IOCON->P4_21 = 1; /* A21 @ P4.21 */ LPC_IOCON->P4_22 = 1; /* A22 @ P4.22 */ LPC_IOCON->P4_23 = 1; /* A23 @ P4.23 */ LPC_IOCON->P4_24 = 1; /* OEN @ P4.24 */ LPC_IOCON->P4_25 = 1; /* WEN @ P4.25 */ LPC_IOCON->P4_31 = 1; /* CSN[1] @ P4.31 */
3.時序設置:
LPC_EMC->StaticConfig1 = 0x00000081; //配置外部總線,16bit寬度 LPC_EMC->StaticWaitWen1 = 0x00000000; /* (n+1) -> 1 clock cycles */ LPC_EMC->StaticWaitOen1 = 0x00000001; /* (n) -> 1 clock cycles */ LPC_EMC->StaticWaitRd1 = 0x00000004; /* (n+1) -> 5 clock cycles */ LPC_EMC->StaticWaitPage1 = 0x00000000; /* (n+1) -> 1 clock cycles */ LPC_EMC->StaticWaitWr1 = 0x00000002; /* (n+2) -> 4 clock cycles */ LPC_EMC->StaticWaitTurn1 = 0x00000000; /* (n+1) -> 1 clock cycles */
通常不使用EMCStaticExtendedWait寄存器來計時讀和寫傳輸,而使用EMCStaticWaitRd和EMCStaticWaitWr寄存器,這樣是爲了靈活設置各類讀寫參數,能夠儘可能提升讀和寫的速度;固然用戶也可簡單地只使用EMCStaticExtendedWait寄存器來延時讀和寫傳輸時序,只是這樣讀寫效率會比較低。
讀的時序圖
一般狀況下,咱們再操做外部存儲器時分爲讀,寫兩個操做.
在讀操做的過程當中,咱們須要配置下面的寄存器
a.靜態存儲器輸出使能延時寄存器(EMCStaticWaitOen0-1);
b.靜態存儲器讀延時寄存器(EMCStaticWaitRd0-1);
EMCStaticWaitOen(n) Tce max 70ns
EMCStaticWaitRd(n) 從片選有效到從器件輸出容許失效之間的延時時間
讀時序圖
EMCStaticWaitWen(n) Tcs min 0ns
EMCStaticWaitWr(n)
EMCStaticWaitTurn(n) 總線翻轉週期,即從片選信號無效到有效之間的時間
EMCStaticWaitPage 設置讀取一頁的等待時間t的長短
頁模式下,一次片選有效期內可聯繫讀/寫4個字節,在這過程當中,-WE和-OE信號保持不變,只有地址信號發生變化