搜索
bottom↓
回复: 21

stm32用内部flash虚拟u盘进行IAP的IAR工程

[复制链接]

出0入0汤圆

发表于 2014-10-30 11:04:52 | 显示全部楼层 |阅读模式
在STM32F103C8-PKT板上测试成功,修改成103VC的提示“格式化无法完成”,不知道什么原因,望高手指点一下。废话不话,直接上传程序。

本帖子中包含更多资源

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

x

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

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

出0入0汤圆

发表于 2014-10-30 11:59:28 | 显示全部楼层
帮顶一下

出0入0汤圆

发表于 2014-10-30 12:01:44 | 显示全部楼层
stm32 内部flash 虚拟u盘  IAP IAR 工程

出0入0汤圆

发表于 2014-10-30 12:28:40 | 显示全部楼层
flash块大小一样吗

出0入0汤圆

 楼主| 发表于 2014-10-30 14:09:00 | 显示全部楼层

移植到103VC上时,mass_mal.c中的
        #define FLASH_START_ADDR        0x08003000        // Flash start address
        #define FLASH_SIZE                        0xD000
        #define FLASH_PAGE_SIZE                0x400                // 1K per page
        #define FLASH_WAIT_TIMEOUT        100000
这部分我没有做修改。我想103VC的FLASH是256K,103C8是64K,不做修改的话用的是前64K。不知道这样的想法对不对?

出0入0汤圆

发表于 2014-10-30 15:19:45 | 显示全部楼层
把mass_mal.c这个文件里面的读写函数改一下试试:
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;
}

出0入0汤圆

 楼主| 发表于 2014-10-30 16:38:43 | 显示全部楼层
fengzhong 发表于 2014-10-30 15:19
把mass_mal.c这个文件里面的读写函数改一下试试:
uint16_t MAL_Write(uint8_t lun, uint32_t Memory_Offse ...

#define FLASH_SIZE                        0xD000
#define FLASH_PAGE_SIZE                0x400                // 1K per page
这里需要修改吗?

出0入0汤圆

发表于 2014-10-30 17:36:56 | 显示全部楼层
根据芯片的页大小来定义这个
#define FLASH_PAGE_SIZE                0x400                // 1K per page
有些芯片的页大小是2K,就要改;

出0入0汤圆

 楼主| 发表于 2014-10-30 17:42:50 | 显示全部楼层
fengzhong 发表于 2014-10-30 17:36
根据芯片的页大小来定义这个
#define FLASH_PAGE_SIZE                0x400                // 1K per pag ...

多谢,晚上回去试试!

出0入0汤圆

发表于 2014-10-30 20:52:18 | 显示全部楼层
我现在查不了页面的具体大小

出0入0汤圆

发表于 2014-10-30 20:53:19 | 显示全部楼层
收藏,以后试下。

出0入0汤圆

发表于 2014-10-30 21:50:53 | 显示全部楼层
估计是flash页面大小不一样吧

出0入0汤圆

发表于 2014-10-30 22:10:27 | 显示全部楼层
看看,最近在搞IAP

出0入0汤圆

发表于 2014-10-31 10:03:42 | 显示全部楼层
我的已经搞定,有需要可以沟通。

出0入0汤圆

 楼主| 发表于 2014-10-31 10:36:21 | 显示全部楼层
codeyear 发表于 2014-10-31 10:03
我的已经搞定,有需要可以沟通。

你的用哪个型号的芯片搞定的?

出0入0汤圆

发表于 2015-8-27 16:49:18 | 显示全部楼层
我也遇到过,是mass_mal.c 文件的Flash 页大小没有设置正确,1k?还是2k?取决于你的STM32 Flash容量

出0入0汤圆

发表于 2015-12-4 16:24:02 | 显示全部楼层
后来搞好了吗,我现在也遇到了一样的问题,也是不能格式化,我的FLASH是256K的,FLASH_PAGE_SIZE                0x800 这里也改了,不知还有哪里问题呢

出0入0汤圆

发表于 2015-12-4 16:46:52 | 显示全部楼层
mark一下

出0入0汤圆

发表于 2015-12-7 09:59:19 | 显示全部楼层
http://www.amobbs.com/thread-5638810-1-1.html 可以用这个贴子的方法测试,我测试成功了

出0入0汤圆

发表于 2016-4-11 23:14:54 | 显示全部楼层
bad_fpga 发表于 2015-12-7 09:59
http://www.amobbs.com/thread-5638810-1-1.html 可以用这个贴子的方法测试,我测试成功了 ...

超过30K的程序好像有问题,折腾一天了

出0入0汤圆

发表于 2016-4-12 15:04:28 | 显示全部楼层
vjcmain 发表于 2016-4-11 23:14
超过30K的程序好像有问题,折腾一天了

哪个超过30k有问题?

出0入0汤圆

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

本版积分规则

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

GMT+8, 2024-4-27 18:25

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

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