搜索
bottom↓
回复: 95

求助:stm32 用内部flash虚拟u盘进行IAP

  [复制链接]

出0入0汤圆

发表于 2014-8-21 21:15:00 | 显示全部楼层 |阅读模式
求助:stm32 用内部flash虚拟u盘进行IAP

现在我虚拟出来了(stm32f103c8t6) iap程序8k 虚拟出来是52k,格式化后32k(1024字节)

放点小文档txt往里面写点东西.重新读取出来后提示文件损坏,但是放上些较大的文件又没事(右下图为U盘TXT地址)




接着就往u盘里放bin文件…可是死都不能转跳…

App程序地址设置成0x08008000
U盘开始地址0x08003000,3000-8000为电脑格式化化后的fat表..详细信息可以看看附件pdf

我用winhex查看u盘 发现bin文件不是从”u盘地址—5000(对应实际地址0x-8008000)”开始,而是5800(0x8008800)于是我尝试转跳地址设置成0x08008800,可是iap程序进入hault了


iap_load_app(0x08008000);        无法转跳,直接进入IAP
iap_load_app(0x08008800); 死机



我直接将app程序强制写进0x08008000,iap转跳成功(IAP设置转跳地址为08008000)..

求助..为啥直接放bin不能转跳.bin不是直接可以读取的文件?我找到bin真地址转跳不就行了?

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

阿莫论坛20周年了!感谢大家的支持与爱护!!

月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!

出0入0汤圆

 楼主| 发表于 2014-8-22 18:19:39 | 显示全部楼层
顶上去~
现在更新
文件读取没事了...但是当程序运行到
Jump_To_Application();
时会进入HardFault

出0入0汤圆

发表于 2014-8-22 19:14:52 | 显示全部楼层
编译bin的时候地址配置可好了么?格式化后用winhex手动改启动扇区可以将可用空间扩大到(总空间-1.5k)。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

 楼主| 发表于 2014-8-22 19:48:52 来自手机 | 显示全部楼层
eleqian 发表于 2014-8-22 19:14
编译bin的时候地址配置可好了么?格式化后用winhex手动改启动扇区可以将可用空间扩大到(总空间-1.5k)。
...

app编写时已经设置好开始地址
现在bin放进u盘时 地址位于u盘5800.我认为是flash的0x08008800 可是转跳就硬件中断了

出0入0汤圆

发表于 2014-8-22 20:14:37 | 显示全部楼层
FlandreUNX 发表于 2014-8-22 19:48
app编写时已经设置好开始地址
现在bin放进u盘时 地址位于u盘5800.我认为是flash的0x08008800 可是转跳就 ...

是设置开始地址在0x08008800?bin编译时配置的地址必须和实际放的地址一致。

出0入0汤圆

 楼主| 发表于 2014-8-22 20:35:53 来自手机 | 显示全部楼层
eleqian 发表于 2014-8-22 20:14
是设置开始地址在0x08008800?bin编译时配置的地址必须和实际放的地址一致。 ...

u盘开始地址是08003000  模拟成功后.连bin放进u盘就是8008800(用winhex查看u盘就是0x00005800开始看到bin). app设置这是8008800 转跳就死机了

出0入0汤圆

发表于 2014-8-22 20:47:51 来自手机 | 显示全部楼层
LPC1768有这样的虚拟U盘IAP程序,你可以参考。注:最近也想做LZ这样的程序。

出0入0汤圆

发表于 2014-8-22 22:12:29 | 显示全部楼层
支持楼主 这个东西 在lpc上试过 挺方便的。

出0入0汤圆

发表于 2014-8-22 22:15:19 | 显示全部楼层
我在想可否,用软件虚拟分区表,上层下来的数据直接往固定地址写入。

出0入0汤圆

 楼主| 发表于 2014-8-22 22:25:05 | 显示全部楼层
richards 发表于 2014-8-22 22:15
我在想可否,用软件虚拟分区表,上层下来的数据直接往固定地址写入。

分区表是上位机格式化时写进去的.自己下位机也可以写分区表..目前无论啥文件,除了System Volume Information这个文件夹和文件(0x0005000以前),其余都是从u盘地址0x005800开始写入..
按照我设置的U盘空间开端是STM32内部FLASH的0x08003000,加上U盘地址0x005800就是0x08008800...

出0入0汤圆

 楼主| 发表于 2014-8-22 22:25:30 | 显示全部楼层
htjgdw 发表于 2014-8-22 20:47
LPC1768有这样的虚拟U盘IAP程序,你可以参考。注:最近也想做LZ这样的程序。

一起研究..话说有没有地址给我看看LPC的

出0入0汤圆

 楼主| 发表于 2014-8-22 22:30:22 | 显示全部楼层
如图这个正确将BIN复制进U盘里面的情况 U盘地址是5800->0x08008800(0x08003000+0x00005800) 可是转跳地址设置成这个就无法转跳 会在Jump_To_Application(); 这一行程序执行时进入HardFault

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

 楼主| 发表于 2014-8-22 22:48:10 | 显示全部楼层
本帖最后由 FlandreUNX 于 2014-8-22 23:27 编辑

最新情况
1.将BIN复制到U盘.APP地址设置为0X08008800 IAP转跳设置为0X08008800,当运行到Jump_To_Application();时.用JLINK查看到改函数指向一个0x08000269
2.直接将BIN覆盖到FLASH的0x08008800地址后,.APP地址设置为0X08008800 IAP转跳设置为0X08008800当运行到Jump_To_Application();时.用JLINK查看到改函数指向一个0x08008A85
第2点 IAP能转跳APP能运行.,
第1点卡在HardFault
.

证明BIN文件没错 并且栈顶是识别到的if(((*(__IO uint32_t *) ApplicationAddress) & 0x2FFE0000) == 0x20000000)这句话是通过的 直接进入下一个转跳指令

发现BIN栈顶没错,但是貌似中断向量表的(BIN开头第5节到第8节)是指向错误的(0x080000269)


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

 楼主| 发表于 2014-8-23 00:01:10 | 显示全部楼层
本帖最后由 FlandreUNX 于 2014-8-23 00:07 编辑

结束此帖子
自己解决了问题..
发现问题
1.MDK 编译BIN时路径打错.编译了未设置成转跳的APP 导致 中断向量表PC无法指向进图hault
2.模拟u盘程序的USB库过老 不兼容3.6的标准库 更新到4.0的USB库后根据官方例程修改实现.另外官方例程中usb_desc.c+desc.h要用自己的desc.c替换.不然下载后USB无法枚举 并且会将SWD卡死.只能ISP下载
3.转跳到APP前务必将总中断关闭.不然很容易进入HAULT
我上传一下我的IAP分享经验.看到很少人讨论.很心酸

IAP使用方法
本人是F103C8T6
判断按钮是否按下(上拉输入),按下则初始化USB
然后格式化U盘
将随意的修改好地址的APP编译成BIN放进U盘 接着重启
然后就完成了升级

希望以后能有更多人跟帖.讨论更多好玩而且安全的IAP



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2014-8-23 10:29:21 | 显示全部楼层
FlandreUNX 发表于 2014-8-22 22:25
分区表是上位机格式化时写进去的.自己下位机也可以写分区表..目前无论啥文件,除了System Volume Informat ...

你好 , “文件(0x0005000以前) ” 这是指什么,另外看了你的代码恍然大悟,分区表不需要我自己产生。我的想法是将分区表放入ram 这样避免空间的浪费,而且重新枚举成功,由于分区表已经刷新了,固件是无法直接读出的。

出0入0汤圆

 楼主| 发表于 2014-8-23 15:17:44 | 显示全部楼层
richards 发表于 2014-8-23 10:29
你好 , “文件(0x0005000以前) ” 这是指什么,另外看了你的代码恍然大悟,分区表不需要我自己产生。我 ...

对.分区表只能针对一个设备.如果你想从USB->RAM->FLASH的话可以试一下将RAM虚拟成U盘,判断BIN传输是否完成.然后再copy到FLASH里面.只需要改mal.c里面的接口代码

出0入0汤圆

 楼主| 发表于 2014-8-23 15:23:10 | 显示全部楼层
richards 发表于 2014-8-23 10:29
你好 , “文件(0x0005000以前) ” 这是指什么,另外看了你的代码恍然大悟,分区表不需要我自己产生。我 ...

你好 , “文件(0x0005000以前) ” 这是指什么
flash将物理地址0x08003000以后的空间划分到U盘.所以0x08003000就是U盘的首地址.在PC看来就是0x00000000.而FLASH写入只能是先一页的擦除.所以当格式化完成时.0x08003000(0x00000000)到一段地址是为FAT分区表.大概是到0x08008000(0x00005000)
按照道理当复制一个文件进入U盘时就应该从0x08008000开始(0x00005000).但是实际看啦并不是.而是从0x08008800开始(0x00005800)
这就解析了为什么当我转跳地址填0x08008000时 过不了第一条栈顶判断

出0入0汤圆

发表于 2014-8-23 17:25:38 | 显示全部楼层
楼主,支持,能共享原理图吗? 谢谢,我最近也在使用这款芯片,不过只是刚刚入门而已,谢谢,

出0入0汤圆

 楼主| 发表于 2014-8-23 20:22:01 | 显示全部楼层
craigtao 发表于 2014-8-23 17:25
楼主,支持,能共享原理图吗? 谢谢,我最近也在使用这款芯片,不过只是刚刚入门而已,谢谢, ...

没啥原理图..就是标准的STM32接USB 然后自己加个按钮..网上抓一大把

出0入0汤圆

发表于 2014-8-23 21:17:55 | 显示全部楼层
FlandreUNX 发表于 2014-8-23 15:23
你好 , “文件(0x0005000以前) ” 这是指什么
flash将物理地址0x08003000以后的空间划分到U盘.所以0x080 ...

明白了 多谢楼主解析。

出10入0汤圆

发表于 2014-8-24 00:10:14 来自手机 | 显示全部楼层
这几天刚想这么做!要顶v,mark!!

出0入0汤圆

发表于 2014-8-24 21:10:55 | 显示全部楼层
好东西,收藏

出0入0汤圆

发表于 2014-8-25 08:26:59 | 显示全部楼层
FlandreUNX 发表于 2014-8-23 20:22
没啥原理图..就是标准的STM32接USB 然后自己加个按钮..网上抓一大把

哦,,好的,谢谢啊,

出0入0汤圆

发表于 2014-8-25 09:55:53 | 显示全部楼层
顶楼主,该给个酷的

出0入0汤圆

发表于 2014-8-25 10:28:13 | 显示全部楼层
这个必须是个精华帖

出0入0汤圆

发表于 2014-8-25 11:41:05 | 显示全部楼层
LZ好人,这个必须是个精华帖!!
有IAR的吗?

出0入0汤圆

 楼主| 发表于 2014-8-25 23:01:33 | 显示全部楼层
hellolinux 发表于 2014-8-25 11:41
LZ好人,这个必须是个精华帖!!
有IAR的吗?

MDK5.x版的
源代码直接招搬进去就是了.声明一下是用F10X_MD版 是B版的EVAL

出0入0汤圆

发表于 2014-8-26 15:10:18 | 显示全部楼层
FlandreUNX 发表于 2014-8-25 23:01
MDK5.x版的
源代码直接招搬进去就是了.声明一下是用F10X_MD版 是B版的EVAL

LZ 我现在用的是STM32F103VBT6  128K的应该怎么改啊?
试了一下
mass_mal.c 文件中
#define FLASH_SIZE                        0xD000改为0x18000

进入IAP,格式化后可以认出76K的空间

APP程序如下
#include "stm32f10x.h"
void delayms(u16 tim)
{
        u16 i;
        while(tim--)
        {
                i = 1000;
                while(i--);
        }

}
int main(void)
{
        GPIO_InitTypeDef GPIO_InitStructure;
               
        NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x8000);
               
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE , ENABLE);       
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;   
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
        GPIO_Init(GPIOE, &GPIO_InitStructure);
       
       
        while(1)
        {
                GPIO_ResetBits(GPIOE, GPIO_Pin_6);
                delayms(500);
                GPIO_SetBits(GPIOE, GPIO_Pin_6);       
                delayms(500);
        }
}

编译设置和PDF文档中的一致IROM1 为 0x8008000。生成的bin文件放到U盘重启,不执行啊??

出0入0汤圆

 楼主| 发表于 2014-8-26 20:15:08 来自手机 | 显示全部楼层
请看我上面的全部过程 在u盘中bin并不是在8000这个位置

出0入0汤圆

 楼主| 发表于 2014-8-26 20:16:14 来自手机 | 显示全部楼层
hellolinux 发表于 2014-8-26 15:10
LZ 我现在用的是STM32F103VBT6  128K的应该怎么改啊?
试了一下
mass_mal.c 文件中

bin并不是在8000位置中 请看我全我帖子 用winhex查看实际地址

出0入0汤圆

发表于 2014-8-29 12:11:10 | 显示全部楼层
FlandreUNX 发表于 2014-8-23 15:23
你好 , “文件(0x0005000以前) ” 这是指什么
flash将物理地址0x08003000以后的空间划分到U盘.所以0x080 ...

不知道为什么当复制一个文件进入U盘时就应该从0x08008000开始(0x00005000).而是从0x08008800开始(0x00005800)?

出0入0汤圆

 楼主| 发表于 2014-8-30 10:02:47 | 显示全部楼层
wuguoyan 发表于 2014-8-29 12:11
不知道为什么当复制一个文件进入U盘时就应该从0x08008000开始(0x00005000).而是从0x08008800开始(0x00005 ...

自己将BIN复制进去U盘后 用WINHEX查看U盘二进制分部就知道了

出0入0汤圆

发表于 2014-9-1 10:39:09 | 显示全部楼层
楼主。还有一个问题想请教下你,你在楼主位说道 “现在我虚拟出来了(stm32f103c8t6) iap程序8k ”
这个8K大小是哪里定义的?如果IAP程序超过8K会怎么样。
我看你的关于keil里面的option如下:

这个size是为什么是64k啊?莫非就是C8的大小。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

 楼主| 发表于 2014-9-1 12:49:52 来自手机 | 显示全部楼层
wuguoyan 发表于 2014-9-1 10:39
楼主。还有一个问题想请教下你,你在楼主位说道 “现在我虚拟出来了(stm32f103c8t6) iap程序8k ”
这个8K大 ...

iap编译出来接近8k 所以我定义了iap空间为08008000+8k 打后的空间就是u盘空间
c8 rom容量的确是64k

出0入0汤圆

发表于 2014-9-5 14:01:04 | 显示全部楼层
FlandreUNX 发表于 2014-8-23 00:01
结束此帖子
自己解决了问题..
发现问题

我用你的代码试了一下,我的芯片是STM32F103VCT6,出现一个问题,显示的U盘无法格式化。在电脑上打不开U盘。知道是怎么回事不?

出0入17汤圆

发表于 2014-9-5 17:12:05 | 显示全部楼层
顶。好东西,以后这种方式会流行。

出0入0汤圆

发表于 2014-9-6 20:22:04 | 显示全部楼层
楼主你虚拟出来的U盘是电脑做的文件系统,不通用,只是凑巧文件刚好在那一片连续,文件大点说不定就废了,要想办法自己做MBR和fat表,找了很多资料都没找到对这些信息详细讲解的,努力中。。。。。。。。。。。。。。。。。。。

出0入0汤圆

发表于 2014-10-14 23:44:31 | 显示全部楼层
楼主,想请教一下,是不是您这样就不用单独写驱动程序了?

出0入0汤圆

发表于 2014-10-15 00:59:25 | 显示全部楼层
U盘 IAP,MARK

出0入0汤圆

发表于 2014-10-15 01:09:07 来自手机 | 显示全部楼层
谢谢分享,收藏学习

出0入0汤圆

发表于 2014-10-15 11:19:05 | 显示全部楼层
之前用楼主的代码,存在u盘不能格式化的问题,经过一番努力,改写了mass_mal.c文件。现在u盘正常了,代码分享如下:
/******************** (C) COPYRIGHT 2008 STMicroelectronics ********************
* File Name          : mass_mal.c
* Author             : MCD Application Team
* Version            : V2.2.0
* Date               : 06/13/2008
* Description        : Medium Access Layer interface
********************************************************************************
* THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
* WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE TIME.
* AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY DIRECT,
* INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING FROM THE
* CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE CODING
* INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
*******************************************************************************/

/* Includes ------------------------------------------------------------------*/


#include "mass_mal.h"
#include "disk_image.h"
#include "stdio.h"

/* Private typedef -----------------------------------------------------------*/
/* Private define ------------------------------------------------------------*/

        #define FLASH_START_ADDR        0x08020000        // Flash start address
        #define FLASH_SIZE                        0x40000
        #define FLASH_PAGE_SIZE                0x800                // 2K per page
        #define FLASH_WAIT_TIMEOUT        100000

/* Private macro -------------------------------------------------------------*/
/* Private variables ---------------------------------------------------------*/
u32 Mass_Memory_Size[2];
u32 Mass_Block_Size[2];
u32 Mass_Block_Count[2];

/*******************************************************************************
* Function Name  : MAL_Init
* Description    : Initializes the Media on the STM32
* Input          : None
* Output         : None
* Return         : None
*******************************************************************************/
uint16_t MAL_Init(uint8_t lun)
{
        u16 status = MAL_OK;  
        switch (lun)  
        {   
                case 0:                 
                        FLASH_Unlock(); break;   
                default:            
                        return MAL_FAIL;  
        }  
        return status;
}
/*******************************************************************************
* Function Name  : MAL_Write
* Description    : Write sectors
* Input          : None
* Output         : None
* Return         : None
*******************************************************************************/
uint16_t MAL_Write(uint8_t lun, uint32_t Memory_Offset, uint32_t *Writebuff, uint16_t Transfer_Length)
{
        uint16_t i,lenBackup=0;
        static uint32_t Readbuff[FLASH_PAGE_SIZE>>2];//一个uint32_t占4个字节;数组比较大,用static修饰放在静态区避免堆栈溢出
        uint32_t PageAddr,StartWriteOffset,EndWriteOffset;//页起始地址,页内需要修改的起始偏移数,页内需要修改的结束偏移数
       
        StartWriteOffset=(FLASH_START_ADDR + Memory_Offset)%FLASH_PAGE_SIZE;
        EndWriteOffset=FLASH_PAGE_SIZE;
        PageAddr=FLASH_START_ADDR + Memory_Offset-StartWriteOffset;
        if((lun!=0) && (lun!=1)) return MAL_FAIL;

        while(PageAddr < FLASH_START_ADDR + Memory_Offset + Transfer_Length)
        {               
                //printf("\r\n PageAddr:0x%08x PageAddr - FLASH_START_ADDR:0x%04x",PageAddr,PageAddr - FLASH_START_ADDR);
          MAL_Read(0,PageAddr - FLASH_START_ADDR,Readbuff,FLASH_PAGE_SIZE);//读一页
//                 for(i=0; i < (FLASH_PAGE_SIZE>>2); i++)   //显示修改前的数据
//                         printf("\r\n <-:0x%04x   data:0x%08x",i<<2,Readbuff[i]);
               
                if(PageAddr + FLASH_PAGE_SIZE > FLASH_START_ADDR+Memory_Offset+Transfer_Length)        //计算是否最后一页
                        EndWriteOffset=(FLASH_START_ADDR + Memory_Offset + Transfer_Length)%FLASH_PAGE_SIZE;
                       
                //printf("\r\nStartWriteOffset:0x%x EndWriteOffset:0x%x",StartWriteOffset,EndWriteOffset);
                for(i=StartWriteOffset; i<EndWriteOffset; i+=4 )//修改需要修改的数据
                        Readbuff[i>>2]=Writebuff[lenBackup++];
//                 for(i=0; i < (FLASH_PAGE_SIZE>>2); i++)   //显示修改后的数据
//                         printf("\r\n ->:0x%04x   data:0x%08x",i<<2,Readbuff[i]);
               
                FLASH_ErasePage(PageAddr); //擦除
       
                for(i=0; i<(FLASH_PAGE_SIZE>>2); i++)//写一页
                {
                        if( FLASH_WaitForLastOperation(FLASH_WAIT_TIMEOUT) != FLASH_TIMEOUT )
                        {
                                FLASH_ClearFlag(FLASH_FLAG_EOP|FLASH_FLAG_PGERR|FLASH_FLAG_WRPRTERR);
                        }
                        if(Readbuff[i]!=0xffffffff)//0xffffffff说明原来就没有数据;这可以减少写flash的次数;
                        {
                                //printf("\r\n i:%04x wAddr:0x%08x  wdata:0x%08x",i,PageAddr+(i<<2),Readbuff[i]);
                                FLASH_ProgramWord(PageAddr+(i<<2), Readbuff[i]);
                        }
                }
               
//                 MAL_Read(0,PageAddr - FLASH_START_ADDR,Readbuff,FLASH_PAGE_SIZE);//读一页
//                 for(i = 0; i <FLASH_PAGE_SIZE; i+=4)//读显示
//                         printf("\r\n bias:0x%04x   data:0x%08x",i,Readbuff[i>>2]);
               
                PageAddr=PageAddr+FLASH_PAGE_SIZE;
                StartWriteOffset=0;
        }
  return MAL_OK;
}

/*******************************************************************************
* Function Name  : MAL_Read
* Description    : Read sectors
* Input          : None
* Output         : None
* Return         : Buffer pointer
*******************************************************************************/
uint16_t MAL_Read(uint8_t lun, uint32_t Memory_Offset, uint32_t *Readbuff, uint16_t Transfer_Length)
{
  uint16_t i;
  switch (lun)
  {
    case 0:
            for( i=0; i < Transfer_Length; i+=4 )
          {
                        //printf("\r\nReadAddr:0x%08x  ",FLASH_START_ADDR + Memory_Offset+i);
         Readbuff[i>>2] = ((vu32*)(FLASH_START_ADDR + Memory_Offset))[i>>2];
                //        printf("data:0x%08x  ",Readbuff[i>>2]);
          }
      break;
    case 1:
      break;
    default:
      return MAL_FAIL;
  }
  return MAL_OK;
}

/*******************************************************************************
* Function Name  : MAL_GetStatus
* Description    : Get status
* Input          : None
* Output         : None
* Return         : None
*******************************************************************************/
uint16_t MAL_GetStatus (uint8_t lun)
{
  if (lun == 0)
  {                 
      Mass_Block_Count[0] = FLASH_SIZE/FLASH_PAGE_SIZE;
      Mass_Block_Size[0] =  FLASH_PAGE_SIZE;
      Mass_Memory_Size[0] = FLASH_SIZE;
      return MAL_OK;
  }

  return MAL_FAIL;
}

/******************* (C) COPYRIGHT 2010 STMicroelectronics *****END OF FILE****/

出0入0汤圆

发表于 2014-10-15 12:09:11 | 显示全部楼层
你使用的是WIN8系统吧?

引用的这篇文章是我写的,之前这种方式做过大量的测试了,只有WIN8的系统没有测试,win8系统底层操作有很多奇葩的地方。

你分析的很仔细,如果真如你分析的,起始地址成了5800,那也没关系,把APP程序中偏移量修改为0x8800就可以了:
        NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x8000);
修改为
        NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x8800);

出0入0汤圆

发表于 2014-10-15 15:27:18 | 显示全部楼层
这个要好好学习一下,方法很好!估计以后的芯片都会采用这种方式。

出0入0汤圆

 楼主| 发表于 2014-10-28 22:54:40 | 显示全部楼层
yuangaoping 发表于 2014-10-15 12:09
你使用的是WIN8系统吧?

引用的这篇文章是我写的,之前这种方式做过大量的测试了,只有WIN8的系统没有测试 ...

遇到作者了...这个文档看了很久..
不过有一点就是FAT是连续页的.如果改成其他页没试过.很久没试过了..当然希望能最大限度的压缩IAP体积

出0入0汤圆

 楼主| 发表于 2014-10-28 22:59:18 | 显示全部楼层
yuangaoping 发表于 2014-10-15 12:09
你使用的是WIN8系统吧?

引用的这篇文章是我写的,之前这种方式做过大量的测试了,只有WIN8的系统没有测试 ...

毕竟U盘地址和ROM内部地址不一样.上位机控制FAT写入的位置更加奇葩.

出0入0汤圆

发表于 2014-10-29 08:56:26 来自手机 | 显示全部楼层
这太猛了。。

出0入0汤圆

发表于 2014-10-29 10:03:35 | 显示全部楼层
楼主厉害!!

出0入0汤圆

发表于 2014-10-30 11:10:25 | 显示全部楼层
hellolinux 发表于 2014-8-25 11:41
LZ好人,这个必须是个精华帖!!
有IAR的吗?

我将我的IAR工程上传了,你可以参照一下。
http://www.amobbs.com/thread-5602091-1-1.html

出0入0汤圆

发表于 2014-10-31 09:20:35 | 显示全部楼层
shuailong0411 发表于 2014-10-30 11:10
我将我的IAR工程上传了,你可以参照一下。
http://www.amobbs.com/thread-5602091-1-1.html ...


多谢,明白了LZ的意思,感谢LZ。这种方案可以参考,但通用性不强。

出0入0汤圆

发表于 2014-10-31 09:24:13 | 显示全部楼层
学习一下!

出0入0汤圆

发表于 2014-11-6 18:14:09 | 显示全部楼层
mark   片内FLASH虚拟U盘,iap

出0入0汤圆

发表于 2014-11-12 16:59:52 | 显示全部楼层
U盘 IAP 记号

出0入0汤圆

发表于 2014-11-13 10:29:48 | 显示全部楼层
学习了 谢谢楼主

出5入42汤圆

发表于 2014-11-14 10:35:43 | 显示全部楼层
标记,迟早会使用到。

出0入76汤圆

发表于 2014-11-14 13:52:56 | 显示全部楼层
不错, 支持一下

出0入0汤圆

发表于 2014-11-30 16:10:51 | 显示全部楼层
这个好,谢谢楼主
用这个方式升级很方便

出0入0汤圆

发表于 2014-11-30 22:09:20 | 显示全部楼层

mark   片内FLASH虚拟U盘,iap

出0入0汤圆

发表于 2015-4-7 00:49:59 | 显示全部楼层
不错,好用

出0入0汤圆

发表于 2015-4-7 06:36:09 | 显示全部楼层
参考一下,谢谢!

出0入0汤圆

发表于 2015-4-30 21:27:10 | 显示全部楼层
我试了,U盘的地址和ROM地址是一致的。

出0入0汤圆

发表于 2015-4-30 22:28:57 | 显示全部楼层
yuangaoping 发表于 2014-10-15 12:09
你使用的是WIN8系统吧?

引用的这篇文章是我写的,之前这种方式做过大量的测试了,只有WIN8的系统没有测试 ...

你好。按照你的文档,我成功虚拟成u盘进行更新程序。
但是不知道怎么回事,有次上电之后,USB大容量设备前面有个感叹号,如附件所示。
重新启动或者换台电脑都不行。
但是我下载别的程序也能运行。
能否帮忙答疑下,谢谢。

出0入0汤圆

发表于 2015-5-14 21:53:39 | 显示全部楼层
无法下载,郁闷.....

出0入0汤圆

发表于 2015-5-25 15:47:17 | 显示全部楼层
改成12M晶振,不行了...
无法格式化了....

出0入0汤圆

发表于 2015-5-25 23:03:00 | 显示全部楼层
牛逼叼炸天,一直在找这方面的资料,找了一段时间没找到就放弃了,现在居然无意中发现这个资料

出0入0汤圆

发表于 2015-5-26 09:23:21 | 显示全部楼层
用这个方式升级很方便

出0入0汤圆

发表于 2015-5-26 10:31:48 | 显示全部楼层
mark 虚拟U盘 IAP

出0入0汤圆

发表于 2015-5-26 15:48:18 | 显示全部楼层
这个升级方法太好用了!!!
已经用到自己设计的小玩意上

出0入0汤圆

发表于 2015-5-27 09:11:16 | 显示全部楼层
很方便的升级方式,SD卡和外接FLASH什么的都省了。

出0入0汤圆

发表于 2015-5-27 09:26:35 | 显示全部楼层
非常方便的升级程序。MARK了,

出0入0汤圆

发表于 2015-6-8 16:57:02 | 显示全部楼层
东西看下,不错,准备做stm32项目

出0入0汤圆

 楼主| 发表于 2015-6-28 10:58:10 | 显示全部楼层
gujiamao_love 发表于 2015-4-30 22:28
你好。按照你的文档,我成功虚拟成u盘进行更新程序。
但是不知道怎么回事,有次上电之后,USB大容量设备 ...

很久没回复帖子了..不知道你解决了问题没有..原因是USB枚举过程的问题,.可能是因为板子美欧加入USB枚举GPIO控制.导致上电的时候,MCU并没有开始初始化USB,电脑收不到枚举信息..为了提高实用性,可以在D+线路上加入USB枚举控制电路

出0入0汤圆

 楼主| 发表于 2015-6-28 10:59:07 | 显示全部楼层
gujiamao_love 发表于 2015-5-25 15:47
改成12M晶振,不行了...
无法格式化了....

12M晶振请修改PLL信息...USB工作在48M

出0入93汤圆

发表于 2015-6-28 16:03:46 | 显示全部楼层
收藏一下,多谢楼主

出0入0汤圆

发表于 2015-6-28 17:22:55 | 显示全部楼层
FlandreUNX 发表于 2015-6-28 10:59
12M晶振请修改PLL信息...USB工作在48M

多谢回复哈。
我先是在红牛开发板ZET6,8M晶振上实现的,虚拟成432KFLASH,后来改成自己做的板子VET6上,12M晶振,PLL之类的也改了,死活虚拟不成功,后来我改变了FLASH的起始地址,然后就成功了。
不过只能虚拟成400K。那么问题就是,同样是E系列的处理器,能够虚拟成的flash大小不一样。

出0入4汤圆

发表于 2015-6-30 17:53:00 | 显示全部楼层
为什么我用103VCT6可以枚举出一个U盘,但是WINDOWS总是无法格式化?用的是XP系统

出0入0汤圆

发表于 2015-6-30 22:44:21 | 显示全部楼层
为什么我的STM32F103RGT6的USB使用U盘通信格式,不能在线仿真调试???

出0入0汤圆

发表于 2015-8-12 14:18:15 | 显示全部楼层
FlandreUNX 发表于 2014-8-23 00:01
结束此帖子
自己解决了问题..
发现问题

多谢分享。下载下来拜读

出0入0汤圆

发表于 2015-8-27 16:44:32 | 显示全部楼层
楼主,我用STM32f103zet6 也想实现内部Flash虚拟U盘 升级IAP  我把U盘容量扩大到100k ,实际识别出来的只有76K ,然后那个ApplicationAddress  该怎么设置啊?

出0入0汤圆

发表于 2015-8-31 18:24:16 | 显示全部楼层
好东西啊,准备弄到f0上去。

出0入0汤圆

发表于 2015-11-9 23:32:07 | 显示全部楼层
顶上               

出0入0汤圆

发表于 2015-11-19 14:02:52 | 显示全部楼层
stm32 U盘升级,很酷!!!

出0入0汤圆

发表于 2016-3-12 00:27:03 | 显示全部楼层
顶 准备用这个方案做升级盒

出0入0汤圆

发表于 2016-4-21 17:07:48 | 显示全部楼层
路过顶顶。。

出0入0汤圆

发表于 2016-12-8 11:08:33 | 显示全部楼层
shuailong0411 发表于 2014-10-30 11:10
我将我的IAR工程上传了,你可以参照一下。
http://www.amobbs.com/thread-5602091-1-1.html ...

很好用 可以正常使用

出0入0汤圆

发表于 2016-12-9 04:38:34 来自手机 | 显示全部楼层
感谢楼主分享,记号一下

出0入0汤圆

发表于 2016-12-9 08:55:41 | 显示全部楼层
mark~~拜读~~

出0入0汤圆

发表于 2017-4-17 10:22:51 | 显示全部楼层
mark, STM32, IAP, U盘

出0入0汤圆

发表于 2017-5-29 22:18:04 来自手机 | 显示全部楼层
astankvai 发表于 2015-8-31 18:24
好东西啊,准备弄到f0上去。

f0移植成功了吗兄弟

出0入0汤圆

发表于 2017-6-28 14:00:28 | 显示全部楼层
凌晨一点 发表于 2017-5-29 22:18
f0移植成功了吗兄弟

在F072上做好了.

出0入0汤圆

发表于 2017-6-28 21:09:25 | 显示全部楼层
这个感觉还是有点难用。。

出0入0汤圆

发表于 2017-7-1 12:39:52 | 显示全部楼层

有分享吗?准备移植到F072,到时请教下你啊

出0入0汤圆

发表于 2017-12-7 15:04:39 | 显示全部楼层
连续学习中,哈哈

出0入0汤圆

发表于 2018-4-18 15:27:03 | 显示全部楼层
很方便,不错

出0入0汤圆

发表于 2019-4-14 02:10:22 | 显示全部楼层
真是不错的设计!!!!!!!!!!!!!!!!!!!!!!!!!
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-26 06:59

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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