OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 2686|回复: 6

F103 IAP APP互相跳转问题

[复制链接]

13

主题

38

帖子

0

精华

初级会员

Rank: 2

积分
156
金钱
156
注册时间
2015-1-15
在线时间
73 小时
发表于 2020-7-24 20:58:08 | 显示全部楼层 |阅读模式
50金钱
F103VE 参照例程 FLASH APP,串口互相跳转
IAP:
0x8000000  0x10000
if(IAP_JUMP_APP_Count > 30)
{
IAP_JUMP_APP_Count = 0;
iap_load_app(FLASH_APP1_ADDR);//执行FLASH APP代码
}


APP:
0x8010000 0x70000
if(APP2IAP_Flag == 1)
{
                        APP2IAP_Flag = 0;
                        __disable_irq();
                        Sys_Soft_Reset();//这句话可以
                        //iap_load_app(FLASH_IAP_ADDR);//执行FLASH IAP代码  这句不行 跳回APP的时候 写FLASH会死机
}


void Sys_Soft_Reset(void)
{         
        __set_FAULTMASK(1);

        SCB->AIRCR = 0X05FA0000|(u32)0x04;
        for(;;)
        {
                __NOP();
        }
}


#if STM32_FLASH_SIZE<256
#define STM_SECTOR_SIZE 1024 //字节
#else
#define STM_SECTOR_SIZE        2048
#endif       

u16 STMFLASH_BUF[STM_SECTOR_SIZE/2];//最多是2K字节
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*2;        //写地址偏移          
                           NumToWrite-=secremain;        //字节(16位)数递减
                        if(NumToWrite>(STM_SECTOR_SIZE/2))secremain=STM_SECTOR_SIZE/2;//下一个扇区还是写不完
                        else secremain=NumToWrite;//下一个扇区可以写完了
                }         
        };       
        FLASH_Lock();//上锁
}


出现的问题:
1.IAP不跳转到APP,APP FALSH写入正常,应答正常;
2.下面两句代码,屏蔽第一句,IAP跳转到APP,APP跳回IAP,进行APP FLASH写入异常,死机;
                        //Sys_Soft_Reset();//这句话可以
                        iap_load_app(FLASH_IAP_ADDR);//执行FLASH IAP代码  这句不行 跳回APP的时候 写FLASH会死机

3.下面两句代码,屏蔽第二句,IAP跳转到APP,APP跳回IAP,进行APP FLASH写入正常,应答正常;
                        Sys_Soft_Reset();//这句话可以
                        //iap_load_app(FLASH_IAP_ADDR);//执行FLASH IAP代码  这句不行 跳回APP的时候 写FLASH会死机

没找到原因,感觉是参数没初始化,导致写FLASH死机。

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2020-7-25 02:31:52 | 显示全部楼层
软复位永远也不可能跳转到下一句。
回复

使用道具 举报

13

主题

38

帖子

0

精华

初级会员

Rank: 2

积分
156
金钱
156
注册时间
2015-1-15
在线时间
73 小时
 楼主| 发表于 2020-7-25 11:07:50 | 显示全部楼层
正点原子 发表于 2020-7-25 02:31
软复位永远也不可能跳转到下一句。

不是,软件复位和跳转是二选一的形式,跳转回IAP,写FLASH会有问题;
软件复位相当于重新执行IAP,写FLASH没有问题。
这种情况带来的现象是:好像需要重新初始化一些东西,不然跳回IAP,写FLASH有问题,会死机。
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2020-7-26 00:33:55 | 显示全部楼层
debug 发表于 2020-7-25 11:07
不是,软件复位和跳转是二选一的形式,跳转回IAP,写FLASH会有问题;
软件复位相当于重新执行IAP,写FLA ...

从APP跳转换IAP,应该考虑的问题:APP可能开启了一些外设及中断,跳转回去IAP,并没有相应的中断服务函数,就会死机。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

13

主题

38

帖子

0

精华

初级会员

Rank: 2

积分
156
金钱
156
注册时间
2015-1-15
在线时间
73 小时
 楼主| 发表于 2020-7-27 10:22:09 | 显示全部楼层
正点原子 发表于 2020-7-26 00:33
从APP跳转换IAP,应该考虑的问题:APP可能开启了一些外设及中断,跳转回去IAP,并没有相应的中断服务函数 ...

确实,APP开了串口、定时器、CAN中断;跳回IAP之前,__disable_irq();全关了,但是在IAPmain初始化中又全开了,但是IAP也需要用到串口中断,这种一般如何处理。
回复

使用道具 举报

13

主题

38

帖子

0

精华

初级会员

Rank: 2

积分
156
金钱
156
注册时间
2015-1-15
在线时间
73 小时
 楼主| 发表于 2020-7-27 10:43:32 | 显示全部楼层
正点原子 发表于 2020-7-26 00:33
从APP跳转换IAP,应该考虑的问题:APP可能开启了一些外设及中断,跳转回去IAP,并没有相应的中断服务函数 ...

我把IAP中的__enable_irq();屏蔽,IAP中有串口的重新初始化,但是串口中断依然无法进入。
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2020-7-28 03:02:16 | 显示全部楼层
debug 发表于 2020-7-27 10:43
我把IAP中的__enable_irq();屏蔽,IAP中有串口的重新初始化,但是串口中断依然无法进入。

慢慢找问题,简化代码看看先
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-30 09:34

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表