以 connect-under-reset 參數解決 ST-Link SWD 連接問題
以 connect-under-reset
參數解決 ST-Link SWD 連接問題
如果在程式碼中,不小心將 PA13
、PA14
的 SWD 功能關閉,例如使用了下面的程式碼
1rcc_periph_clock_enable(RCC_GPIOA); // Need GPIOA clock
2gpio_primary_remap(
3 AFIO_MAPR_SWJ_CFG_JTAG_OFF_SW_OFF, // Optional
4 AFIO_MAPR_TIM2_REMAP_NO_REMAP); // This is default: TIM2.CH2=GPIOA1
或者在 STM32CubeMX 中忘記勾選 PA13/PA14
的串列埠除錯功能,都會導致後續燒錄和連線失敗
STLINK 工具 st-flash 和 st-info
首先檢查一下系統中是否有 st-flash
和 st-info
命令,沒有的話需要安裝。試試看透過系統的套件管理程式 yum
或 apt
安裝 stlink-tools
通過 st-info
檢查,可能會提示無法進入 SWD 模式的錯誤訊息:
1st-info --probe
2Failed to enter SWD mode
3Found 1 stlink programmers
4 version: V2J27S15
5 serial: 066EFF505256656767214523
6 flash: 0 (pagesize: 0)
7 sram: 0
8 chipid: 0x0000
9 descr: unknown device
這一行 Failed to enter SWD mode
可能不會出現,但是抓不到 MCU
使用 st-flash
和 st-info
解決 STM32 燒錄失敗
在網上搜到的大部分方案, 例如這個 stackoverflow的解答 , 都是要到 Windows 下, 通過 ST-link utility 去重置擦除, 這裡介紹一下 Linux 下的處理方法
st-info 使用 --connect-under-reset 參數
此時需要使用 --connect-under-reset
參數,按住開發板的 RESET 鍵之後,執行下面的命令,就能正確檢測到晶片資訊
1$ st-info --probe --connect-under-reset
2---------- old ------------
3# Chip-ID file for F411xC/E
4#
5chip_id 0x431
6description F411xC/E
7flash_type 3
8flash_size_reg 0x1fff7a22
9flash_pagesize 0x4000
10sram_size 0x20000
11bootrom_base 0x1fff0000
12bootrom_size 0x7800
13option_base 0x0
14option_size 0x0
15flags 2
16
17---------- new ------------
18# Chip-ID file for F411xC/E
19#
20chip_id 0x431
21description F411xC/E
22flash_type 3
23flash_size_reg 0x0
24flash_pagesize 0x4000
25sram_size 0x20000
26bootrom_base 0x1fff0000
27bootrom_size 0x7800
28option_base 0x0
29option_size 0x0
30flags 2
31
32Found 1 stlink programmers
33 version: V2J27S15
34 serial: 066EFF505256656767214523
35 flash: 0 (pagesize: 16384)
36 sram: 131072
37 chipid: 0x0431
38---------- old ------------
39# Chip-ID file for F411xC/E
40#
41chip_id 0x431
42description F411xC/E
43flash_type 3
44flash_size_reg 0x1fff7a22
45flash_pagesize 0x4000
46sram_size 0x20000
47bootrom_base 0x1fff0000
48bootrom_size 0x7800
49option_base 0x0
50option_size 0x0
51flags 2
52
53---------- new ------------
54# Chip-ID file for F411xC/E
55#
56chip_id 0x431
57description F411xC/E
58flash_type 3
59flash_size_reg 0x0
60flash_pagesize 0x4000
61sram_size 0x20000
62bootrom_base 0x1fff0000
63bootrom_size 0x7800
64option_base 0x0
65option_size 0x0
66flags 2
67
68 descr: F411xC/E
如果是這種情況,說明是 PA13/PA14
的功能覆蓋問題,可以通過韌體擦除解決問題
st-flash 擦除韌體
st-flash
同樣地要加上 --connect-under-reset
參數,在按住 RESET 鍵後執行下面的命令
1$ st-flash --connect-under-reset erase
2
3---------- old ------------
4# Chip-ID file for F411xC/E
5#
6
7chip_id 0x431
8description F411xC/E
9flash_type 3
10flash_size_reg 0x1fff7a22
11flash_pagesize 0x4000
12sram_size 0x20000
13bootrom_base 0x1fff0000
14bootrom_size 0x7800
15option_base 0x0
16option_size 0x0
17flags 2
18
19---------- new ------------
20# Chip-ID file for F411xC/E
21#
22chip_id 0x431
23description F411xC/E
24flash_type 3
25flash_size_reg 0x0
26flash_pagesize 0x4000
27sram_size 0x20000
28bootrom_base 0x1fff0000
29bootrom_size 0x7800
30option_base 0x0
31option_size 0x0
32flags 2
33
34Found 1 stlink programmers
35 version: V2J27S15
36 serial: 066EFF505256656767214523
37 flash: 0 (pagesize: 16384)
38 sram: 131072
39 chipid: 0x0431
40---------- old ------------
41# Chip-ID file for F411xC/E
42#
43
44chip_id 0x431
45description F411xC/E
46flash_type 3
47flash_size_reg 0x1fff7a22
48flash_pagesize 0x4000
49sram_size 0x20000
50bootrom_base 0x1fff0000
51bootrom_size 0x7800
52option_base 0x0
53option_size 0x0
54flags 2
55
56---------- new ------------
57# Chip-ID file for F411xC/E
58#
59
60chip_id 0x431
61description F411xC/E
62flash_type 3
63flash_size_reg 0x0
64flash_pagesize 0x4000
65sram_size 0x20000
66bootrom_base 0x1fff0000
67bootrom_size 0x7800
68option_base 0x0
69option_size 0x0
70flags 2
71
72 descr: F411xC/E
在出現 Mass erasing
後, 不能立即斷電,需要等待一小段時間,之後用 st-info --probe
檢查是否成功,如果還顯示 Failed to enter SWD mode
,就再重複一遍上面的操作.
如果 st-info --probe
能直接檢測到晶片,就說明 SWD 功能已經恢復。
參考資料 # 解決OpenOCD燒錄STM32失敗, 無法通過SWD連線的問題