慧聪物联网 | 慧聪智能硬件网 | 慧聪新能源网 | 慧聪LED网 | 慧聪电气网 | 慧聪安防网 | 慧聪IT网 | 慧聪变频器网
特惠新品微信
投稿
热门推荐:传感器专栏 | 半导体专栏 | 晶振专栏 | 电容器专栏 | 威腾网 | 唯样商城 | 中国电子展 | 2019品牌盛会TOP10榜单

慧聪电子网首页 > 行业资讯 > 国内资讯 > 正文

分享到

为什么你的MCU不支持SDRAM

http://www.ec.hc360.com2020年02月19日14:00T|T

    在使用MCU的嵌入式系统设计中,当程序或者数据内存占用太大而无法放入片上闪存或SRAM时,开发者通常考虑使用SDRAM。

    别问我为什么你的MCU不支持SDRAM

    SDRAM是同步动态随机存取存储器的缩写。在微控制器应用中,微控制器通过使用外部存储控制器(EMC)操作访问SDRAM,SDRAM时钟频率通常为100MHz或133MHz。

    外部存储控制器通常不支持DDRSDRAM,数据只是单边沿采样,即并行数据总线可以接受一个命令并在每个时钟周期传输一个数据字。

    在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]

    IMPORTSystemInit

    IMPORT__main

    ;clockcontrolSRAM1/SRAM2/SRAM3forstack

    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平台下,将加载在SPIFLASH的Coremark基准测试程序拷贝到SDRAM中执行需要以下几步。(coremark基准测试程序包括core_list_join.c,core_matrix.c,core_state.c及core_util.c)。

    ①定义SDRAM区域,从0xA0000000开始,大小为0x80000。定义SPIFLASH区域,大小为0x80000(SPIFLASH存储器的起始地址为0x10000000)。

    ②在C源码中使用“SDRAM_Data”和“SDRAM_Function”属性,标记放在SDRAM区域中的数据或程序。(SDRAM_Data和SDRAM_Function只是文本名字)。

    ③也可以将整个目标文件的数据和程序段配置到SDRAM

    #definem_spifi_start0x10000000

    #definem_spifi_size0x800000

    #definem_sdram_start0xA0000000

    #definem_sdram_size0x80000

    LR_m_text2m_spifi_startm_spifi_size{;loadtoSPIFI

    LR_m_sdram_textm_sdram_startm_sdram_size{

    *(SDRAM_Data)*(SDRAM_Function)core_list_join.ocore_matrix.ocore_state.o

    core_util.o

    }

    配置MPU

    在SDRAM中运行程序,开发者可能需要配置ARM内核内存保护单元(MPU)。

    内存保护单元(MPU)是一个可编程单元,用于定义内存访问权限。当MPU没有使能时,内存地址空间具有默认的访问权限。

    如ARMCortex™-M4器件通用用户指南中所述,当程序执行SDRAM中的代码且SDRAM内存影射地址的默认属性为禁止执行时,内核就会产生HARDFAULT异常,且指令访问冲突标志SCB->CFSR为1,该异常表示处理器尝试从不允许执行的位置获取指令。

1

    因此,当SDRAM被影射到默认不可执行的地址空间时(如在LPC5460x中,SDRAM影射到0xA0000000起始的地址),开发者必须配置并使能MPU才能在SDRAM中执行代码。如下例中,代码配置并使能MPU,允许从0xA0000000到0xA0100000的内存区域是可执行的。

    MPU->RNR=0;//Regionnumber0

    MPU->RBAR=0xA0000000;//Regionbaseaddress

    /*FullAccess|TEX:000|S:0|C:0|B:0(Nocacheable,noshareable)|1MSIZE|ENABLE*/

    MPU->RASR=(0<<28)|(0x3<<24)|(0x0<<19)|(0<<18)|(0<<17)|(0<<16)|(0xFF<8)|(0x13<<1)|(1<<0);//Regionsizeandenable

    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存放海量的数据。

责任编辑:俞雪峰

声明:本网站中,来源标明为“ 慧聪电子网”的文章,转载请标明出处。

欢迎投稿,邮箱:yusy@hc360.com

活动推荐

更多

2019中国物联网产业大会

2019年11月27日

杭州·和达希尔顿逸林酒店

大会详情

友情链接

申请友情链接

赛迪网 RFID世界网电子信息产业网畅享网与非网电子产品世界威腾网慧聪家电网慧聪物联网

慧聪电子网总部

广州市越秀区东风东路745号紫园商务大厦19楼

慧聪电子网分部

深圳市福田区深南中路2070号电子科技大厦A座2106

关于我们 | 加入我们 | 我要投稿
| 寻求报道 | 申请合作

Copyright?2000-2014 hc360.com. All Rights Reserved
京ICP证010051号 海淀公安局网络备案编号:11010802015485