日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

移植fatfs上电复位前两次不能正确打开文件解决方法

發布時間:2025/4/16 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 移植fatfs上电复位前两次不能正确打开文件解决方法 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
最近移植了fatfs到stm32,昨晚寫進了第一個txt文件,然后就睡覺了,以為移植差不多了,今晚試了一下,發現不好用了,
res = f_open(&file, "text.txt", FA_OPEN_ALWAYS ?| FA_READ | FA_WRITE); ?但是復位兩次就可以用了,跟蹤發現的確是正好兩次;
查網上有人說把MISO改為上拉,我試了下沒有效果,決定自己跟蹤找錯誤;
跟蹤發現 ? f_open? res返回1,對應FR_DISK_ERR 底層驅動錯誤
繼續跟蹤發現是f_open調用的chk_mounted的這一句fmt = check_fs(fs, bsect);檢查文件系統錯誤;
繼續跟蹤發現?check_fs里的第一句if (disk_read(fs->drv, fs->win, sect, 1) != RES_OK) return 3;直接錯誤返回3;
繼續跟蹤disk_read發現是讀扇區函數res = MSD_ReadSingleBlock(sector, buff); 返回res=1
繼續跟蹤MSD_ReadSingleBlock發現是
.......................................
............................
r1 = _send_command(CMD17, sector, 0);//獨一塊命令 if(r1 != 0x00)//r1!=0x00,則接收命令錯誤 { return 1;//返回寫塊錯誤 } // Start read and return the result r1 = _read_buffer(buffer, MSD_BLOCKSIZE, RELEASE);//讀MSD_BLOCKSIZE(512)個字節數據到buffer,讀完后release
.................................
............................................
就是讀數據時候錯誤返回1;
而當我想跟蹤_read_buffer的時候發現只要跟蹤進去,就不會返回錯誤1,正確的返回0,很是頭大,然后仔細想一想,在 r1 = _read_buffer這里設置斷點 跟蹤就沒錯誤,應該是和這里的時序有關,因為調試和實際運行直接時間的差別;
然后看了下 _send_command(CMD17, sector, 0)時序圖


斷點設置的是畫紅圈的那里,說明延長這個時間,問題就會解決;
_read_buffer里是通過以下一段延時的
.......................................
............................
for(retry=0; retry<2000; retry++) { r1 = _spi_read_write(DUMMY_BYTE); if(r1 == 0xFE)//成功 { ? retry = 0;//成功標志 break; } }
// Timeout return超時 if(retry == 2000) { _card_disable();//關片選 ? return 1;//返回超時錯誤 }
.......................................
............................
程序為retry自加到2000就返回r1超時錯誤,設置斷點在 return 1;//返回超時錯誤 這一句,也的確會執行到這里;
于是把程序改為for(retry=0; retry<4000; retry++),錯誤解決了,后來跟蹤發現這里復位次retry都會自加到0x855(2133),正好超出2000!

整個錯誤按理說應該很好查,但是由于是復位前兩次,而且錯誤和時序有關,設置斷點的位置會影響錯誤存在與否,所以每一次調試都要斷電,上電,打開調試,設置斷點,所以跟蹤到這個錯誤非常麻煩,也用了我一晚上的時間,寫下這個,希望其他人有類似的錯誤可以參考下。

還有不明白的地方是:

1.為什么只在復位前兩次出現這個問題?
2.chk_mounted里兩次調用?check_fs,也就是兩次調用disk_read,同樣就是兩次調用_read_buffer,跟蹤發現總是第二次才出現這個錯誤,第一次和第二次唯一的區別是第一次讀的是物理0扇區,第二次讀的是物理8192扇區(我的8G SDHC,邏輯0扇區在物理扇區的8192扇區),是不是因為扇區地址大,尋址時間長了?那同樣讀更大的扇區會不會耗時更長?

《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀

總結

以上是生活随笔為你收集整理的移植fatfs上电复位前两次不能正确打开文件解决方法的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。