1788外扩了SDRAM,系统总是跑不起来,总是产生HardFault。

2019-03-25 20:13发布

1.问题:1788外扩了SDRAM,系统总是跑不起来,总是产生HardFault。2.系统说明:ucosiii+emwin,由于要显示一些画面,显示对话框中添加了 图片,编译结果代码量很大。3.外扩SRAM设置步骤1在启动文件中增加__low_level_init,其中为了初始化SDRAM,具体为什么放到main之前,原因不祥,按照官网emwin例程做的. SRAM1.jpg
2)需要选用offRAM1,编译代码 RW-data +ZI-data超出64k SDRAM2.jpg
3)修改分散加载文件 SDRAM3.jpg
4.问题现象单步运行调试发现EMC初始化中的引脚初始化产生handlefault ,如下图中的黄 {MOD}标示行。程序运行顺序:1)  SystemInit2)  __low_level_init 调用SDRAMInit()调用PINSEL_ConfigPin()调用PIN_GetPointer()在此位置产生handlefault。 SDRAM4.jpg


此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
8条回答
zsz2008610
2019-03-26 18:40
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
sdram1.JPG
在执行到调用函数返回时,程序行的 “}”位置,堆栈0xA000790,而PC 变成了0x0000000,下一步就产生了hardfault,实在是搞不懂了为什么了。
sdram2.JPG

一周热门 更多>