[原创] 使用ST-LINK对GD32F150C6T6 MCU进行Flash编程

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

回复评论 (4)

那我是希望你心情爽呢,还是不爽呢,

呵呵 感谢分享
加油!在电子行业默默贡献自己的力量!:)
点赞  2017-1-20 09:58
引用: soso 发表于 2017-1-20 09:58
那我是希望你心情爽呢,还是不爽呢,

呵呵 感谢分享

哈哈,我心情很好的时候也会发帖喔
此帖只为下一帖做铺垫,敬请期待~
欢迎访问 https://www.brobwind.com
点赞  2017-1-20 12:36
引用: phope2000 发表于 2017-1-20 12:36
哈哈,我心情很好的时候也会发帖喔
此帖只为下一帖做铺垫,敬请期待~

好哒  期待着
加油!在电子行业默默贡献自己的力量!:)
点赞  2017-1-20 13:34
欢迎访问 https://www.brobwind.com
点赞  2017-2-4 04:46
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复