5546|8

9

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

1788外扩了SDRAM,系统总是跑不起来,总是产生HardFault。 [复制链接]

1.问题:
1788外扩了SDRAM,系统总是跑不起来,总是产生HardFault。
2.系统说明:
ucosiii+emwin,由于要显示一些画面,显示对话框中添加了 图片,编译结果代码量很大。
3.外扩SRAM设置步骤
1在启动文件中增加__low_level_init,其中为了初始化SDRAM,具体为什么放到main之前,原因不祥,按照官网emwin例程做的.

2)需要选用offRAM1,编译代码 RW-data +ZI-data超出64k

3)修改分散加载文件

4.问题现象
单步运行调试发现EMC初始化中的引脚初始化产生handlefault ,如下图中的黄色标示行。
程序运行顺序:
1)  SystemInit
2)  __low_level_init
调用SDRAMInit()
调用PINSEL_ConfigPin()
调用PIN_GetPointer()
在此位置产生handlefault。



此帖出自NXP MCU论坛

最新回复

有关mpu的设置函数如下, 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:0x80000000 - 0x90000000 --- NandFlash     *      + Size: 256MB     *      + Access permission: full access     */    MPU->RNR = 6;    MPU->RBAR = 0x80000000; // update the base address for the region 6    MPU->RASR = MPU_RASR_ACCESS_PERMISSION(MPU_FULL_ACCESS)                |MPU_RASR_REGION_SIZE(MPU_REGION_SIZE_256MB)                |MPU_REGION_ENABLE;     /* - Region 6:0xA0000000 - 0xA2000000 --- SDRAM     *      + Size: 32MB     *      + Access permission: full access     */    MPU->RNR = 7;    MPU->RBAR = 0xA0000000;                 // update the base address for the region 7    MPU->RASR = MPU_RASR_ACCESS_PERMISSION( MPU_FULL_ACCESS )                |MPU_RASR_REGION_SIZE( MPU_REGION_SIZE_32MB )                |MPU_REGION_ENABLE;    SCB->SHCSR |=(1  详情 回复 发表于 2015-12-5 11:18
点赞 关注
 

回复
举报

4997

帖子

19

TA的资源

裸片初长成(初级)

沙发
 
产生这个问题一般是内存或者堆栈溢出,也有可能是指针应用中产生错误。
此帖出自NXP MCU论坛
 
个人签名我的博客
 
 

回复

1173

帖子

3

TA的资源

五彩晶圆(初级)

板凳
 
建议你先单独调试一下SDRAM看看配置上对了没有,应该是SDRAM有问题
此帖出自NXP MCU论坛
 
 
 

回复

9

帖子

0

TA的资源

一粒金砂(中级)

4
 
SDRAM初始化程序在SDRAM的一个测试程序中使用,没有问题,SDRAM测试都通过。
在单步运行查看好像不是堆栈溢出,在调用引脚设置函数时,不能返回到原调用位置,不知为什么?
修改分配大小,不知分配多少合适,先修改试试,调试步骤
1)大小分配如下,stack_size 0x200000, heap_size 0x400000,足够大吧
查看map地址如下,是片外SDRAM的地址

单步运行到将要出现hardfault的位置,堆栈情况如下:
MSPR13都是0XA0623648,比栈顶略低一点
但是执行到retuin }之后,MSPR13都是0XA0623650,堆栈也没溢出,但是PC指向了一个死循环,MOVS r0 r0 ,不知为什么会返回到这来了
再仔细查看return处的汇编,运行到}位置,没有返回到条用该该函数的位置,直接到上图位置。
这就不明白为什么了。

此帖出自NXP MCU论坛
 
 
 

回复

15

帖子

2

TA的资源

一粒金砂(中级)

5
 
1)、对于__low_level_init可以再main前或是main后初始化,放在main前我认为是SDRAM是属于底层,和系统时钟一样应该已经作为运行条件已经准备好了,这样更符合逻辑。
2)、对已(2)和(3)这两个的设置应该是使用其中的一个才对,两个是不能同时使用,无论是(2)和(3)应该都是选用了SDRAM作为了RW-data +ZI-data区域,也就是说SDRAM也是代码的运行区域,这应该是有问题的。默认情况上SDRAM不作为代码的运行区域,要作为代码的运行区域可以设置MPU。
此帖出自NXP MCU论坛

点评

谢谢大侠指点,关于MPU的修改还在研究中,要是有好的例程麻烦大侠推荐下  详情 回复 发表于 2015-12-4 16:08
 
 
 

回复

9

帖子

0

TA的资源

一粒金砂(中级)

6
 
cybinlyc 发表于 2015-12-4 10:01
1)、对于__low_level_init可以再main前或是main后初始化,放在main前我认为是SDRAM是属于底层,和系统时钟 ...

谢谢大侠指点,关于MPU的修改还在研究中,要是有好的例程麻烦大侠推荐下
此帖出自NXP MCU论坛
 
 
 

回复

15

帖子

2

TA的资源

一粒金砂(中级)

7
 
有关mpu的设置函数如下,
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:0x80000000 - 0x90000000 --- NandFlash
    *      + Size: 256MB
    *      + Access permission: full access
    */
   MPU->RNR = 6;
   MPU->RBAR = 0x80000000; // update the base address for the region 6
   MPU->RASR = MPU_RASR_ACCESS_PERMISSION(MPU_FULL_ACCESS)
               |MPU_RASR_REGION_SIZE(MPU_REGION_SIZE_256MB)
               |MPU_REGION_ENABLE;

    /* - Region 6:0xA0000000 - 0xA2000000 --- SDRAM
    *      + Size: 32MB
    *      + Access permission: full access
    */
   MPU->RNR = 7;
   MPU->RBAR = 0xA0000000;                 // update the base address for the region 7
   MPU->RASR = MPU_RASR_ACCESS_PERMISSION( MPU_FULL_ACCESS )
               |MPU_RASR_REGION_SIZE( MPU_REGION_SIZE_32MB )
               |MPU_REGION_ENABLE;

   SCB->SHCSR |=(1<<16);   //Enable Memory management fault
   MPU->CTRL =(1<<0);      //Enable the MPU
}
此帖出自NXP MCU论坛

点评

刚试验过,同样的工程添加了board_mpu_init之后,在target-read/write menory areas 中选中offram,运行还是会出现同样的hardfault,如果不选择offram,程序就能正常运行。也就是说只要使能外部SDRAM,程序就不能正常  详情 回复 发表于 2015-12-6 01:07
谢谢,这个初始化函数是不是应该放在 startup.s文件中,放在systeminit之后,SDRAMinit和MAIN之前  详情 回复 发表于 2015-12-5 23:35
 
 
 

回复

9

帖子

0

TA的资源

一粒金砂(中级)

8
 
cybinlyc 发表于 2015-12-5 11:18
有关mpu的设置函数如下,
void board_mpu_init( void )
{
    /* - Region 0: 0x00000000 - 0x0007FFFF  ...

谢谢,这个初始化函数是不是应该放在  startup.s文件中,放在systeminit之后,SDRAMinit和MAIN之前
此帖出自NXP MCU论坛
 
 
 

回复

9

帖子

0

TA的资源

一粒金砂(中级)

9
 
cybinlyc 发表于 2015-12-5 11:18
有关mpu的设置函数如下,
void board_mpu_init( void )
{
    /* - Region 0: 0x00000000 - 0x0007FFFF  ...

刚试验过,同样的工程添加了board_mpu_init之后,在target-read/write menory areas 中选中offram,运行还是会出现同样的hardfault,如果不选择offram,程序就能正常运行。也就是说只要使能外部SDRAM,程序就不能正常运行;如果不使能,程序正常运行。

添加board_mpu_init的方法,修改startup.s
Reset_Handler   PROC
                EXPORT  Reset_Handler             [WEAK]
                                IMPORT  SystemInit
                                IMPORT board_mpu_init
                                IMPORT  __low_level_init
                IMPORT  __main
                                LDR     R0, =SystemInit
                BLX     R0
                                LDR     R0, =board_mpu_init
                BLX     R0
                                LDR     R0, =__low_level_init
                BLX     R0
                LDR     R0, =__main
                BX      R0
                ENDP

产生hardfault时的堆栈和PC
在调用函数返回之前,堆栈0xA0007788,PC 是0x00017dc

在执行到调用函数返回时,程序行的 “}”位置,堆栈0xA000790,而PC 变成了0x0000000,下一步就产生了hardfault,实在是搞不懂了为什么了。

此帖出自NXP MCU论坛
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表