以 connect-under-reset 參數解決 ST-Link SWD 連接問題

如果在程式碼中,不小心將 PA13PA14 的 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 的串列埠除錯功能,都會導致後續燒錄和連線失敗

首先檢查一下系統中是否有 st-flash 和 st-info 命令,沒有的話需要安裝。試試看透過系統的套件管理程式 yumapt 安裝 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-flashst-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連線的問題