Вроде накопал зацепку. Что имею: Работает только в режиме отладки. Заливка прошивки "релиз" без отладчика не работает, контроллер на Reset не реагирует, сигнал на отладочном выводе не появляется.
Самого факта подключения, прошивки и начала отладки добился с большим трудом. Может, что-то осталось не в порядке, см. следующий пункт.
Долго не удавалось найти комбинацию GDB-OpenOCD, дающую исполнение кода в отладке. Заработал только режим GDB, пришлось собрать свой v8.3, в связке с самособранным же OpenOCD. Режим "Remote target", GDB connection string: | openocd --pipe -f interface/cmsis-dap.cfg -c "transport select swd" -f target/stm32f1x.cfg
Несмотря на то, что отладка заработала, осталась странность. Вместо того, чтобы выходить сразу на main() и останавливаться там, отладчик останавливался на странных адресах. И лишь после нажатия "Resume" попадал на штатную точку останова main(). См. лог OpenOCD ниже.
В попытке найти адрес вектора Reset и куда он программируется, наткнулся на журнал OpenOCD. А в нём - адрес msp очень похожий на адрес места, где происходит коллизия нормально расположенных данных с ненормально расположенным стеком.
Вот лог нештатного останова при старте отладки:
Warn : deprecated option: -p/--pipe. Use '-c "gdb_port pipe; log_output openocd.log"' instead.
swd
Info : Listening on port 6666 for tcl connections
Info : Listening on port 4444 for telnet connections
Info : CMSIS-DAP: SWD Supported
Info : CMSIS-DAP: JTAG Supported
Info : CMSIS-DAP: FW Version = 1.10
Info : CMSIS-DAP: Interface Initialised (SWD)
Info : SWCLK/TCK = 0 SWDIO/TMS = 1 TDI = 0 TDO = 1 nTRST = 0 nRESET = 0
Info : CMSIS-DAP: Interface ready
Info : clock speed 1000 kHz
Info : SWD DPIDR 0x1ba01477
Info : stm32f1x.cpu: hardware has 6 breakpoints, 4 watchpoints
Info : accepting 'gdb' connection from pipe
Info : device id = 0x10016418
Info : flash size = 256kbytes
undefined debug reason 8 - target needs reset
target halted due to debug-request, current mode: Thread
xPSR: 0x01000000 pc: 0x1fffe9c0 msp: 0x20000ff0
target halted due to debug-request, current mode: Thread
xPSR: 0x01000000 pc: 0x1fffe9c0 msp: 0x20000ff0
Жму "Resume". Штатный останов в main(). В логе новых записей не появляется. Жму Resume ещё раз, чтобы выполнить программу. Прогамма работает, потом сбоит. При сбое появляется продолжение лога:
Error: stm32f1x.cpu -- clearing lockup after double fault
Polling target stm32f1x.cpu failed, trying to reexamine
Info : stm32f1x.cpu: hardware has 6 breakpoints, 4 watchpoints
Info : SWD DPIDR 0x1ba01477
Error: Failed to read memory at 0x06ad4714
Info : SWD DPIDR 0x1ba01477
Error: Failed to read memory at 0x06ad4704
Info : SWD DPIDR 0x1ba01477
Error: Failed to read memory at 0x0000ffc4
Info : SWD DPIDR 0x1ba01477
Error: Failed to read memory at 0x07cdfffc
Info : SWD DPIDR 0x1ba01477
Error: Failed to read memory at 0x07cdfffa
IDE показывает картинку: