9250|4

39

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

使用ST-LINK对GD32F150C6T6 MCU进行Flash编程 [复制链接]

本帖最后由 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论坛

最新回复

好哒  期待着   详情 回复 发表于 2017-1-20 13:34
点赞 关注(1)
个人签名欢迎访问 https://www.brobwind.com
 

回复
举报

2万

帖子

74

TA的资源

管理员

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

呵呵 感谢分享
此帖出自stm32/stm8论坛
加EE小助手好友,
入技术交流群
EE服务号
精彩活动e手掌握
EE订阅号
热门资讯e网打尽
聚焦汽车电子软硬件开发
认真关注技术本身

点评

哈哈,我心情很好的时候也会发帖喔 此帖只为下一帖做铺垫,敬请期待~  详情 回复 发表于 2017-1-20 12:36
 
个人签名

加油!在电子行业默默贡献自己的力量!:)

 

回复

39

帖子

0

TA的资源

一粒金砂(中级)

板凳
 
soso 发表于 2017-1-20 09:58
那我是希望你心情爽呢,还是不爽呢,

呵呵 感谢分享

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

点评

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

回复

2万

帖子

74

TA的资源

管理员

4
 
phope2000 发表于 2017-1-20 12:36
哈哈,我心情很好的时候也会发帖喔
此帖只为下一帖做铺垫,敬请期待~

好哒  期待着
此帖出自stm32/stm8论坛
加EE小助手好友,
入技术交流群
EE服务号
精彩活动e手掌握
EE订阅号
热门资讯e网打尽
聚焦汽车电子软硬件开发
认真关注技术本身
 
个人签名

加油!在电子行业默默贡献自己的力量!:)

 
 

回复

39

帖子

0

TA的资源

一粒金砂(中级)

5
个人签名欢迎访问 https://www.brobwind.com
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表