一)問題:用ULINK2給STM32F103C8T6下載程序,下載方式設置如下:
出現下面兩個問題:
1)下載問題界面如下:
這個錯誤的信息大概可以理解為,在0x08000063地址上讀取到flash存儲為FF,但實際上應該寫入08H,即校驗時讀取到數據與實際寫入的不符。
2)在DEBUG調試的時候,出現如下問題:
調試的時候,無法跳轉到main()函數,無法進行調試。
二)嘗試了解決方案如下:
1)檢查電源電壓和復位電路(復位引腳3.3V經過10K電阻上拉)、VCC和復位NRST的電壓為3.1V.芯片供電無誤。
2)打開STM32 ST-LINK Utility軟件,使用ST_link連接電腦和板子,打開Target-connect,連接時,會報flash sectors read protect的警告,對芯片的flash進行全擦除。(問題如故)
3)升級軟件包Keil.STM32F1xx_DFP.2.4.1為最新。(問題如故)
4)嘗試更換下載算法,d:\Keil_v5\Packs\Keil\STM32F1xx_DFP\2.4.1\Flash\STM32F10x_128.FLM(問題如故)。
5)編譯器優化,之前開的是Level0,基本沒優化,之后我更改為level1,代碼有所縮減,但是沒有解決問題(問題如故)。
6)下載程序時,取消校驗,這個就純屬掩耳盜鈴。
7)減小下載速度,問題如故。
三)解決辦法:
將Debug菜單 - Reset菜單選項(HWreset/sysresetReq/Vectreset)由“sysresetReq”改為“HWreset”,下載正常,調試也正常。更改界面如下:
可以正常Debug,如圖:
四)原因分析:
一些概念如下:
1、Reset — HW RESET
英文含義:performs a hardware reset by asserting the hardware reset (HW RESET) signal.
中文含義:復位-硬件復位通過置位硬件復位(HW RESET)信號來執行硬件復位。
2、Reset — SYSRESETREQ
英文含義:performs a software reset by setting the SYSRESETREQ bit. The Cortex-M core and on-chip peripherals are reset.
中文含義:通過將SYSRESETREQ位置1來執行軟件復位。 Cortex-M內核和片上外設被重置。
3、Reset — VECTRESET
英文含義:performs a software reset by setting the VECTRESET bit. Only the Cortex-M core is reset. The on-chip peripherals are not affected. For some Cortex-M devices, VECTRESET is the only way to reset the core. VECTRESET is not supported on Cortex-M0 and Cortex-M1 cores.
中文含義:復位-VECTRESET通過將VECTRESET位置1來執行軟件復位。 僅Cortex-M內核被重置。 片上外設不受影響。 對于某些Cortex-M設備,VECTRESET是重置內核的唯一方法。 Cortex-M0和Cortex-M1內核不支持VECTRESET。
4、Reset — Autodetect
英文含義:selects one of the above reset methods based on the target device. The SYSRESETREQ method is used if an unknown device is detected.
中文含義:重置-自動檢測根據目標設備選擇上述重置方法之一。 如果檢測到未知設備,則使用SYSRESETREQ方法。
連接類型選項:
Normal:默認的連接策略,連接后只是將 PC 停在當前執行的指令處
with Pre–reset:在連接前,先執行一次 HW RESET
under Reset:在連接過程中一直保持 HW RESET 有效(該選項適用于用戶程序誤將 JTAG/SWD 禁掉的情況)
without Stop:連接后任 CPU 自由執行(適用于觀測存儲器或者外設 SFR 情況)
復位類型選項:
HW RESET:通過翻轉ULink2的nSRST/nRESET引腳(一般也會接到MCU reset腳)來復位MCU
SYSRESETREQ:借助Cortex-M內核模塊SCB中的AIRCR寄存器的SYSRESETREQ位來同時復位MCU外設模塊
VECTRESET:借助Cortex-M內核模塊SCB中的AIRCR寄存器的VECTRESET位功能來復位Core
由于我的MCU的NRST連接到了ULink2的nSRST/nRESET引腳和PCB板上另一個芯片的復位管腳,可能的原因是:SYSRESETREQ復位方式由于另一個芯片的影響,無法進行MCU的正常復位,然而,HW RESET方式下,ULINK2可以通過硬件反轉NRST復位引腳,成功復位MCU。
分析:
復位的時序會影響程序的下載和調試(能否停在程序入口函數,能否進行單步),具體的影響邏輯沒有理清楚。
五)經驗教訓
MCU的復位管腳一定要謹慎使用,當需要和其他芯片連接時,要清楚上下拉強度,清楚驅動電流大小。否則復位失效。