![]() |
發布時間: 2025-2-24 13:46
正文摘要:這幾天遇到了一個問題: 同樣的一份hex文件,在keil(j-link)里燒錄,程序能正常運行,但是通過J-flash反讀出來的hex文件,會比原來的hex文件多出一段數據 比如:原來的hex在0x08049444的地址已經結束 ... |
讀flash的軟件又不知道哪里結束當然把全部內容讀出來了。 |
以下內容由 DeepSeek R1 生成根據你提供的批處理腳本和現象分析,問題的核心在于 srec_cat工具對HEX文件的裁剪邏輯不完整,導致未勾選批處理時HEX文件中殘留了編譯器生成的填充數據,而勾選批處理時意外截斷了這些數據。以下是詳細分析和解決方案: 問題根源
解決方案 修改批處理腳本,確保在計算CRC后,保留原HEX文件中CRC_ADDR之后的所有填充數據。以下是修正后的腳本關鍵步驟: 1. 修改srec_cat命令將第二個srec_cat命令改為合并三部分數據:
CRC_BIN\srec_cat.exe ^ 1.hex -intel -crop %CRCA_START_ADDR% %CRC_ADDR% ^ BRMU\BRMU_checked.hex -intel -crop %CRC_ADDR% %CRC_ADDR_END% ^ 1.hex -intel -crop %CRC_ADDR_END% 0x08080000 ^ -o 1.hex -intel -output_Block_Size 0x102. 添加Flash范圍參數 明確指定Flash的完整地址范圍(如0x08000000到0x08080000),確保填充未使用的區域為0xFF: REM 生成臨時CRC文件時填充未使用區域CRC_BIN\srec_cat.exe ^ 1.hex -intel ^ -crop %CRCA_START_ADDR% %CRC_ADDR% ^ -fill 0xFF %CRCA_START_ADDR% 0x08080000 ^ -stm32-l-e %CRC_ADDR% ^ -o BRMU\BRMU_checked.hex -intel 完整修正腳本 @echo off ECHO Computing CRC ECHO ------------------------------------- SET MAP_FILE=1.map SET TMP_FILE=crc_temp.txt REM 提取CRC地址 FINDSTR /R /C:"^ *CHECKSUM" %MAP_FILE% > %TMP_FILE% SET /p crc_search=<%TMP_FILE% DEL %TMP_FILE% FOR /F "tokens=1 delims=(" %%a IN ("%crc_search%") DO SET crc_search=%%a SET crc_search=%crc_search:CHECKSUM=% FOR /F "tokens=1 delims= " %%a IN ("%crc_search%") DO SET CRC_ADDR=%%a SET /a CRC_ADDR_END=%CRC_ADDR% + 4 SET CRCA_START_ADDR=0x08020000 REM 生成包含CRC的臨時文件,并填充未使用區域為0xFF CRC_BIN\srec_cat.exe ^ 1.hex -intel ^ -crop %CRCA_START_ADDR% %CRC_ADDR% ^ -fill 0xFF %CRCA_START_ADDR% 0x08080000 ^ -stm32-l-e %CRC_ADDR% ^ -o BRMU\BRMU_checked.hex -intel REM 合并原HEX的CRC前部分、新CRC部分、原HEX的CRC后部分 CRC_BIN\srec_cat.exe ^ 1.hex -intel -crop %CRCA_START_ADDR% %CRC_ADDR% ^ BRMU\BRMU_checked.hex -intel -crop %CRC_ADDR% %CRC_ADDR_END% ^ 1.hex -intel -crop %CRC_ADDR_END% 0x08080000 ^ -o 1.hex -intel -output_Block_Size 0x10 REM 清理臨時文件 DEL BRMU\BRMU_checked.hex ECHO ------------------------------------- 關鍵改進點
驗證方法
通過上述修正,批處理腳本將正確保留編譯器生成的填充數據,同時確保CRC校驗碼的完整性,解決J-Flash反讀多余數據導致程序無法運行的問題。 |
有未知格式,建議該換方案 |
1、keil生成的HEX文件可能僅包含有效代碼段,而J-Flash反讀時會以Flash扇區為單位讀取,導致未使用的扇區尾部數據被包含進來,例如,STM32F407的Flash扇區大小為16KB或128KB,若原HEX文件結束地址在扇區中間,反讀時會讀取整個扇區,包含未寫入的隨機殘留數據; 2、keil燒錄時可能采用僅擦除代碼占用的扇區,且不處理后續未使用的區域。J-Flash默認可能擦除整個扇區,導致未初始化的Flash區域被填充為隨機值 3、在Boot+App架構中,App的中斷向量表需要重映射到其起始地址,若反讀的HEX文件在App區域后包含額外數據,可能導致中斷向量表被覆蓋或偏移錯誤,使得App無法響應中斷 驗證與解決 1、使用J-Link配合J-Flash的Memory Read功能,直接讀取Flash中App區域的原始數據,與Keil生成的HEX文件逐字節對比,定位異常數據點 2、Keil調試模式下,單步執行App的啟動代碼(如Reset_Handler),確認棧指針(SP)和中斷向量表地址(VTOR)是否正確加載。若SP指向無效地址,程序會立即崩潰 3、使用二進制工具(如HexView)對比Keil生成的HEX和J-Flash反讀的HEX,確認多余數據的地址范圍。手動裁剪反讀的HEX文件,僅保留原HEX的有效地址段 |