STM32把SD卡内容搬运到内部FLASH之一

首先阅读这篇博文:

STM32操作访问内部flash,包括写入数据到flash和从flash读取数据 :https://blog.csdn.net/Ace_Shiyuan/article/details/78196648

这篇文章写得比较明白,但是它写的函数不饱满,没有把Flash充分写满,意思如下:

请看写数组的函数:FLASHStatus = FLASH_ProgramHalfWord(STARTADDR+WriteAddress+i*2, temp);//写入数据
存在问题:比如写u8 pBuffer[10]={"123456789"};写进去是:01 00 02 00.... 这样的 中间浪费了,/因为u8转u16会自动给前面补0 那就是01 02 03 在写到内存会字节序反过来。
而如果FLASHStatus = FLASH_ProgramHalfWord(STARTADDR+WriteAddress+i, temp);会失败
因为写之前要擦除的,你写了必须后面移动。你写的是00 01 一次写了2个字节。

 

 

有两种解决办法,一种实诚,一种高级。

1基于内部FLASH的库函数,自己写扩展函数。

* @param Address: specifies the address to be programmed.
* This parameter can be 0x1FFFF804 or 0x1FFFF806. -----------------测试下 这两个地址也是不能写的!
FLASH_Status FLASH_ProgramOptionByteData(uint32_t Address, uint8_t Data)----------这个函数放弃使用。至少是写u16的!写u8会失败!
FLASH_Status FLASH_ProgramHalfWord (uint32_t Address, uint16_t Data)--OK
FLASH_Status FLASH_ProgramWord (uint32_t Address, uint32_t Data)--OK

2测试

 

#define STM32ADDR_ADJUSTMENT  0X08078800  //p241//0X0807F800 //PAGE255  2K
#define STM32ADDR_PAGE        15
u8 pBuffer[10]={"123456789"};
u8 TBuffer[9];
函数:
stm32_flash_page_clear(STM32ADDR_ADJUSTMENT);
stm32_flash_write_Array(pBuffer,STM32ADDR_ADJUSTMENT,9);
stm32_flash_read_Array(TBuffer,STM32ADDR_ADJUSTMENT,9) ;



3擦掉Flash

 

for(i=0;i<STM32ADDR_PAGE;i++)
{
stm32_flash_read_Array((u8*)buf,STM32ADDR_ADJUSTMENT,1024*2);
for(j=0;j<512;j++)
{
    if(buf[j]!=0XFFFFFFFF)break;	  
}
if(j!=512)
    stm32_flash_page_clear(STM32ADDR_ADJUSTMENT+i*1024*2);
}


4开始写

 

while(res==FR_OK)//死循环执行
{
//	res=f_read(fftemp,tempbuf,4096,(UINT *)&bread);	//读取数据	 
//	if(res!=FR_OK)break;	//执行错误
//	W25QXX_Write(tempbuf,offx+flashaddr,4096);	//从0开始写入4096个数据  
//	  offx+=bread;	  
//	fupd_prog(x,y,size,fftemp->fsize,offx);	//进度显示
//	if(bread!=4096)break;	//读完了.
        res=f_read(fftemp,tempbuf,1024*2,(UINT *)&bread);	//读取数据	 
        stm32_flash_write_Array(tempbuf,i*2018+STM32ADDR_ADJUSTMENT,2048);
         offx+=bread;	 
         i++;
fupd_prog(x,y,size,15,i);	//进度显示
}
f_close(fftemp);


注意:f_read(fftemp(文件),tempbuf(数组名),1024*2(数组长),(UINT *)&bread(这个变量好,可以告诉你读到多少个,比如你去读2018结果它是23那就是告诉你读完了你只读到了23个));

++++++++++++++我擦++++++++++
unsigned char    UpdateBuffer[256];
  dWrd = *(uint32_t *)&UpdateBuffer[idx];

 

+++++++++++++++++++++++

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值