OpenEdv-开源电子网

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

U盘 iap功能:使用U盘进行程序升级,成功正确的将BIN文件写入了指定的地址,但程序跳转后无法执行。

[复制链接]

23

主题

83

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
350
金钱
350
注册时间
2015-7-14
在线时间
76 小时
发表于 2016-6-20 17:27:14 | 显示全部楼层 |阅读模式
1金钱
U盘 iap功能:使用U盘进行程序升级,成功正确的将BIN文件写入了指定的地址,但程序跳转后无法执行。代码如下
#define  FLASH_APP_ADDR                0x08040000


    if(f_open(&file,"0:stm32.bin",FA_OPEN_ALWAYS|FA_READ) == FR_OK)
    {
                        APP_Sector = file.fsize / 512;
                        APP_Byte = file.fsize % 512;
                        for(i = 0;i < APP_Sector;i++)
                        {
                                f_read (&file,ReadAppBuffer,512,(void *)&bytesread);
                                for(j = 0;j < 256;j++)  
                                {
                                        ChangeBuffer[j] = (ReadAppBuffer[j * 2 + 1] << 8) + ReadAppBuffer[j * 2];       
                                }
                                for(k=0;k<50;k++);
                                GPIO_ToggleBits(GPIOC,GPIO_Pin_12);
                                uiFLASH_Write(FLASH_APP_ADDR + i * 512,ChangeBuffer,256);         
                        }
                        if(APP_Byte != 0)
                        {
                                f_read (&file,ReadAppBuffer,APP_Byte,(void *)&bytesread);
                                for(j = 0;j < (APP_Byte / 2);j++)  
                                {
                                        ChangeBuffer[j] = (ReadAppBuffer[j * 2 + 1] << 8) + ReadAppBuffer[j * 2];       
                                }
                                uiFLASH_Write(FLASH_APP_ADDR + i * 512,ChangeBuffer,APP_Byte / 2);
                        }
      f_close(&file);
      f_mount(NULL,"USB1",1); //f_mount(0, NULL);
    }


if (((*(__IO uint32_t*)FLASH_APP_ADDR) & 0x2FFE0000 ) == 0x20000000)
{ /* Jump to user application */
  JumpAddress = *(__IO uint32_t*) (FLASH_APP_ADDR + 4);
  Jump_To_Application = (pFunction) JumpAddress;
  /* Initialize user application's Stack Pointer */
  __set_MSP(*(__IO uint32_t*) FLASH_APP_ADDR);
  Jump_To_Application();
}

请教原子哥,可能导致问题的原因。万分感谢。

最佳答案

查看完整内容[请看2#楼]

经过研究已经成功解决问题。简单说一下重点吧。 1.U盘升级和SD卡升级的基本原理一致,即文件系统读取bin文件后直接写入对应的FLASH地址。 2.实际写入FLASH的数据格式为32位的2进制数,并不是历程中16位。即 ChangeBuffer[j] = (ReadAppBuffer[j * 2 + 1]
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

23

主题

83

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
350
金钱
350
注册时间
2015-7-14
在线时间
76 小时
 楼主| 发表于 2016-6-20 17:27:15 | 显示全部楼层
经过研究已经成功解决问题。简单说一下重点吧。
1.U盘升级和SD卡升级的基本原理一致,即文件系统读取bin文件后直接写入对应的FLASH地址。

2.实际写入FLASH的数据格式为32位的2进制数,并不是历程中16位。即  ChangeBuffer[j] = (ReadAppBuffer[j * 2 + 1] << 8) + ReadAppBuffer[j * 2];        
                                                                                                     改为  ChangeBuffer[j] = (ReadAppBuffer[j * 4 + 3] << 24) | (ReadAppBuffer[j * 4 + 2] << 16) | (ReadAppBuffer[j * 4 + 1] << 8) | ReadAppBuffer[j * 4];
注:使用芯片为 f205
回复

使用道具 举报

23

主题

83

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
350
金钱
350
注册时间
2015-7-14
在线时间
76 小时
 楼主| 发表于 2016-6-21 14:53:08 | 显示全部楼层
3.之前程序无法正常跳转的原因就是初始地址写入的值为0000 2000、0000 0x00,而实际上的值应该为 2000 0x00.所以该判读if (((*(__IO uint32_t*)FLASH_APP_ADDR) & 0x2FFE0000 ) == 0x20000000)无法通过.
4.bin文件必须使用keil生成的,方法见原子哥的教程。其他地方下载的转换器生成的bin文件内容32无法识别。
回复

使用道具 举报

6

主题

25

帖子

0

精华

初级会员

Rank: 2

积分
95
金钱
95
注册时间
2013-1-15
在线时间
7 小时
发表于 2016-7-6 11:10:26 | 显示全部楼层
Azer 发表于 2016-6-21 14:53
3.之前程序无法正常跳转的原因就是初始地址写入的值为0000 2000、0000 0x00,而实际上的值应该为 2000 0x00 ...

我也碰到了BIN文件下载到Flash,但是跳转不成功的问题。但是我用SD卡升级可以,能不能和你交流下?楼主!
回复

使用道具 举报

6

主题

114

帖子

0

精华

初级会员

Rank: 2

积分
180
金钱
180
注册时间
2011-2-28
在线时间
8 小时
发表于 2016-8-18 17:42:56 | 显示全部楼层
我也试试。
回复

使用道具 举报

yanwq2000 该用户已被删除
发表于 2017-3-22 23:14:45 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

12

主题

241

帖子

0

精华

高级会员

Rank: 4

积分
806
金钱
806
注册时间
2017-8-17
在线时间
159 小时
发表于 2017-9-18 09:02:17 | 显示全部楼层
mark  
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-7-19 01:22

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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