STM32把SD卡內極速快三平臺出租搬運到內部FLASH
阿新 • • 發佈:2018-07-11
har 註意 擴展函數 parameter fff 平臺出租 中間 lose 庫函數 STM32操極速快三平臺出租 haozbbs.com Q1446595067 作訪問flash,包括寫入數據到flash和從flash讀取數據 :https://blog.csdn.net/Ace_Shiyuan/article/details/78196648
而如果FLASHStatus = FLASH_ProgramHalfWord(STARTADDR+WriteAddress+i, temp);會失敗
因為寫之前要擦除的,你寫了必須後面移動。你寫的是00 01 一次寫了2個字節。
有兩種解決辦法,一種實誠,一種高級。
這篇文章寫得比較明白,但是它寫的函數不飽滿,沒有把Flash充分寫滿。
請看寫數組的函數:FLASHStatus = FLASH_ProgramHalfWord(STARTADDR+WriteAddress+i*2, temp);//寫入數據
問題大了,比如寫u8 pBuffer[10]={"123456789"};寫進去是:01 00 02 00.... 這樣的 中間浪費了,/因為u8轉u16會自動給前面補0 那就是01 02 03 在寫到內存會字節序反過來。
因為寫之前要擦除的,你寫了必須後面移動。你寫的是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(數組名),10242(數組長),(UINT )&bread(這個變量好,可以告訴你讀到多少個,比如你去讀2018結果它是23那就是告訴你讀完了你只讀到了23個));
++++++++++++++我擦++++++++++
unsigned char UpdateBuffer[256];
dWrd = (uint32_t )&UpdateBuffer[idx];
+++++++++++++++++++++++
STM32把SD卡內極速快三平臺出租搬運到內部FLASH