在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盘。
2 连接好接线,使用SWD协议,只需接GND、SWCLK、SWDIO、3V3 四根信号线,如图所示
3 下载仓库 https://github.com/wuxx/openocd-toolbox,里面已经配置好环境和脚本,无需安装,可直接下载压缩包,或者git clone均可。
所有的环境和操作脚本无需安装,下载即可用,青山已经为大家准备好,全程只需双击便可完成所有操作。
各个脚本的功能如其名所述,分别可以对芯片进行挂接attach,对flash进行读写,擦除,以及加上读保护和接触读保护。
顺便说一句,attach这个词还是很形象的,debug接入之后,我们就像趴在CPU的后背上一样,可以对任意CPU寄存器、外设寄存器、任意内存地址空间进行访问,就像一个CPU背后的“幽灵”,所有CPU能完成的操作,我们都能通过控制CPU完成,实际上flash的烧写也是如此:首先通过SWD接口将烧写的汇编代码和数据写入到RAM中,然后令CPU的PC指针指向烧写的汇编代码执行,将本次的数据写入到flash中,由于RAM空间一般来说都很有限,所以CPU执行完本次烧写后,会进入halt状态,等待下一次SWD传输将数据写入到RAM中再次启动进行烧写下一批数据。
4 为确认仿真器能否探测到芯片,双击attach.bat。如图所示,已经检测出目标芯片的ID和相关信息。
5 关闭掉刚打开的attach.bat,双击flash_write.bat,此命令会将当前目录下的flash_image.bin写入到目标芯片中,我们这里已经提前生成好了一个128KB的测试镜像
可以看到,128KB的镜像已经成功写入了。另外也可以看到DAPLink的烧录速度在31KB/s,这个速度还是比较不错的,我之前在树莓派上使用openocd配合底层GPIO操作SWD协议,也差不多只有这个速度,这应该已经达到stm32 flash的编程速度极限了。
6 双击flash_dump.bat,导出刚写入的镜像
7 简单做个hash校验
原理解析
以上我们使用了DAPLink + openocd来对芯片进行flash的访问,这是一般的IDE如Keil、IAR无法实现的操作,Keil 或者IAR这些IDE更加不可能认为你的C8T6有128KB flash,因为flash size大小是这样决定的,以下摘自openocd源码
openocd提供了一个flash bank的配置,可以让你主动告知openocd芯片的大小,访问后64KB的关键在于脚本中flash bank的配置。
如上,我们只需在外部脚本配置好传入 _FLASH_SIZE,即可强行指定flash的大小。
警告
- C8T6后64KB flash出厂时并未经过测试,可能存在一些良率问题,量产时请慎用。
- 已经发现若向C8T6后64KB写入之后,若加上读保护,则永远无法解除读保护。这意味着整个flash将无法读出或者写入。所以需要加上读保护的朋友请谨慎操作,一旦使用后64KB flash,若加上读保护,你的程序将永远无法再次更改!