折腾了很久 终于解决了 从SDRAM中运行APP程序。

说明:LPC1788 本身有512K的flash和96K的RAM。支持TFT和SDRAM 这算是跟别家cortex-M3架构MCU相比较的一个亮点。
我这个项目需要使用GUI,NXP有免费的emwin库,这也是一个极大的便利。
我这个项目显示图形比较多,没有配置SD卡或NorFlash,硬件的大致结构式 LPC1788+NandFlash(4M)+SDRAM(16M)+4.3寸TFT。

运行过程中显示的图片比较多,客户方不想把图形以及字库文件存在NandFlash中,只有通过转换成C的方式编译在一起,Oh my god! 固件超大,远远超过512K。
我一开始以为 LPC1788 应该会跟STM32F103ZE这个片子一样很容易就可以实现SDRAM中运行,没想到根本不行。NXP的官方资料也比较少,求人不如求己,还是自己琢磨吧。
LPC1788 支持MPU,所以一开始我的程序装载到SDRAM中无法运行 也是因为MPU的缘故。知道了原因就近似等于找到了解决办法。

google了很久终于琢磨出来了,需要在MPU中配置SDRAM,才可以运行程序的。
我把其中的代码贴上来吧,有兴趣的可以看看。

#include "core_cm3.h"
#include <stdint.h>
#include <string.h>

//运行指定地址的程序
void JUMP_TO_APP(unsigned long  address)
{
    __ASM("LDR SP, [R0]     ;Load new stack pointer address");
    __ASM("LDR PC, [R0, #4] ;Load new program counter address");
}

//从指定了NandFlash地址 复制数据到SDRAM 并运行SDRAM程序
void board_jump_to_app(void)
{
    //关闭全部中断
    NVIC_DeInit();

//Copy target firmware to SDRAM
    memcpy((void *)SDRAM_BASE_ADDR,(void *)NOR_FLASH_BASE,NOR_FLASH_SIZE);

__set_MSP(SDRAM_BASE_ADDR);

JUMP_TO_APP(SDRAM_BASE_ADDR);
}

//判断 NandFlash中程序的有效性。LPC1788 会在0x1C偏移处设置校验码,
//return 1-> OK ,others is error
uint8_t app_checksum_is_correct(void)
{
    int i;
    uint32_t cksum, *buff;

buff = (uint32_t *)NOR_FLASH_BASE;

//判断App程序的第一个跳转指令地址 是否是SDRAM的高位地址  
    if((buff[1] & SDRAM_BASE_ADDR) != SDRAM_BASE_ADDR)
        return 0;

//以下是校验码算法,各位自己琢磨
    cksum = 0;

for (i = 0; i < 7; ++i) {
        cksum += buff[i];
    }

cksum = (0xFFFFFFFF - cksum + 1);

//判断校验码是否符合要求,返回1 表示OK
    return ((cksum == buff[7]) && (buff[7] != 0));
}

/**********************************************************************/
/*                           MPU 设置                                                                              */
/**********************************************************************/
/* Region size definitions */
#define MPU_REGION_SIZE_32B     0x04
#define MPU_REGION_SIZE_64B     0x05
#define MPU_REGION_SIZE_128B    0x06
#define MPU_REGION_SIZE_256B    0x07
#define MPU_REGION_SIZE_512B    0x08
#define MPU_REGION_SIZE_1KB     0x09
#define MPU_REGION_SIZE_2KB     0x0A
#define MPU_REGION_SIZE_4KB     0x0B
#define MPU_REGION_SIZE_8KB     0x0C
#define MPU_REGION_SIZE_16KB    0x0D
#define MPU_REGION_SIZE_32KB    0x0E
#define MPU_REGION_SIZE_64KB    0x0F
#define MPU_REGION_SIZE_128KB   0x10
#define MPU_REGION_SIZE_256KB   0x11
#define MPU_REGION_SIZE_512KB   0x12
#define MPU_REGION_SIZE_1MB     0x13
#define MPU_REGION_SIZE_2MB     0x14
#define MPU_REGION_SIZE_4MB     0x15
#define MPU_REGION_SIZE_8MB     0x16
#define MPU_REGION_SIZE_16MB    0x17
#define MPU_REGION_SIZE_32MB    0x18
#define MPU_REGION_SIZE_64MB    0x19
#define MPU_REGION_SIZE_128MB   0x1A
#define MPU_REGION_SIZE_256MB   0x1B
#define MPU_REGION_SIZE_512MB   0x1C
#define MPU_REGION_SIZE_1GB     0x1D
#define MPU_REGION_SIZE_2GB     0x1E
#define MPU_REGION_SIZE_4GB     0x1F

/* Access permission definitions */
#define MPU_NO_ACCESS                           0x00
#define MPU_PRIVILEGED_ACESS_USER_NO_ACCESS     0x01
#define MPU_PRIVILEGED_RW_USER_READ_ONLY        0x02
#define MPU_FULL_ACCESS                         0x03
#define MPU_UNPREDICTABLE                       0x04
#define MPU_PRIVILEGED_READ_ONLY_USER_NO_ACCESS 0x05
#define MPU_READ_ONLY                           0x06

/* RASR bit definitions */
#define MPU_RASR_REGION_SIZE(n)         ((uint32_t)(n<<1))
#define MPU_RASR_ACCESS_PERMISSION(n)   ((uint32_t)(n<<24))
#define MPU_REGION_ENABLE               ((uint32_t)(1<<0))

void board_mpu_init(void)
{
    /* - Region 0: 0x00000000 - 0x0007FFFF --- on-chip non-volatile memory
     *      + Size: 512kB
     *      + Acess permission: full access
     */
    MPU->RNR  = 0;//indicate MPU region 0
    MPU->RBAR = 0x00000000; // update the base address for the region 0
    MPU->RASR = MPU_RASR_ACCESS_PERMISSION(MPU_FULL_ACCESS)     //full access
                |MPU_RASR_REGION_SIZE(MPU_REGION_SIZE_512KB)    //512Kb size
                |MPU_REGION_ENABLE;                             //region enable

/* - Region 1: 0x10000000 - 0x1000FFFF --- on-chip SRAM
     *      + Size: 64kB
     *      + Access permission: full access
     */
    MPU->RNR = 1;
    MPU->RBAR = 0x10000000; // update the base address for the region 1
    MPU->RASR = MPU_RASR_ACCESS_PERMISSION(MPU_FULL_ACCESS)
                |MPU_RASR_REGION_SIZE(MPU_REGION_SIZE_64KB)
                |MPU_REGION_ENABLE;

/* - Region 2: 0x40000000 - 0x400FFFFF --- APB peripheral
     *      + Size: 1MB
     *      + Access permission: full access
     */
    MPU->RNR = 2;
    MPU->RBAR = 0x40000000; // update the base address for the region 2
    MPU->RASR = MPU_RASR_ACCESS_PERMISSION(MPU_FULL_ACCESS)
                |MPU_RASR_REGION_SIZE(MPU_REGION_SIZE_1MB)
                |MPU_REGION_ENABLE;

/* - Region 3: 0x20080000 - 0x200BFFFF --- AHB peripheral
     *      + Size: 256KB
     *      + AP=b011: full access
     */
    MPU->RNR = 3;
    MPU->RBAR = 0x20080000; // update the base address for the region 3
    MPU->RASR = MPU_RASR_ACCESS_PERMISSION(MPU_FULL_ACCESS)
                |MPU_RASR_REGION_SIZE(MPU_REGION_SIZE_256KB)
                |MPU_REGION_ENABLE;

/* - Region 4: 0xE0000000 - 0xE00FFFFF --- System control
     *      + Size: 1MB
     *      + Access permission: full access
     */
    MPU->RNR = 4;
    MPU->RBAR = 0xE0000000; // update the base address for the region 4
    MPU->RASR = MPU_RASR_ACCESS_PERMISSION(MPU_FULL_ACCESS)
                |MPU_RASR_REGION_SIZE(MPU_REGION_SIZE_1MB)
                |MPU_REGION_ENABLE;

/* - Region 5:0x20000000 - 0x20007FFF --- on chip SRAM
     *      + Size: 32kB
     *      + Access permission: full access
     */
    MPU->RNR = 5;
    MPU->RBAR = 0x20000000; // update the base address for the region 5
    MPU->RASR = MPU_RASR_ACCESS_PERMISSION(MPU_FULL_ACCESS)
                |MPU_RASR_REGION_SIZE(MPU_REGION_SIZE_32KB)
                |MPU_REGION_ENABLE;

/* - Region 6:0xA0000000 - 0xA1000000 --- NorFlash
    *      + Size: 16MB
    *      + Access permission: full access
    */
   MPU->RNR = 6;
   MPU->RBAR = 0x90000000; // update the base address for the region 5
   MPU->RASR = MPU_RASR_ACCESS_PERMISSION(MPU_FULL_ACCESS)
               |MPU_RASR_REGION_SIZE(MPU_REGION_SIZE_16MB)
               |MPU_REGION_ENABLE;

/* - Region 6:0xA0000000 - 0xA1000000 --- Ext SRAM
    *      + Size: 16MB
    *      + Access permission: full access
    */
   MPU->RNR = 7;
   MPU->RBAR = 0xA0000000; // update the base address for the region 5
   MPU->RASR = MPU_RASR_ACCESS_PERMISSION(MPU_FULL_ACCESS)
               |MPU_RASR_REGION_SIZE(MPU_REGION_SIZE_16MB)
               |MPU_REGION_ENABLE;

SCB->SHCSR |=(1<<16);   //Enable Memory management fault
   MPU->CTRL =(1<<0);      //Enable the MPU

////    _DBG_("Setup MPU: \n\r"
////          "This provide 6 regions: \n\r"
////          "Region 0 - Privileged code: 0x00000000 - 0x0007FFFF(512kB)\n\r"
////          "Region 1 - Privileged data: 0x10000000 - 0x1000FFFF(64kB)\n\r"
////          "Region 2 - APB Peripheral:  0x40000000 - 0x400FFFFF(1MB)\n\r"
////          "Region 3 - AHB peripheral:  0x20080000 - 0x200BFFFF(256KB)\n\r"
////          "Region 4 - System control:  0xE0000000 - 0xE00FFFFF(1MB)\n\r"
////          "Region 5 - On-chip SRAM:    0x20000000 - 0x20007FFF(32kB)\n\r"
////          "Region 6 - Ext SRAM         0xA0000000 - 0xA1000000(16MB)\n\r");
//

}

通过 执行board_mpu_init() 函数以后,NandFlash 和 SDRAM中都可以直接运行程序。但是NandFlash中运行简直是太慢了,我受不了。

转载http://www.amobbs.com/thread-5579116-1-1.html

LPC1788 SDRAM运行程序的更多相关文章

  1. 操作系统篇-hello world(免系统运行程序)

     || 版权声明:本文为博主原创文章,未经博主允许不得转载. 一.前言     今天起开始分享关于操作系统的相关知识,本人也是菜鸟一个,正处于学习阶段,这整个操作系统篇也是我边学习边总结的一些结果,希 ...

  2. Xcode 运行程序,左侧memory 不显示内存

    运行程序后,xcode 不显示当前使用的内存情况,问题是打开了僵尸--enable zoombie Objects,关闭即可 打开 product--->SCheme-->EditSChe ...

  3. C# 管理员身份运行程序

    在使用winform程序获取调用cmd命令提示符时,如果是win7以上的操作系统,会需要必须以管理员身份运行才会执行成功,否则无效果或提示错误. 比如在通过winform程序执行cmd命令时,某些情况 ...

  4. IntelliJ IDEA 配置运行程序

    IntelliJ IDEA 对于Javaer开发来说还是很nice的,就是第一次用可能配置项有点生疏,这里就记录一下IntelliJ IDEA 配置运行程序. 1. 点击Edit Config... ...

  5. Usage: AddDimensionedImage imageFile outputFile eclipse 运行程序出错

    关于这个在eclipse中运行java程序的错,首先确认你的jdk,jre是否完整,并且与你的eclipse的位数相同,当然我相信这个错误大家应该都会去检查到. 第二个关于addDimensioned ...

  6. [原创]Win7、Win8、Win10始终以管理员身份运行程序。

    在Win7.Win8.Win10系统中,以管理员身份运行程序很麻烦,一般有以下几种方式: 1.在可执行程序或快捷方式上右键,以管理员身份运行: 2.在可执行程序或快捷方式上右键->属性-> ...

  7. C#将exe运行程序嵌入到自己的winform窗体中

    以下例子是将Word打开,然后将它嵌入到winform窗体中,效果如下图:C将exe运行程序嵌入到自己的winform窗体中 - kingmax_res - iSport注意:该方法只适用于com的e ...

  8. 麒麟系统使用root权限运行程序

    最近在虚拟机里安装了个国产麒麟系统.(不知道麒麟系统的百度下.) ************************************************** 官方网址:http://www. ...

  9. 后台运行程序screen or nohup

    后台运行 方法1 &   方法2:screen screen –S lnmp à起个名字 进去后运行程序 Ctrl+ad à退出lnmp屏幕 Scree –ls à查看 Screen –r x ...

随机推荐

  1. VMware Workstation pro 12下载以及序列号

    VMware Workstation 12序列号:下载地址:https://download3.vmware.com/software/wkst/file/VMware-workstation-ful ...

  2. MySQL 使用mysqld_multi部署单机多实例详细过程 (转)

    随着硬件层面的发展,linux系统多核已经是普通趋势,而mysql是单进程多线程,所以先天上对多进程的利用不是很高,虽然 5.6版本已经在这方面改进很多,但是也没有达到100%,所以为了充分的利用系统 ...

  3. IOS开发-视频,音频,录音简单总结

    /***** * 1. 视频播放 * *  @格式:mp4 mov m4v m2v 3gp 3g2 * *  @系统框架使用:#import <MediaPlayer/MediaPlayer.h ...

  4. html5外包—长年承接html5外包业务:《Sencha Touch权威指南》下载

    <Sencha Touch权威指南>内容简介:如何才能全面而透彻地理解和掌握移动应用开发框架Sencha Touch并开发出令人心动的移动应用?<Sencha Touch权威指南&g ...

  5. css 默认

    先写全局的样式 body { margin:0 auto; font-size:12px; font-family:Verdana; line-height:1.5;} ul,dl,dd,h1,h2, ...

  6. 正则表达式(BREs,EREs,PREs)差异比较

    我想各位也和我一样,再linux下使用grep,egrep, awk , sed, vi的搜索时,会经常搞不太清楚,哪此特殊字符得使用转义字符'\' ..   哪些不需要, grep与egrep的差异 ...

  7. activiti自定义流程之Spring整合activiti-modeler5.16实例(四):部署流程定义

    注:(1)环境搭建:activiti自定义流程之Spring整合activiti-modeler5.16实例(一):环境搭建        (2)创建流程模型:activiti自定义流程之Spring ...

  8. 【转】VS2013 C#WinForm程序构造界面拖动控件NumericUpDown时"未响应“是有道词典惹的祸

    很久之前遇到过因为金山词霸和其他软件冲突导致的程序无响应的情况. 没想到今天情况重现,VS2013在可视化编辑NumbericUpDown控件的时候,又出现了”未响应“,发现又是有道词典惹的祸. 可见 ...

  9. Zookeeper + Hadoop2.6 集群HA + spark1.6完整搭建与所有参数解析

    废话就不多说了,直接开始啦~ 安装环境变量: 使用linx下的解压软件,解压找到里面的install 或者 ls 运行这个进行安装 yum install gcc yum install gcc-c+ ...

  10. CF 120F Spider 树的直径 简单题

    一个男孩有n只玩具蜘蛛,每只蜘蛛都是一个树的结构,现在男孩准备把这n只小蜘蛛通过粘贴节点接在一起,形成一只大的蜘蛛.大的蜘蛛也依然是树的结构.输出大的蜘蛛的直径. 知识: 树的直径是指树上的最长简单路 ...