一 序:
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程序)
- #define LED1 LED_BUILTIN
- void setup() {
- // put your setup code here, to run once:
- pinMode(LED1,OUTPUT);
- Serial.begin(115200);
- for (uint16_t i = 0; i < 0x8000; i++) {
- Serial.write(i & 0xff); //out low byte
- Serial.write((i >> 8) & 0xff); //out high 8 bit
- }
- }
- void loop() {
- // put your main code here, to run repeatedly:
- digitalToggle(LED1);
- delay(500);
- }
程序 简单的依次从串口输出0x0000~0x7fff(低位在前,高位在后),在pc上将接收的数据保存为一个*.bin文件;
将这个文件用jlink 烧入地址 0x8010000开始的flahs中;
然后,再写个验证程序:
- #define LED1 LED_BUILTIN
- #define EXT_FLASH_BASE ((uint32_t)(0x8010000))
- #define p ((uint16_t *) EXT_FLASH_BASE)
- void setup() {
- // put your setup code here, to run once:
- pinMode(LED1, OUTPUT);
- Serial.begin(115200);
- }
- void loop() {
- // put your main code here, to run repeatedly:
- uint8_t j = 0;
- for (volatile uint16_t i = 0; i < 0x8000; i++) {
- Serial << _HEX(p[i]) << " ";
- j++;
- if (j == 16) {
- j = 0;
- Serial << "\n";
- }
- delay(1000);
- digitalToggle(LED1);
- }
该程序从地址 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结束地址以后的内容,你肯定有收获的;
2017.8.28 修正文字错误。
[ 此帖被huaweiwx在2017-08-28 10:33重新编辑 ]