专家
公告
财富商城
电子网
旗下网站
首页
问题库
专栏
标签库
话题
专家
NEW
门户
发布
提问题
发文章
STM32
stm32用内部flash虚拟u盘进行IAP的IAR工程
2019-12-27 18:35
发布
×
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮
站内问答
/
STM32/STM8
13513
22
22
在STM32F103C8-PKT板上测试成功,修改成103VC的提示“格式化无法完成”,不知道什么原因,望高手指点一下。废话不话,直接上传程序。
友情提示:
此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
22条回答
fengzhong
2019-12-28 07:20
把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(" 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(" <-: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(" StartWriteOffset: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(" ->: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(" 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(" bias:0x%04x data:0x%08x",i,Readbuff[i>>2]);
PageAddr=PageAddr+FLASH_PAGE_SIZE;
StartWriteOffset=0;
}
return MAL_OK;
}
加载中...
查看其它22个回答
一周热门
更多
>
相关问题
STM32F4上I2C(在PROTEUS中模拟)调试不通的问题
6 个回答
芯片供应紧张,准备换个MCU,MM32L系列替换STM32L系列的怎么样?
7 个回答
STM32同时使用两个串口进行数据收发时数据丢包的问题
5 个回答
STM32F103串口通信死机问题
4 个回答
STM32WLE5CC连接SX1268在LoRa模式下能与 SX1278互通吗?
2 个回答
相关文章
ST公司第一款无线低功耗单片机模块有效提高物联网设计生产效率
0个评论
如何实现对单片机寄存器的访问
0个评论
通过USB用STM32片内自带Bootloader下载程序及注意事项
0个评论
欲练此功必先自宫之STM32汇编启动,放慢是为了更好的前行
0个评论
×
关闭
采纳回答
向帮助了您的知道网友说句感谢的话吧!
非常感谢!
确 认
×
关闭
编辑标签
最多设置5个标签!
STM32
保存
关闭
×
关闭
举报内容
检举类型
检举内容
检举用户
检举原因
广告推广
恶意灌水
回答内容与提问无关
抄袭答案
其他
检举说明(必填)
提交
关闭
×
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮
×
付费偷看金额在0.1-10元之间
确定
×
关闭
您已邀请
0
人回答
查看邀请
擅长该话题的人
回答过该话题的人
我关注的人
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(" 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(" <-: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(" StartWriteOffset: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(" ->: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(" 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(" bias:0x%04x data:0x%08x",i,Readbuff[i>>2]);
PageAddr=PageAddr+FLASH_PAGE_SIZE;
StartWriteOffset=0;
}
return MAL_OK;
}
一周热门 更多>