久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索

關于keil 燒錄hex文件問題

查看數: 1458 | 評論數: 7 | 收藏 0
關燈 | 提示:支持鍵盤翻頁<-左 右->
    組圖打開中,請稍候......
發布時間: 2025-2-24 13:46

正文摘要:

這幾天遇到了一個問題: 同樣的一份hex文件,在keil(j-link)里燒錄,程序能正常運行,但是通過J-flash反讀出來的hex文件,會比原來的hex文件多出一段數據  比如:原來的hex在0x08049444的地址已經結束 ...

回復

ID:879809 發表于 2025-3-8 11:11
讀flash的軟件又不知道哪里結束當然把全部內容讀出來了。
ID:866313 發表于 2025-2-27 02:54
以下內容由 DeepSeek R1 生成根據你提供的批處理腳本和現象分析,問題的核心在于 srec_cat工具對HEX文件的裁剪邏輯不完整,導致未勾選批處理時HEX文件中殘留了編譯器生成的填充數據,而勾選批處理時意外截斷了這些數據。以下是詳細分析和解決方案:


問題根源
  • 編譯器填充行為  Keil編譯器在生成HEX文件時,默認會根據Flash扇區大小(如STM32F407的16KB/128KB)對代碼段進行填充,填充內容通常為0xFF或未定義值。這些填充數據在MAP文件中不會顯示,但實際會存在于HEX文件中。
  • 批處理腳本的裁剪缺陷  你的批處理腳本通過srec_cat裁剪HEX文件時,僅保留了0x08020000到CRC_ADDR之間的數據,忽略了CRC_ADDR之后可能存在的填充數據。這導致:

    • 勾選批處理:生成的HEX文件僅包含有效代碼和CRC,裁剪掉了填充數據。
    • 未勾選批處理:HEX文件保留編譯器生成的填充數據,J-Flash反讀時讀取整個扇區,包含這些殘留值。

  • Flash擦除差異  Keil燒錄時可能僅擦除代碼占用的扇區,而J-Flash默認擦除整個扇區,導致未初始化區域被填充為隨機值(如0x00),覆蓋了中斷向量表或其他關鍵數據。



解決方案
修改批處理腳本,確保在計算CRC后,保留原HEX文件中CRC_ADDR之后的所有填充數據。以下是修正后的腳本關鍵步驟:
1. 修改srec_cat命令
將第二個srec_cat命令改為合并三部分數據:
  • 原HEX的CRC地址前部分 (0x08020000到CRC_ADDR)
  • 新生成的CRC部分 (CRC_ADDR到CRC_ADDR_END)
  • 原HEX的CRC地址后部分 (CRC_ADDR_END到Flash末尾)

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

關鍵改進點
  • 保留填充數據  通過-crop %CRC_ADDR_END% 0x08080000顯式保留原HEX文件中CRC地址后的所有數據,避免截斷編譯器生成的填充。
  • 統一填充值  使用-fill 0xFF ...確保未使用的Flash區域被初始化為0xFF,避免J-Flash讀取到隨機值。
  • 完整Flash覆蓋  指定Flash的完整地址范圍(0x08080000為STM32F407VGT6的Flash末尾地址),確保操作覆蓋整個空間。



驗證方法
  • HEX文件對比  使用二進制工具(如HexCompare)對比Keil生成的原始HEX和批處理后的HEX,確認CRC地址后的數據是否一致。
  • Flash內容檢查  在Keil調試模式下,通過Memory窗口查看CRC_ADDR之后的Flash內容,確認是否為0xFF或有效數據。
  • J-Flash燒錄測試  使用修正后的HEX文件通過J-Flash燒錄,驗證App是否能正常啟動。



通過上述修正,批處理腳本將正確保留編譯器生成的填充數據,同時確保CRC校驗碼的完整性,解決J-Flash反讀多余數據導致程序無法運行的問題。

ID:1144404 發表于 2025-2-25 20:48
有未知格式,建議該換方案
ID:583948 發表于 2025-2-25 09:36
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的有效地址段

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 天天操天天摸天天干 | 国产精品 亚洲一区 | 在线观看日本高清二区 | 欧美成人hd | av官网在线 | 国产精品夜夜夜一区二区三区尤 | 在线日韩欧美 | 老司机深夜福利网站 | 91网在线播放 | 国产精品久久二区 | 羞羞视频在线观免费观看 | 午夜精品一区二区三区在线观看 | 久久久国产精品视频 | 视频一区二区在线观看 | 免费国产视频在线观看 | 91国产精品| 亚洲字幕在线观看 | 国产综合精品一区二区三区 | 欧美中文字幕 | 五十女人一级毛片 | a级片www | 欧美成人在线免费 | 国产精品久久久久久婷婷天堂 | 亚洲精久久久 | 成人一区二区在线 | 久久国产精品无码网站 | 亚洲性网| 日韩高清在线观看 | 欧美精品乱码久久久久久按摩 | 男女精品网站 | 日韩精品专区在线影院重磅 | 亚洲福利在线视频 | 97综合在线 | 日韩中文字幕久久 | 激情一区二区三区 | 日韩精品人成在线播放 | 欧美性久久| av激情影院 | 一级黄色录像毛片 | 伊人久久综合 | 亚洲国产精品99久久久久久久久 |