在运用MCU的嵌入式体系规划中,当程序或许数据内存占用太大而无法放入片上闪存或SRAM时,开发者一般考虑运用SDRAM。
别问我为什么你的MCU不支撑SDRAM。
SDRAM是同步动态随机存取存储器的缩写。在微控制器运用中,微控制器通过运用外部存储控制器(EMC)操作拜访SDRAM ,SDRAM时钟频率一般为100MHz或133MHz。
外部存储控制器一般不支撑DDR SDRAM, 数据仅仅单边缘采样,即并行数据总线能够承受一个指令并在每个时钟周期传输一个数据字。
在SDRAM中履行程序是运用SDRAM的一种典型用法, 小编这儿就介绍一下SDRAM中履行程序的办法和SDRAM履行程序的功能基准。
SDRAM初始化
SDRAM有必要在运用前进行装备,SDRAM初始化分为6个进程。
装备EMC寄存器的SDRAM时钟频率、字节次序和时序参数。
SDRAM的时序比较复杂,用户需求通过查阅相关SDRAM芯片的手册取得时序参数(如改写周期、预充电指令周期、自改写退出时刻、写恢复时刻等等)。
发送NOP指令
发送预充电指令
发送两次主动改写指令
设置SDRAM形式
发送正常运转指令
体系发动时,SDRAM没有初始化。理论上,程序在体系发动后的任何时刻都能够进行SDRAM初始化。但是,因为SDRAM初始化进程比较复杂,运用的体系资源较多,SDRAM初始化有必要在所需的体系资源初始化完成后再进行。
详细上讲,开发者在芯片刚刚发动时(如Reset_Handler中)初始化SDRAM需求留神以下细节:
因为SDRAM初始化函数运用体系仓库或全局变量,开发者有必要保证体系仓库或全局变量地点的物理内存上电及时钟使能。
在程序跳转到主程序发动之前,全局变量未清零或初始化,如果在主函数之前履行SDRAM初始化,开发者有必要手动初始化变量。
举个比如,在LPC5460x中,开发者需求在SystemInit函数中初始化SDRAM,该函数(SystemInit)由Reset_Handler调用。在调用体系初始化之前,要通过设置AHBCLKCTRLSET0寄存器将SRAM时钟使能。
Reset_HandlerPROC EXPORTReset_Handler [WEAK] IMPORTSystemIniTIMPORT__main ;clock control SRAM1/SRAM2/SRAM3 for stack LDRr0, = 0x40000220 ; AHBCLKCTRLSET0 MOVr1, #0x38 STRr1, [r0] LDRr0, =SystemInit BLXr0 LDRr0, =__main BXr0 ENDP
SDRAM存储器布局
当运用SDRAM时,外部存储控制器(EMC)分配SDRAM必定的地址空间。开发者能够运用链接描绘文件将代码或数据分配到SDRAM中。值得注意的是,链接器脚本编程在不同IDE之间是不同的。
以LPC5460x系列微控制器为例,SDRAM支撑4个片选区,每个片选区最大支撑256MB空间。
SDRAM片选地址规模
00xA0000000 – 0xA7FFFFFF
10xA8000000 – 0xAFFFFFFF
20xB0000000 – 0xB7FFFFFF
30xB8000000 – 0xBFFFFFFF
当SDRAM的硬件衔接运用SDRAM片选0的情况下,在KEIL平台下,将加载在SPI FLASH的Coremark基准测验程序拷贝到SDRAM中履行需求以下几步。(coremark基准测验程序包含core_list_join.c,core_matrix.c,core_state.c及core_uTIl.c)。
界说SDRAM区域,从0xA0000000开端,巨细为0x80000。界说SPI FLASH区域,巨细为0x80000(SPI FLASH存储器的开始地址为0x10000000)。
在C源码中运用“SDRAM_Data” 和 “SDRAM_FuncTIon”特点,符号放在SDRAM区域中的数据或程序。(SDRAM_Data和SDRAM_FuncTIon仅仅文本姓名)。
也能够将整个方针文件的数据和程序段装备到SDRAM
# definem_spifi_start 0x10000000 # definem_spifi_size 0x800000 # definem_sdram_start 0xA0000000 # definem_sdram_size 0x80000 LR_m_text2 m_spifi_start m_spifi_size { ; load to SPIFI LR_m_sdram_text m_sdram_start m_sdram_size { *(SDRAM_Data) *(SDRAM_Function) core_list_join.o core_matrix.o core_state.o core_util.o }
装备MPU
在SDRAM中运转程序,开发者或许需求装备ARM内核内存保护单元(MPU)。
内存保护单元(MPU)是一个可编程单元,用于界说内存拜访权限。当MPU没有使能时,内存地址空间具有默许的拜访权限。
如ARM Cortex™-M4器材通用用户攻略中所述,当程序履行SDRAM中的代码且SDRAM内存暗射地址的默许特点为制止履行时, 内核就会发生HARDFAULT反常,且指令拜访抵触标志SCB-》CFSR为 1,该反常表明处理器测验从不答应履行的方位获取指令。
因而,当SDRAM被暗射到默许不行履行的地址空间时(如在LPC5460x中,SDRAM暗射到0xA0000000开始的地址),开发者有必要装备并使能MPU才能在SDRAM中履行代码。如下例中,代码装备并使能MPU,答应从0xA0000000到0xA0100000的内存区域是可履行的。
MPU-》RNR = 0; //Region number 0 MPU-》RBAR = 0xA0000000; //Region base address/* Full Access | TEX: 000 | S: 0 | C: 0 | B:0 (No cacheable, no shareable)| 1M SIZE | ENABLE */ MPU-》RASR = ( 0《《 28) | ( 0x3《《 24) | ( 0x0《《 19) | ( 0《《 18) | ( 0《《 17) | ( 0《《 16) | ( 0xFF《 8) | ( 0x13《《 1) | ( 1《《 0); //Region size and enable MPU-》 CTRL= MPU_CTRL_ENABLE_Msk| MPU_CTRL_PRIVDEFENA_Msk;
SDRAM功能基准
最终,小编在LPC5460x经进程序运转CoreMark功能基准测验,总结了一点点经历,共享给我们
SDRAM(16位带宽)中的代码履行功率仅为在内部SRAM中履行功率功能40%,大约是内部FLASH中运转代码功能的50%;
代码在SDRAM中运转时,较高的CPU频率(CPU没有Cache)不能改进履行功率,这时SDRAM带宽成为体系功能的瓶颈。
根据这样的测验成果,主张我们在要求较高功能时,把程序代码放在内部SRAM履行,而用片外大容量的SDRAM寄存海量的数据。
责任编辑:Ct