f4的iap程序读出bin的数组为什么是低位在前高位在后,不应该是高位在前么??

2019-07-20 08:43发布

#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "stmflash.h"
#include "iap.h"
//////////////////////////////////////////////////////////////////////////////////         
//本程序只供学习使用,未经作者许可,不得用于其它任何用途
//ALIENTEK STM32F407开发板
//IAP 代码          
//正点原子@ALIENTEK
//技术论坛:www.openedv.com
//创建日期:2014/7/21
//版本:V1.0
//版权所有,盗版必究。
//Copyright(C) 广州市星翼电子科技有限公司 2014-2024
//All rights reserved                                                                          
//////////////////////////////////////////////////////////////////////////////////

iapfun jump2app;
u32 iapbuf[512];         //2K字节缓存  
//appxaddr:应用程序的起始地址
//appbuf:应用程序CODE.
//appsize:应用程序大小(字节).
void iap_write_appbin(u32 appxaddr,u8 *appbuf,u32 appsize)
{
        u32 t;
        u16 i=0;
        u32 temp;
        u32 fwaddr=appxaddr;//当前写入的地址
        u8 *dfu=appbuf;
        for(t=0;t<appsize;t+=4)
        {                                                  
                temp=(u32)dfu[3]<<24;   
                temp|=(u32)dfu[2]<<16;   
                temp|=(u32)dfu[1]<<8;
                temp|=(u32)dfu[0];          
                /*不应该是高位在前么???
                temp=(u32)dfu[0]<<24;   
                temp|=(u32)dfu[1]<<16;   
                temp|=(u32)dfu[2]<<8;
                temp|=(u32)dfu[3];          
                  */


                dfu+=4;//偏移4个字节
                iapbuf[i++]=temp;            
                if(i==512)
                {
                        i=0;
                        STMFLASH_Write(fwaddr,iapbuf,512);
                        fwaddr+=2048;//偏移2048  512*4=2048
                }
        }
        if(i)STMFLASH_Write(fwaddr,iapbuf,i);//将最后的一些内容字节写进去.  
}

//跳转到应用程序段
//appxaddr:用户代码起始地址.
void iap_load_app(u32 appxaddr)
{
        if(((*(vu32*)appxaddr)&0x2FFE0000)==0x20000000)        //检查栈顶地址是否合法.
        {
                jump2app=(iapfun)*(vu32*)(appxaddr+4);                //用户代码区第二个字为程序开始地址(复位地址)               
                MSR_MSP(*(vu32*)appxaddr);                                        //初始化APP堆栈指针(用户代码区的第一个字用于存放栈顶地址)
                jump2app();                                                                        //跳转到APP.
        }
}                 








友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
2条回答
szczyb1314
1楼-- · 2019-07-20 13:28
本帖最后由 szczyb1314 于 2018-4-12 14:35 编辑

32单片机是小端模式的,跟这个有关系,小端模式:低位字节存在低地址上,高位字节存在高地址上
举个例子:上位机串口发送 00 01 02 03 04 05 06 07。。。。
               单片机接收到   00 01 02 03 04 05 06 07。。。。
               经过变化         03 02 01 00 07 06 05 04。。。。
               FLASH写入      00 01 02 03 04 05 06 07。。。。
最终写入FLASH的数据跟上位机发送下来的是一致的。不一致更新的APP就无法正常运行了。
Loyslf_璞野
2楼-- · 2019-07-20 16:10

一周热门 更多>