搜索
bottom↓
回复: 11

在1788的SDRAM中运行程序的尝试,单步运行成功,全速HARDFAULT

[复制链接]

出0入0汤圆

发表于 2012-10-21 10:14:02 | 显示全部楼层 |阅读模式
本帖最后由 blade4414 于 2012-10-21 10:17 编辑

一直在探索LPC1788的SDRAM使用,我的目标是在片内运行u-boot,将应用程序下载到nandflash中,再加载到SDRAM中,最后在SDRAM中运行。
使用的软硬件环境:MDKV4.10,JLINK V7,自制1788学习板。
目前调试中遇到问题,希望关注1788,或者对KEIL和CM3内核比较熟的朋友一起讨论一下。
我是使用了一个SDRAM测试程序修改而来的,
第一步、SDRAM的测试全部OK了。
第二步、仿照OpenOCD的SDRAM调试配置文件写了MPU初始化:
        p = (unsigned  int *)0xE000ED94 ;
        *p = (unsigned int )0x00000000;
       
        nop();nop();nop();nop();nop();nop();nop();nop();nop();nop();

       
        p = (unsigned  int *)0xE000ED9C  ;
        *p = (unsigned int )0x00000010;
        p = (unsigned  int *)0xE000EDA0   ;
        *p = (unsigned int )0x1004003f;
       
        p = (unsigned  int *)0xE000ED9C   ;
        *p = (unsigned int )0x00000011;
        p = (unsigned  int *)0xE000EDA0   ;
        *p = (unsigned int )0x0306E23b;
       
        p = (unsigned  int *)0xE000ED9C  ;
        *p = (unsigned int )0x40000012;
        p = (unsigned  int *)0xE000EDA0   ;
        *p = (unsigned int )0x13050033;
       
        p = (unsigned  int *)0xE000ED9C  ;
        *p = (unsigned int )0x80000013;
        p = (unsigned  int *)0xE000EDA0   ;
        *p = (unsigned int )0x1305001f;
       
        p = (unsigned  int *)0xE000ED9C  ;
        *p = (unsigned int )0xa0000014;
        p = (unsigned  int *)0xE000EDA0   ;
        *p = (unsigned int )0x03070031;
       
        p = (unsigned  int *)0xE000ED9C  ;
        *p = (unsigned int )0xe0000015;
        p = (unsigned  int *)0xE000EDA0   ;
        *p = (unsigned int )0x13040027;
       
        p = (unsigned  int *)0xE000ED9C  ;
        *p = (unsigned int )0xe0000016;
        p = (unsigned  int *)0xE000EDA0   ;
        *p = (unsigned int )0x00000000;
       
        p = (unsigned  int *)0xE000ED9C  ;
        *p = (unsigned int )0x1000E017;
        p = (unsigned  int *)0xE000EDA0   ;
        *p = (unsigned int )0x10060009;
       
        p = (unsigned  int *)0xE000ED94   ;
        *p = (unsigned int )0x00000001;
       
        nop();nop();nop();nop();nop();nop();nop();nop();nop();nop();
第三步:实现跳转代码,跳转到SDRAM中运行程序。
#define USER_FLASH_START        0xa0000000
void execute_user_code(void)
{
        volatile void (*user_code_entry)(void);
       
        /* Change the Vector Table to the USER_FLASH_START
        in case the user application uses interrupts */
        //NVIC_SetVectorTable(NVIC_VectTab_FLASH, USER_FLASH_START);
        SCB->VTOR  = 0;                                    /* 重新映射向量表               */
        //user_code_entry = (void (*)(void))((USER_FLASH_START)+4);
        user_code_entry = (void (*)(void))((USER_FLASH_START));
        user_code_entry();

}


测试中发现,有时PC能够跑到0xa000 0000 处,有时出现HARDFAULT.非常奇怪,一次偶然中发现,单步调试时在汇编代码调试窗口,每STEP一下,点一下鼠标,就可以运行到内存中去,而全速运行或者脱机跑时都会失败。

怎么直观的知道代码到SDRAM中去了?我的方法是实现一个位置无关的点灯代码:
__asm void LED_OFF(void)
{
    //LDR R1, =0x200980B8
        MOV32 R1, #0x200980B8
        MOV R2, #0x00000004
        STR R2,[R1]
        BX LR
}

__asm void LED_ON(void)
{
    //LDR R1, =0x200980BC
        MOV32 R1, #0x200980BC
        MOV R2, #0x00000004
        STR R2,[R1]
        BX LR
}
先调用一下,反汇编后知道其二进制代码:
uint16_t LEDOFF[] = {0xf248,0x01b8,0xf2c2,0x0109,0xf04f,0x0204,0x600a,0x4770};          //关闭P5.2 LED的二进制程序
uint16_t LEDON[]  = {0xf248,0x01bc,0xf2c2,0x0109,0xf04f,0x0204,0x600a,0x4770};          //打开P5.2 LED的二进制程序
再在SDRAM初始化后,写到我PC要跳转的目标内存中。

HARDFAULT时根据KEIL IDE反馈的信息 NVIC_FAULT_STAT推断是invstateS错误,MSR指令使用错误?可是反汇编中我没有看到MSR指令.

keil ide中STEP时点击IDE的反汇编窗口,是否通过JLINK对芯片做了一些读写操作,这个也可能是单步和全速效果不同的原因。

上程序:

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

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

出0入0汤圆

 楼主| 发表于 2012-10-21 10:19:03 | 显示全部楼层

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2012-10-21 10:27:16 | 显示全部楼层
问下楼主: user_code_entry = (void (*)(void))((USER_FLASH_START)); 不用写成  user_code_entry = (void (*)(void))((USER_FLASH_START + 1))么?

在SDRAM中的程序写简单点,直接上个B .的死循环。然后在那里设置个断点。如果跑到断点处能停下来,且汇编代码正确,那就说明基本运行OK了。

出0入0汤圆

 楼主| 发表于 2012-10-21 10:31:12 | 显示全部楼层
lishutong 发表于 2012-10-21 10:27
问下楼主: user_code_entry = (void (*)(void))((USER_FLASH_START)); 不用写成  user_code_entry = (void ...

跳转到SDRAM中,只需要指定一个对其的地址就可以,加不加1没有关系,这里只是简单测试,最后用的时候,一定会将SDRAM的部分空间,比如前面的空间作为VECTTABLE之类,后面才是代码加载空间。

出0入0汤圆

发表于 2012-10-21 10:32:47 | 显示全部楼层
M3的代码,跳转时不要求PC值0位必须为1,以保证在Thumb模式下?

出0入0汤圆

 楼主| 发表于 2012-10-21 21:46:54 | 显示全部楼层
版主能否将这个帖子移到ARM论坛或工具论坛中?

出0入0汤圆

发表于 2012-10-22 09:08:47 | 显示全部楼层
关注一下,我用的TI的9B96也出现过类似问题,目前还没有解决,只能暂时用官方的代码。

出0入0汤圆

发表于 2012-12-7 20:27:27 | 显示全部楼层
顶起来,楼主的问题不知道是否解决了?

出0入0汤圆

发表于 2013-4-9 14:10:05 | 显示全部楼层
mark                        

出0入0汤圆

发表于 2013-7-24 10:11:09 | 显示全部楼层
本帖最后由 kenuo1991 于 2013-7-24 10:34 编辑

LPC1788把SDRAM的地址放在0xA000 0000之后,检查一下MPU的配置是否正确,否则M3不能在这个区域内执行代码

出0入0汤圆

发表于 2013-8-11 22:40:04 | 显示全部楼层
mark....
顶一个....

出0入0汤圆

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

本版积分规则

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

GMT+8, 2024-4-26 18:09

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

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