打印
[STM32F1]

stm32 IAP升级时Jump_to_App是进入HardFault_Handler

[复制链接]
10074|17
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
liudingming|  楼主 | 2014-5-27 09:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
CPU:STM32F107

我在做IAP升级时,读取U盘中的.bin文件,然后写入flash,但是在跳转时总是进入HardFault_Handler死循环里面,不知道为什么,求高手支招啊!
   我把应用程序APP用Jlink烧入芯片,然后再用我的boot跳转,可以跳转过去。
沙发
icecut| | 2014-5-27 09:44 | 只看该作者
你升级完触发一次复位就可以正常启动了..是不是?
没做过类似操作.考虑一些升级时的特殊配置,是不是需要恢复

使用特权

评论回复
板凳
helongdm| | 2014-5-27 09:51 | 只看该作者
本帖最后由 helongdm 于 2014-5-27 09:54 编辑

用你的boot烧写完后  读出来   对比一下文件
另外,要保证你的烧写的是bin文件,编译时编译器rom起始地址,跳转地址是存放代码的地址+4

使用特权

评论回复
地板
liudingming|  楼主 | 2014-5-27 10:01 | 只看该作者
helongdm 发表于 2014-5-27 09:51
用你的boot烧写完后  读出来   对比一下文件
另外,要保证你的烧写的是bin文件,编译时编译器rom起始地址, ...

helongdm  你好,谢谢你的回复!
  我烧进去的是bin文件,这个没错!但是烧进flash里面有没有出错就没有验证?
  我的那些跳转地址都改好了,APP是0x08010000开始,boot跳转时是0x08010000+4.我把我的APP用Jlink烧进板子之后,再用我的boot跳转成功。但是一旦让boot实现读取U盘,写flash之后,再跳就进HardFalt_Handler里面了。

追问:怎么将flash中的文件读出来对比!有没有读flash的接口函数

使用特权

评论回复
5
MOn51| | 2014-5-27 10:21 | 只看该作者
主要是U盘中断引起的。必须重启,不启动U盘的中断,或者关闭原来的中断。

使用特权

评论回复
6
liudingming|  楼主 | 2014-5-27 10:29 | 只看该作者
MOn51 发表于 2014-5-27 10:21
主要是U盘中断引起的。必须重启,不启动U盘的中断,或者关闭原来的中断。 ...

MOn51,你是说等写falsh完成之后,关闭所有中断是吗?

使用特权

评论回复
7
amwrdfe| | 2014-5-27 10:37 | 只看该作者
跳转app要注意三个设置
1:pc指针,
2:堆栈指针,
3:中断向量表,

使用特权

评论回复
8
liudingming|  楼主 | 2014-5-27 10:57 | 只看该作者
amwrdfe 发表于 2014-5-27 10:37
跳转app要注意三个设置
1:pc指针,
2:堆栈指针,

第2条堆栈指针是指什么?其他两条我都注意,保证没错

使用特权

评论回复
9
amwrdfe| | 2014-5-29 19:22 | 只看该作者
sp啊。

使用特权

评论回复
10
liudingming|  楼主 | 2014-5-29 19:40 | 只看该作者
终于解决了,从flash把写进去的数据读出来一对比,原来是flash没有写成功!感谢各位坛友的支持

使用特权

评论回复
11
zheao888| | 2014-10-28 08:25 | 只看该作者
楼主,能把你的stm的iap读u盘升级的boot程序发给我借鉴下吗?我也在做这个,遇到不能从boot程序跳到app程序,像你一样进入硬件死循环了。拜托了!!!

使用特权

评论回复
12
zhao305149619| | 2014-10-29 13:11 | 只看该作者
liudingming 发表于 2014-5-29 19:40
终于解决了,从flash把写进去的数据读出来一对比,原来是flash没有写成功!感谢各位坛友的支持 ...

你好,请问你是怎么解决的啊,能帮忙解答吗,我也是想你当初一样的着急,希望多多帮助

使用特权

评论回复
13
zhao305149619| | 2014-10-29 13:11 | 只看该作者
zheao888 发表于 2014-10-28 08:25
楼主,能把你的stm的iap读u盘升级的boot程序发给我借鉴下吗?我也在做这个,遇到不能从boot程序跳到app程序 ...

你好,你的解决了没有,我的也是程序停止了

使用特权

评论回复
14
zheao888| | 2014-10-30 08:54 | 只看该作者
zhao305149619 发表于 2014-10-29 13:11
你好,你的解决了没有,我的也是程序停止了

解决不了

使用特权

评论回复
15
crazysnowboy| | 2015-3-11 00:34 | 只看该作者
如果是基于原子的代码:有这么一个问题:
void STMFLASH_Write(u32 WriteAddr,u16 *pBuffer,u16 NumToWrite)       
{
        u32 secpos;           //扇区地址
        u16 secoff;           //扇区内偏移地址(16位字计算)
        u16 secremain; //扇区内剩余地址(16位字计算)          
        u16 i;   
        u32 offaddr;   //去掉0X08000000后的地址
        if(WriteAddr<STM32_FLASH_BASE||(WriteAddr>=(STM32_FLASH_BASE+1024*STM32_FLASH_SIZE)))return;//非法地址
        FLASH_Unlock();                                                //解锁
        offaddr=WriteAddr-STM32_FLASH_BASE;                //实际偏移地址.
        secpos=offaddr/STM_SECTOR_SIZE;                        //扇区地址  0~127 for STM32F103RBT6
        secoff=(offaddr%STM_SECTOR_SIZE)/2;                //在扇区内的偏移(2个字节为基本单位.)
        secremain=STM_SECTOR_SIZE/2-secoff;                //扇区剩余空间大小   
        if(NumToWrite<=secremain)secremain=NumToWrite;//不大于该扇区范围
        while(1)
        {       
                STMFLASH_Read(secpos*STM_SECTOR_SIZE+STM32_FLASH_BASE,STMFLASH_BUF,STM_SECTOR_SIZE/2);//读出整个扇区的内容
                for(i=0;i<secremain;i++)//校验数据
                {
                        if(STMFLASH_BUF[secoff+i]!=0XFFFF)break;//需要擦除            
                }
                if(i<secremain)//需要擦除
                {
                        FLASH_ErasePage(secpos*STM_SECTOR_SIZE+STM32_FLASH_BASE);//擦除这个扇区
                        for(i=0;i<secremain;i++)//复制
                        {
                                STMFLASH_BUF[i+secoff]=pBuffer[i];          
                        }
                        STMFLASH_Write_NoCheck(secpos*STM_SECTOR_SIZE+STM32_FLASH_BASE,STMFLASH_BUF,STM_SECTOR_SIZE/2);//写入整个扇区  
                }else STMFLASH_Write_NoCheck(WriteAddr,pBuffer,secremain);//写已经擦除了的,直接写入扇区剩余区间.                                   
                if(NumToWrite==secremain)break;//写入结束了
                else//写入未结束
                {
                        secpos++;                                //扇区地址增1
                        secoff=0;                                //偏移位置为0          
                           pBuffer+=secremain;          //指针偏移
                        WriteAddr+=secremain;        //写地址偏移          
                           NumToWrite-=secremain;        //字节(16位)数递减
                        if(NumToWrite>(STM_SECTOR_SIZE/2))secremain=STM_SECTOR_SIZE/2;//下一个扇区还是写不完
                        else secremain=NumToWrite;//下一个扇区可以写完了
                }         
        };       
        FLASH_Lock();//上锁
}
错误在于:        WriteAddr+=secremain;        //写地址偏移          
改为:WriteAddr+=secremain*2;即可
我的问题就是flash写入错误,发现竟然是这里错了,改正就好了!

使用特权

评论回复
16
firstzys| | 2015-7-15 09:06 | 只看该作者
我的问题跟你一模一样,但是我写入flash是没有问题的啊。。。也跳转进hardfault。。。什么原因呢

使用特权

评论回复
17
pkcfl| | 2016-1-15 09:49 | 只看该作者
本帖最后由 pkcfl 于 2016-1-15 09:52 编辑

我刚刚遇到同样的问题,现在找了我的原因(自然就找到了解决办法)。我的问题是:用Jlink烧写APP到0x08004000,然后用自己的Bootloader可以跳转并正常执行,后来我模拟在Bootloader里开辟一块空间存储APP,用FlashAPI烧写进去却不能跳转APP,出现Hardfault!用文本比较工具比较Jlink烧写进去的文件和自己FlashAPI烧写进去再读回的文件,竟然是一样的,烧写进去的APP没有错,那就奇怪了。而且APP还分情况,小的APP,比如我试验了一个55k的HEX,没有问题,但300k的HEX,就出现上述情况。看了本帖之后获得启发,楼主烧写的地址是0x08010000,而我的是0x08004000。那么我的Bootloader程序在开辟一块存储空间后存储大的APP时,Bootloader本身的bin为80k,远远超出了0x08004000这块给Bootloader的16k空间,问题就出现这里,也就是说,Bootloader在用FlashAPI烧写APP时把自己的尾巴冲掉了!解决办法自然是给Bootloader留出更多空间,我改为0x08020000,问题解决了!

使用特权

评论回复
18
liulx1206| | 2016-6-22 16:00 | 只看该作者
连续写flash进入hardfault的问题(比如第二个或某个word写入时进入hardfault),也可以尝试下降低系统时钟频率后验证是否正常。

使用特权

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

本版积分规则

14

主题

41

帖子

0

粉丝