一 序:
1 STM32F103C8T6和STM32F103CBT6 引脚相同,唯一的区别是前者为64kflash(0x8000000~0x800FFFF) 后者为128kflash(0x8000000~0x801FFFF);
2 已经发现STM32Ff103C8T6 在 00x8010000~0x801FFFF是可读写的;
二 ST 技术人员对此回答:
STM32F103C8T6和STM32F103CBT6 是在同一圆晶上制造的,但测试时,只测试手册提供的参数范围所包含的内容,也就意味这 STM32F103C8T6也是128k Flash,只不过只测试了前面64k,然后打上 STM32F103C8T6标注(当然内部就写上 C8T6 的 ID);
三 简单测试;
1 用stlink连接板子, 在STM32 STLINK UTILITY中将 size 由 0x10000 改为 0x20000 并连接,可见后面64Kflash能全部读出,然而修改数值后不能写入,估计是stlink会检查ID并拒绝写入超出该型号地址范围外的flash;
2 但在jlink中,只要将型号选为STM32F103CBT6,就能读写后面的64kflash了。
四 验证:
先准备个大小为64k的二进制文件bin,内容为 uint16_t 0x0000~0x7FFF;
该数据文件我是这样做的:(arduino程序)
复制代码
1.#define LED1 LED_BUILTIN
2.void setup() {
3. // put your setup code here, to run once:
4. pinMode(LED1,OUTPUT);
5. Serial.begin(115200);
6.
7. for (uint16_t i = 0; i < 0x8000; i++) {
8. Serial.write(i & 0xff); //out low byte
9. Serial.write((i >> 8) & 0xff); //out high 8 bit
10. }
11.}
12.
13.void loop() {
14. // put your main code here, to run repeatedly:
15. digitalToggle(LED1);
16. delay(500);
17.}
程序 简单的依次从串口输出0x0000~0x7fff(低位在前,高位在后),在pc上将接收的数据保存为一个*.bin文件;
将这个文件用jlink 烧入地址 0x8010000开始的flahs中;
然后,再写个验证程序:
复制代码
1.#define LED1 LED_BUILTIN
2.
3.#define EXT_FLASH_BASE ((uint32_t)(0x8010000))
4.#define p ((uint16_t *) EXT_FLASH_BASE)
5.
6.void setup() {
7. // put your setup code here, to run once:
8. pinMode(LED1, OUTPUT);
9. Serial.begin(115200);
10.}
11.
12.void loop() {
13. // put your main code here, to run repeatedly:
14. uint8_t j = 0;
15. for (volatile uint16_t i = 0; i < 0x8000; i++) {
16. Serial << _HEX(p[i]) << " ";
17. j++;
18. if (j == 16) {
19. j = 0;
20. Serial << “\n”;
21. }
22. delay(1000);
23. digitalToggle(LED1);
24.}
该程序从地址 0x8010000 开始按uint_16 读取数据并从串口输出,每16个数据换新行,重复输出,这是运行中的截图:
经验证,在程序中,该区域flash也是可读写的,如读取,则和从sram读是一样方便的,只要用指针指向需读取数据的地址即可;
现在,STM32F103C8T6可用的Flash扩大了一倍,这是ST公司给我们的福利,真的太好了,不用也是浪费了,这个区域可写上个常用汉字库或图片,我们可以扔掉外部的spi flash了!还可模拟个64K EEPROM(ST有现成的应用示例代码,arduino中有现成的库)或直接在arduino中当成CBT6用;
小秘密: STM32F101C8T6 和 STM32F103C8T6 ,前者没有USB,只是ST出厂是没有测试这一部分,其实完全可以当成和STM32F103CBT6用;
STM32F103VCT6 和 STM32F103VET6,也是如此,你完全可以使用后面的256k flash !
STM32F030F4P6 可以用32Kflash
这就是为什么ST公司产品中的stlink ob 都是用 STM32F103CBT6做到,而山寨的stlink ob基本都用 C8T6;
当然,ST没测试,你就需要测试一下了,业余玩玩完全可以,做产品当然就不推荐了,因为毕竟没做各种读写的可靠性的测试;
大家可以对其他型号,测试一下看看能否在读出手册Flash结束地址以后的内容,你肯定有收获的;