搜索
bottom↓
回复: 21

LPC1788 SDRAM运行程序

[复制链接]

出0入0汤圆

发表于 2014-4-30 17:38:59 | 显示全部楼层 |阅读模式
折腾了很久 终于解决了 从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中运行简直是太慢了,我受不了。



阿莫论坛20周年了!感谢大家的支持与爱护!!

月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!

出0入0汤圆

 楼主| 发表于 2014-4-30 17:40:08 | 显示全部楼层
这个帖子 能到加精的标准么?
呵呵

出0入0汤圆

发表于 2014-4-30 17:41:17 | 显示全部楼层
兄弟,看rt-thread官方lpc4088的例程,我们的app都是跑在sdram里面的,应用程序从文件系统中读入。

出0入0汤圆

 楼主| 发表于 2014-4-30 17:43:58 | 显示全部楼层
o  好吧 我落伍了

出0入4汤圆

发表于 2014-4-30 19:24:49 | 显示全部楼层
一而,我也落伍了
再而,如果不是楼主这帖,我竟然还不知道自己落伍了!

出0入0汤圆

发表于 2014-4-30 19:29:37 | 显示全部楼层
LZ确定是在NANDFLASH里面可以跑程序么?而不是NORFLASH?

出0入0汤圆

发表于 2014-4-30 19:49:17 | 显示全部楼层
NandFlash(4M)? 这么小容量的Nandflash还第一次见?难道真有这么小容量的?

出0入0汤圆

发表于 2014-4-30 20:04:12 | 显示全部楼层

出0入0汤圆

发表于 2014-4-30 20:13:13 | 显示全部楼层
sunliezhi 发表于 2014-4-30 19:24
一而,我也落伍了
再而,如果不是楼主这帖,我竟然还不知道自己落伍了! ...

                +1

出0入0汤圆

发表于 2014-4-30 22:18:39 | 显示全部楼层
RT这么NX啊,抽空得研究下才行,有1788的支持包吗

出0入0汤圆

发表于 2014-4-30 23:40:30 来自手机 | 显示全部楼层
lpc1850的推广很不给力呀,那个片子可是外挂串行存储器来运行的

出0入0汤圆

发表于 2014-5-1 01:34:21 | 显示全部楼层
3DA502 发表于 2014-4-30 23:40
lpc1850的推广很不给力呀,那个片子可是外挂串行存储器来运行的

现在LPC4088也是带SPIFI的,程序可以直接链接到这个内存里面,MDK自动分散加载,直接下载就可以了,很方便,基本不需要啥设置,就需要添加nor flash进去,听NXP的工程师说,这个SPIFI执行程序的效率比SDRAM要高。所以在SPIFI上挂一个W25Q32的SPI Flash就足够用了。NXP甚至有些型号是没有片内Flash的,直接外挂SPI Nor,程序直接在里面跑,听说这类芯片价格要低蛮多,像LPC4330,LPC4350是没有内部Flash的。

出0入0汤圆

 楼主| 发表于 2014-5-2 23:23:00 | 显示全部楼层
rootxieinsh 发表于 2014-4-30 19:49
NandFlash(4M)? 这么小容量的Nandflash还第一次见?难道真有这么小容量的?

我说的4M 是 4M Byte  不是4M Bit

出0入0汤圆

发表于 2015-1-4 11:18:04 | 显示全部楼层
顶起,学习

出0入0汤圆

发表于 2015-1-4 21:15:34 | 显示全部楼层
用LPC1788 程序没超过512K, 以后会用到,谢谢!

出0入0汤圆

发表于 2015-1-26 14:45:52 | 显示全部楼层
请教楼主:我的代码用MDK直接烧写到片外Norflash,代码烧写进去了,但是无法运行起来,Mdk提示jlink不能设置断点。参考您的方法,MPU设置了也不行

出0入0汤圆

发表于 2015-9-11 11:04:33 | 显示全部楼层
好帖,收藏之。

出0入0汤圆

发表于 2016-9-14 09:30:54 | 显示全部楼层
楼主厉害,顶一下!

出0入0汤圆

发表于 2016-9-20 10:28:11 | 显示全部楼层
使用这段代码,发现访问lpc_eeprom异常,再加了一段对
  1.     MPU->RNR = 7;
  2.     MPU->RBAR = 0x200000; // update the base address for the region 7
  3.     MPU->RASR = MPU_RASR_ACCESS_PERMISSION(MPU_FULL_ACCESS)
  4.                 |MPU_RASR_REGION_SIZE(MPU_REGION_SIZE_256KB)
  5.                 |MPU_REGION_ENABLE;
复制代码
才能运行

出0入0汤圆

发表于 2016-9-24 13:16:18 | 显示全部楼层
感谢楼主分享

出0入0汤圆

发表于 2016-12-26 18:27:35 | 显示全部楼层
我去试试

出0入4汤圆

发表于 2018-4-8 10:08:04 | 显示全部楼层
source.ant 发表于 2015-1-26 14:45
请教楼主:我的代码用MDK直接烧写到片外Norflash,代码烧写进去了,但是无法运行起来,Mdk提示jlink不能设 ...

烧写到片外Norflash ?         厉害!    我现在想烧写到片外SDRAM还没头绪
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-26 08:48

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表