OpenEdv-开源电子网

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

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

[复制链接]

11

主题

42

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
214
金钱
214
注册时间
2016-7-19
在线时间
43 小时
发表于 2018-3-5 15:00:06 | 显示全部楼层 |阅读模式
#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.
        }
}                 








微信图片_20180305145602.png
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

33

主题

1628

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
6679
金钱
6679
注册时间
2015-8-25
在线时间
1036 小时
发表于 2018-4-12 14:30:56 | 显示全部楼层

32单片机是小端模式

本帖最后由 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就无法正常运行了。
回复 支持 1 反对 0

使用道具 举报

11

主题

42

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
214
金钱
214
注册时间
2016-7-19
在线时间
43 小时
 楼主| 发表于 2018-3-5 15:00:39 | 显示全部楼层
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-9 03:51

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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