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"};写进去是:10 20 30.... 这样的 中间浪费了

FLASHStatus = FLASH_ProgramHalfWord(STARTADDR+WriteAddress+i, temp);会失败

因为写之前要擦除的,你写了必须后面移动。你写的是00

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];

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

猜你喜欢

转载自blog.csdn.net/weixin_42381351/article/details/80924341