keil debug如何在watch直接修改变量值_ST福利:如何使用STM32F103C8T6的后64KB flash

cacd8450345c204629672bd37182e20e.png

在STM32F103系列芯片中, C8T6 和CBT6均为LQFP48封装,而且差异仅为flash大小区别,C8T6为64KB,CBT6为128KB。

然而,虽然C8T6的datasheet中标称为64KB,实际上C8T6和CBT6由同一片die封装而成,详见

ST给我们的福利:用上 stm32f103c8t6 内部第二个64k flash

这意味C8T6实际上拥有128KB的flash 容量,所以通过一些方法,完全可以将C8T6的后64KB利用起来。

以下是一个简单的操作指导(真的很简单,全程只需要双击脚本,不是双击这个,就是双击那个)以及原理解析。

(评论区已出现更简单的方法:在芯片选择时直接选择芯片为CBT6即可,实测确实可以正常烧录,看来Keil并未根据datasheet做flash区间保护。本文作为openocd + DAPLink读写flash的操作教程,仍然具有一定参考价值,故此保留。)

操作步骤

1 插入DAPLink仿真器,插入之后,正常情况下会出现虚拟串口和名为DAPLink的U盘。

f0664d44a3307483bf091ef4104e0be0.png
无需安装驱动即可使用的虚拟串口

fead703d6eeffde46f176a62ada4c139.png
U盘可用于拖拽下载

2 连接好接线,使用SWD协议,只需接GND、SWCLK、SWDIO、3V3 四根信号线,如图所示

ee41c2eaddb4bcab2b20050770ae142d.png

e735a8a8ec4a2b7992f061a917a56ede.png
DAPLink和一片C8T6最小系统板相连

3 下载仓库 https://github.com/wuxx/openocd-toolbox,里面已经配置好环境和脚本,无需安装,可直接下载压缩包,或者git clone均可。

所有的环境和操作脚本无需安装,下载即可用,青山已经为大家准备好,全程只需双击便可完成所有操作。

13a16168a08a4fdc719a64727abac7c0.png

各个脚本的功能如其名所述,分别可以对芯片进行挂接attach,对flash进行读写,擦除,以及加上读保护和接触读保护。

顺便说一句,attach这个词还是很形象的,debug接入之后,我们就像趴在CPU的后背上一样,可以对任意CPU寄存器、外设寄存器、任意内存地址空间进行访问,就像一个CPU背后的“幽灵”,所有CPU能完成的操作,我们都能通过控制CPU完成,实际上flash的烧写也是如此:首先通过SWD接口将烧写的汇编代码和数据写入到RAM中,然后令CPU的PC指针指向烧写的汇编代码执行,将本次的数据写入到flash中,由于RAM空间一般来说都很有限,所以CPU执行完本次烧写后,会进入halt状态,等待下一次SWD传输将数据写入到RAM中再次启动进行烧写下一批数据。

4 为确认仿真器能否探测到芯片,双击attach.bat。如图所示,已经检测出目标芯片的ID和相关信息。

f5f0c286e6dba06ad867b5a75b8ffd2b.png

5 关闭掉刚打开的attach.bat,双击flash_write.bat,此命令会将当前目录下的flash_image.bin写入到目标芯片中,我们这里已经提前生成好了一个128KB的测试镜像

e07c1d8eafa79b840ba8c242726499dd.png
(PS:所有的脚本内就是一条openocd命令,镜像的名字也可改成变量在DOS命令行中配置,对bat脚本编程实在提不起兴趣,bat脚本甚至无法像linux一样,用 连接同一行!害的我的命令写的老长了,感兴趣的朋友自行修改优化吧)

78e2d38105c5456bed3e1560bc5d44e0.png
写入成功

可以看到,128KB的镜像已经成功写入了。另外也可以看到DAPLink的烧录速度在31KB/s,这个速度还是比较不错的,我之前在树莓派上使用openocd配合底层GPIO操作SWD协议,也差不多只有这个速度,这应该已经达到stm32 flash的编程速度极限了。

6 双击flash_dump.bat,导出刚写入的镜像

7abd96cc05dbe42a2903725bfa59f178.png
读的速度比写的速度要快一些

0b820bdb5ff1e4afd91ebfe672e70510.png
读出的镜像,也是128KB大小

7 简单做个hash校验

eb0f9d8e263de70b83f228b288c13aeb.png
hash一致,证明写入的镜像是没问题的

原理解析

以上我们使用了DAPLink + openocd来对芯片进行flash的访问,这是一般的IDE如Keil、IAR无法实现的操作,Keil 或者IAR这些IDE更加不可能认为你的C8T6有128KB flash,因为flash size大小是这样决定的,以下摘自openocd源码

22496ca2fc318e1e0e15c03d4420020e.png
stm32的flash大小从某个特定的寄存器中读出

openocd提供了一个flash bank的配置,可以让你主动告知openocd芯片的大小,访问后64KB的关键在于脚本中flash bank的配置。

aab7fb326f25add55b90efd3ebb0b80a.png
通过配置FLASH_SIZE可以主动告知openocd真正的flash大小

如上,我们只需在外部脚本配置好传入 _FLASH_SIZE,即可强行指定flash的大小。

9ca8ff4d6590f0c6b4a8a3b5b375309e.png

警告

  1. C8T6后64KB flash出厂时并未经过测试,可能存在一些良率问题,量产时请慎用。
  2. 已经发现若向C8T6后64KB写入之后,若加上读保护,则永远无法解除读保护。这意味着整个flash将无法读出或者写入。所以需要加上读保护的朋友请谨慎操作,一旦使用后64KB flash,若加上读保护,你的程序将永远无法再次更改
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值