嵌入式芯片自己的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信号保持不变,只有地址信号发生变化