WINBOND/华邦 W25Qxxx调试笔记
項目場景:
項目中原來使用華邦W25Q128芯片,后因為flash容量續替換為W25Q256芯片。Bootloader使用自己分裝的對W25Q128驅動程序,APP程序使用armink提供SFUD框架。項目程序放在stm32片內flash中,片外norflash中存放OTA的固件和更新標志位。Bootloader上電讀取flash中更新標志位位和校驗數據都正常,APP讀取flash中工作參數也都正常。
問題描述
執行完固件升級后,軟重啟mcu依然使用內部flash舊固件,但是斷電重啟后可正常加載升級后的程序。
原因分析:
先仿真APP程序,讀取download區代碼,發現固件升級標志位和固件描述頭部信息crc都正確。再仿真Bootloader程序,發現無法讀取flash中數據發現都是0xFF,片外flash未寫入狀態。初步懷疑是bootloader驅動問題,但是偶然發現斷電重啟后可以正常讀取片外flash的數據,且crc正確。排除下載固件時未正確寫入片外flash。
之前代碼可以正常升級固件這次只是換了個固件導致代碼異常。之前有個項目用到eeprom從24C32換到24C64也出現問題(可查看這篇筆記:讀24cxx EEPROM),eeprom的問題是尋址從1字節變成2字節導致無法讀出數據。可查看華邦W25Q256的datasheet。
W25Q256支持兩種尋址模式3字節尋址和4字節尋址。
其區別在Address位數不同,功能碼也不同3字節讀數據是0x03,4字節則是0x13。寫flash也是存在兩種尋址方式。
還有兩條命令控制控制進入4字節尋址和退出4字節尋址。
那么外部flash讀取失敗的問題也明朗了,程序在APP中進入了4字節尋址,Bootloader中國使用的是3字節尋址。APP程序在完成固件升級后軟重啟MCU并不會復位W25Q256,導致flash還在4字節尋址模式中,Bootloader去讀取數據只能讀到0xFF。若斷電后flash復位后,沒進入4字節尋址boot便可以讀出數據,這也就是為什么斷電重啟后會正常更新程序,不斷電則沒更新程序。
項目之前使用了SFUD框架快速開發flash,但是我們對正常運作的代碼關注不夠細致才導致這個bug的存在。回過去看一下SFUD是怎么實現對W25Q128和W25Q256關于尋址方面的配置。
SFUD框架中對4字節設置API函數源碼:
其函數調用是根據flash芯片大小判斷的:(源碼中注釋寫的16MB應該是注釋標注錯誤,256Mb是32MB)
/* if the flash is large than 32MB (256Mb) then enter in 4-Byte addressing mode */ if (flash->chip.capacity > (1L << 24)) {result = set_4_byte_address_mode(flash, true); } else {flash->addr_in_4_byte = false; }解決方案:
其實出現這個問題往往是因為更換硬件芯片,只對現有代碼運行一下發現能用就沒有繼續思考下去。加上boot程序往往代代相傳,當初沒有考慮到不同芯片的兼容問題,也可能是為了壓縮程序空間故意沒做兼容。
可以有兩種解決方案:
方案1:對于已經出貨的機器可以修改APP程序,在OTA下載完固件后,軟重啟前退出4字節模式,這樣Bootloader可以正常讀取更新標志位。個人覺得若出現這種出貨的情況數據項目過程中風險評估不到位加上測試不到位。
方案2:修改boot程序,增加對機型判斷若是256Mb的芯片使用4字節模式尋址讀寫數據。
總結
以上是生活随笔為你收集整理的WINBOND/华邦 W25Qxxx调试笔记的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 2045年4月25日
- 下一篇: 两电平直接转矩控制MATLAB,基于MA