之前我的程序一直出现仿真器仿真时运行正常,不仿真但带电复位程序运行也正常,但是如果断电复位则程序不运行的情况。求助ST的工程师,答复是 程序的大小达到一定程度,init.s和vect.s的存储空间距离拉大,超出了flash的默认寻址空间关于flash的寻址空间, 因此,可以在跳转到init.s之前设置好这个寄存器 修改vect.s B Reset0 LDR PC, Undefined_Addr LDR PC, SWI_Addr LDR PC, Prefetch_Addr LDR PC, Abort_Addr NOP ; Reserved vector LDR PC, IRQ_Addr LDR PC, FIQ_Addr
Reset0 LDR R6, =0x54000000 LDR R7, =0x4 STR R7, [R6] LDR PC, Reset_Addr
这样改了之后确实解决了问题,但这样的解释是不对的,init.s和vect.s的存储空间距离不会随着程序生长而增大,我在链接配置文件已经固定了这两个文件在代码最前面。我认为可以解释为:STR的芯片在跳转语句执行时会判断程序代码是否超过设置的启动块FLASH的大小,如果超过了,则执行出错。所以要尽快设置0x54000000寄存器改变启动块FLASH的大小。 英倍特的STR912开发板EV912PCB随板提供的例子代码中,启动代码是分开在两个文件91x_vector.s和91x_init.s中,中断向量表在91x_vector.s里 LDR PC, reset_Addr LDR PC, Undefined_Addr LDR PC, SWI_Addr LDR PC, Prefetch_Addr reset_Addr里是标号 Reset_Handler的地址,Reset_Handler在91x_init.s定义,因此 这里执行了一次跨文件跳转。 STR912芯片有个特点是芯片启动后需设置启动块FLASH的大小和起始地址,这个大小默认是32K,设置后可以改成512K,256K等,如果程序大于32K了,而在没有设置启动块FLASH的大小前就调用了一个跳转语句,尤其是跨文件跳转语句,则STR912会出错,程序不能运行。也就是说如果程序大于了默认大小,则程序在执行跳转语句前必须重新设置启动块FLASH的大小。 但我不明白的是为什么仿真复位和带电复位时程序为什么可以运行? 难道这些情况下 寄存器0x54000000没有复位到默认值?
|