社区导航

 
快捷导航
  • 首页
  • 论坛
  • 查看新帖
  • 最新回复
  • 社区活动
  • 联系管理员
  • 消灭零回复
  • E金币兑换
  • 干货
搜索
查看: 2728|回复: 4

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

[复制链接]

43

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

发表于 2017-1-19 23:06:47 | 显示全部楼层 |阅读模式
本帖最后由 phope2000 于 2017-1-20 12:34 编辑

今天心情不爽,发个帖子解解闷

  • 写在最前

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;
  15.         
复制代码

这里可以看到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
复制代码



此帖出自stm32/stm8论坛
欢迎访问 https://www.brobwind.com


回复

使用道具 举报

2万

TA的帖子

74

TA的资源

管理员

Rank: 13Rank: 13Rank: 13Rank: 13

发表于 2017-1-20 09:58:39 | 显示全部楼层
那我是希望你心情爽呢,还是不爽呢,

呵呵 感谢分享

点评

哈哈,我心情很好的时候也会发帖喔 此帖只为下一帖做铺垫,敬请期待~  详情 回复 发表于 2017-1-20 12:36
2017,加油!继续为中国电子行业做出小小的贡献吧!
QQ 1206973913


回复

使用道具 举报

43

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

 楼主| 发表于 2017-1-20 12:36:51 | 显示全部楼层
soso 发表于 2017-1-20 09:58
那我是希望你心情爽呢,还是不爽呢,

呵呵 感谢分享

哈哈,我心情很好的时候也会发帖喔
此帖只为下一帖做铺垫,敬请期待~

点评

好哒 期待着  详情 回复 发表于 2017-1-20 13:34
欢迎访问 https://www.brobwind.com


回复

使用道具 举报

2万

TA的帖子

74

TA的资源

管理员

Rank: 13Rank: 13Rank: 13Rank: 13

发表于 2017-1-20 13:34:30 | 显示全部楼层
phope2000 发表于 2017-1-20 12:36
哈哈,我心情很好的时候也会发帖喔
此帖只为下一帖做铺垫,敬请期待~

好哒  期待着
2017,加油!继续为中国电子行业做出小小的贡献吧!
QQ 1206973913


回复

使用道具 举报

43

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

 楼主| 发表于 2017-2-4 04:46:00 | 显示全部楼层
欢迎访问 https://www.brobwind.com


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

  • 论坛活动 E手掌握

    扫码关注
    EEWORLD 官方微信

  • EE福利  唾手可得

    扫码关注
    EE福利 唾手可得

小黑屋|手机版|Archiver|电子工程世界 ( 京ICP证 060456

GMT+8, 2018-2-21 19:15 , Processed in 0.146340 second(s), 16 queries , Redis On.

快速回复 返回顶部 返回列表