今天心情不爽,发个帖子解解闷
1. GD32系列MCU与STM32系列很相似,所以就发这里了。
2. 编程器使用的是ST-LINK/V2-1当然,当然使用ST-LINK/V2也可以,在执行命令的时候需作相应的修改。
3. 编程通信接口使用的是SWD
4. 编程使用的是*nix环境,编程软件使用的是OpenOCD
- #! /bin/bash
- set -x
-
- OCD=/usr/local/bin/openocd
-
- ${OCD} -f interface/stlink-v2-1.cfg -f target/stm32f1x.cfg -c init -c 'reset halt' \
- -c 'mdb 0x1ffff800 12' -c 'sleep 100' \
- -c 'mww 0x40022004 0x45670123' -c 'sleep 100' -c 'mww 0x40022004 0xcdef89ab' -c 'sleep 100' \
- -c 'mww 0x40022008 0x45670123' -c 'sleep 100' -c 'mww 0x40022008 0xcdef89ab' -c 'sleep 100' \
- -c 'mww 0x40022010 0x00000260' -c 'sleep 100' \
- -c 'mww 0x40022010 0x00000210' -c 'sleep 100' \
- -c 'mwh 0x1ffff800 0x5aa5' -c 'sleep 100' -c 'shutdown'
-
- ${OCD} -f interface/stlink-v2-1.cfg -f target/stm32f1x.cfg -c init -c 'reset halt' \
- -c 'mdb 0x1ffff800 12' -c 'sleep 100' \
- -c 'mww 0x40022004 0x45670123' -c 'sleep 100' -c 'mww 0x40022004 0xcdef89ab' -c 'sleep 100' \
- -c 'mww 0x40022008 0x45670123' -c 'sleep 100' -c 'mww 0x40022008 0xcdef89ab' -c 'sleep 100' \
- -c 'mww 0x40022010 0x00000210' -c 'sleep 100' \
- \
- -c 'mwh 0x1ffff802 0xff00' -c 'sleep 100' \
- -c 'mwh 0x1ffff804 0xff00' -c 'sleep 100' -c 'mwh 0x1ffff806 0xff00' -c 'sleep 100' \
- -c 'mwh 0x1ffff808 0x00ff' -c 'sleep 100' -c 'mwh 0x1ffff80a 0x00ff' -c 'sleep 100' \
- -c 'mww 0x40022010 0x00000080' -c 'sleep 100' \
- -c 'mdb 0x1ffff800 12' \
- -c 'mdw 0x4002201c 1' -c 'shutdown'
Note:
1. 可以看到使用的是shell脚本,操作系统使用的是*nix。
2. 第一个命令去除的是芯片的读保护,第二个命令去除芯片写保护。
3. 从我这边实际的操作来看,在MCU掉电之后,会自动加读保护。
可以通过如下命令进行擦除:
- $ /usr/local/bin/openocd -f interface/stlink-v2-1.cfg -f target/stm32f1x.cfg -c init -c 'reset halt' -c 'flash erase_sector 0 0 31' -c shutdown
这里我为了省事当Flash中的所有数据都擦除了(Flash有32KiB, 32个sector)。
直接使用openocd的"flash write_image"命令会失败,我这边的情况是可以写入十几KiB的数据。目前还没有发现很好的方法可以解决,这里需要通过修改openocd的代码才能解决。
openocd相关的代码请看这里:
http://repo.or.cz/openocd.git/blob/1edc019f0226fceba7a58b35551adee57a9c6eac:/src/flash/nor/stm32f1x.c#l693
- 739 /* try using a block write */
- 740 retval = stm32x_write_block(bank, buffer, offset, words_remaining);
- 741
- 742 if (retval == ERROR_TARGET_RESOURCE_NOT_AVAILABLE) {
- 743 /* if block write failed (no sufficient working area),
- 744 * we use normal (slow) single halfword accesses */
- 745 LOG_WARNING("couldn't use block writes, falling back to single memory accesses");
- 746
- 747 while (words_remaining > 0) {
- 748 uint16_t value;
- 749 memcpy(&value, buffer, sizeof(uint16_t));
- 750
- 751 retval = target_write_u16(target, bank->base + offset, value);
- 752 if (retval != ERROR_OK)
- 753 goto reset_pg_and_lock;
- 754
- 755 retval = stm32x_wait_status_busy(bank, 5);
- 756 if (retval != ERROR_OK)
- 757 goto reset_pg_and_lock;
- 758
- 759 words_remaining--;
- 760 buffer += 2;
- 761 offset += 2;
- 762 }
- 763 }
需要将上面这段替换成如下:
- while (words_remaining > 0) {
- uint32_t value;
- memcpy(&value, buffer, sizeof(uint32_t));
-
- retval = target_write_u32(target, bank->base + offset, value);
- if (retval != ERROR_OK) {
- goto reset_pg_and_lock;
- }
-
- retval = stm32x_wait_status_busy(bank, 100);
- if (retval != ERROR_OK) {
- goto reset_pg_and_lock;
- }
-
- words_remaining -= 2;
- buffer += 4;
- offset += 4;
-
这里可以看到GD32不支持block write(其实是使用block write写入的数据不完整,会失败,也就是默认的写入方式),并且也不支持16-bit方式写入,一次需要写入32-bit数据。
修改完代码,编译之后,就可以通过如下命令进行flash编程:
- $ openocd -f interface/stlink-v2-1.cfg -f target/stm32f1x.cfg -c init -c 'reset halt' -c 'flash write_image build/ch.bin 0x08000000 bin' -c shutdown
Note:
build/ch.bin是要写入的文件,bin格式。
执行完之后,还可以通过如下命令对flash中的数据进行校验:
- $ openocd -f interface/stlink-v2-1.cfg -f target/stm32f1x.cfg -c init -c "reset halt" -c "verify_image build/ch.bin 0x08000000 bin" -c "reset run" -c shutdown
- Open On-Chip Debugger 0.10.0-dev-00288-g060e9c3 (2016-05-14-22:52)
- Licensed under GNU GPL v2
- For bug reports, read
- [url=http://openocd.org/doc/doxygen/bugs.html]http://openocd.org/doc/doxygen/bugs.html[/url]
- Info : auto-selecting first available session transport "hla_swd". To override use 'transport select <transport>'.
- Info : The selected transport took over low-level target control. The results might differ compared to plain JTAG/SWD
- adapter speed: 4000 kHz
- adapter_nsrst_delay: 100
- none separate
- Info : clock speed 4000 kHz
- Info : STLINK v2 JTAG v27 API v2 SWIM v15 VID 0x0483 PID 0x374B
- Info : using stlink api v2
- Info : Target voltage: 0.006291
- Error: target voltage may be too low for reliable debugging
- Info : stm32f1x.cpu: hardware has 6 breakpoints, 4 watchpoints
- stm32f1x.cpu: target state: halted
- target halted due to debug-request, current mode: Thread
- xPSR: 0x01000000 pc: 0x08000180 msp: 0x20000400
- stm32f1x.cpu: target state: halted
- target halted due to breakpoint, current mode: Thread
- xPSR: 0x61000000 pc: 0x2000002e msp: 0x20000400
- verified 14352 bytes in 0.368509s (38.033 KiB/s)
- shutdown command invoked
本帖最后由 phope2000 于 2017-1-20 12:34 编辑