打印

STR912程序带电复位运行正常,断电复位死机问题请教

[复制链接]
3182|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
smartsheep|  楼主 | 2007-10-18 17:30 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
大家好

这里在用STR912的人多吗? 我现在调试这个程序,仿真调试运行OK,不仿真只要下载程序后不断电,运行都正常,复位也正常, 但是一旦断电后再上电,死机! 这好像不是硬件问题,因为有些程序断电后也是可以跑的。 

ST的人指导我把启动代码的__main改成Main,在简单的程序里这管用,一些原来断电复位会死机的程序现在能跑了,但是现在又不行了,不管使用__main还是Main, 断电复位都是死机。

急啊,请高手指点!
沙发
linqing171| | 2007-10-18 17:51 | 只看该作者

复位时间够么?

有没有复位上升沿的时间要求?
没有用过,单片机不复位的见过.

你程序是release的么?是不是仿真器默认在第一步放了个中断?

使用特权

评论回复
板凳
smartsheep|  楼主 | 2007-10-18 22:31 | 只看该作者

复位电路问题的可能性不大

如果是复位电路有问题,它应该对所有程序一视同仁, 现在的问题是有些程序是能够跑的。

在不插仿真器的情况下, 用复位按键复位,程序也是正常跑的, 就是断了电后,再启动就跑不起来了。

我在想是不是程序启动代码的哪个地方在RAM里放了什么参数,在带电复位的情况下,RAM里的数据还是存在的,所以启动还是正常,但断电后RAM里数据清空了,这时再上电启动就不正常了。

使用特权

评论回复
地板
smartsheep|  楼主 | 2007-10-22 13:25 | 只看该作者

请给些帮助

没碰到过这个问题的朋友给个建议也行。

使用特权

评论回复
5
席君秋| | 2007-10-22 13:34 | 只看该作者

这种情况倒没遇过,俺用STR9一直都正常

楼主最好把复位电路贴出来吧。估计是复位电路问题。

“ST的人指导我把启动代码的__main改成Main,在简单的程序里这管用,一些原来断电复位会死机的程序现在能跑了,但是现在又不行了,不管使用__main还是Main, 断电复位都是死机。”
----俺的启动代码一直都是_main,没问题啊。我的程序是200多K的,使用Keil ARM开发环境。

使用特权

评论回复
6
smartsheep|  楼主 | 2007-10-23 16:31 | 只看该作者

找到答案啦

    之前我的程序一直出现仿真器仿真时运行正常,不仿真但带电复位程序运行也正常,但是如果断电复位则程序不运行的情况。求助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没有复位到默认值?

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

21

主题

57

帖子

0

粉丝