切换到宽版
  • 35964阅读
  • 60回复

[ARM]ST给我们的福利:用上 stm32f103c8t6 内部第二个64k flash [复制链接]

上一主题 下一主题
离线huaweiwx
 

发帖
1285
M币
3526
专家
57
粉丝
245
只看楼主 倒序阅读 我要置顶 楼主  发表于: 2017-08-28
一 序:
    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.   for (uint16_t i = 0; i < 0x8000; i++) {
  7.     Serial.write(i & 0xff);      //out low byte
  8.     Serial.write((i >> 8) & 0xff); //out high 8 bit
  9.   }
  10. }
  11. void loop() {
  12.   // put your main code here, to run repeatedly:
  13.   digitalToggle(LED1);
  14.   delay(500);
  15. }
程序 简单的依次从串口输出0x0000~0x7fff(低位在前,高位在后),在pc上将接收的数据保存为一个*.bin文件;
将这个文件用jlink 烧入地址 0x8010000开始的flahs中;
然后,再写个验证程序:
  1. #define LED1 LED_BUILTIN
  2. #define EXT_FLASH_BASE ((uint32_t)(0x8010000))
  3. #define p  ((uint16_t *) EXT_FLASH_BASE)
  4. void setup() {
  5.   // put your setup code here, to run once:
  6.   pinMode(LED1, OUTPUT);
  7.   Serial.begin(115200);
  8. }
  9. void loop() {
  10.   // put your main code here, to run repeatedly:
  11.   uint8_t j = 0;
  12.   for (volatile uint16_t i = 0; i < 0x8000; i++) {
  13.     Serial << _HEX(p[i]) << " ";
  14.     j++;
  15.     if (j == 16) {
  16.       j = 0;
  17.       Serial << "\n";
  18.   }
  19.   delay(1000);
  20.   digitalToggle(LED1);
  21. }

该程序从地址 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重新编辑 ]
本文内容包含图片或附件,获取更多资讯,请 登录 后查看;或者 注册 成为会员获得更多权限
本帖最近打赏记录:共11条打赏M币+160专家+1
12
离线ifm

发帖
119
M币
3431
专家
19
粉丝
53
只看该作者 1楼 发表于: 2017-08-28
厉害了,谢谢分享,我明天试试
本帖最近打赏记录:共1条打赏M币+20
离线kiiir00t

发帖
1872
M币
1770
专家
3
粉丝
75
只看该作者 2楼 发表于: 2017-08-28
厉害了我的哥····手里有几个板子  明天跑一跑
本帖最近打赏记录:共1条打赏M币+13
离线huaweiwx

发帖
1285
M币
3526
专家
57
粉丝
245
只看该作者 3楼 发表于: 2017-08-28
四  用我提供的那个程序做的验证bin文件,可以检查读出内容的正确性,事实上烧写时可以带上验证的;如仅想简单看看该区域能写入并永久保存,可简单些,准备个小于64k的文本文件,更名为*. bin文件,然后烧入;
这样读出程序也改为直接输出字符:
  1. for (volatile uint16_t i = 0; i < 0x8000; i++) {
  2.    Serial.write(p[i]);
  3. }

看见结果是否就是你那个原始文本文件的内容。


[ 此帖被huaweiwx在2017-08-28 11:31重新编辑 ]
离线2545889167

发帖
12823
M币
15625
专家
288
粉丝
4680
只看该作者 4楼 发表于: 2017-08-28
这玩意似乎是大家心知肚明的东西了。
这东西应该是厂商的一种市场策略。
stm32f101/102/103整个系列应该就只有三款晶元,标一堆型号出来就是为了区分市场定位。小容量 32K+10K 中容量128k+20k 大容量512K+64K
STM32F103RC标称256kflash+48KRAM,STM32F103RD标称384kflash+48KRAM,实际上和STM32F103RE一样是512K+64K
STM32F103C8和STM32F103CB都是128K+20K
stm32f101c8标称没有USB,且只能运行在36MHZ,但淘宝上大多数山寨stlink照样使用101c8做主控,用了usb 还吧频率运行在72mhz,和103c8没啥两样

STM32F030f4标称16K+4K实际上是32K+4K
stm8s003 eeprom标称128b和stm8s103实际上也是一样的 640b
stm8s005和stm8s105同理
stm8l052手册没说有DAC实际上和stm8l152一样有DAC
本帖最近打赏记录:共5条打赏M币+64
p
离线亚历山大

发帖
2452
M币
9387
专家
40
粉丝
89
只看该作者 5楼 发表于: 2017-08-28
俺不懂单片机,但是这必须顶。
本帖最近打赏记录:共2条打赏M币+20
离线play51mcu

发帖
171
M币
-174
专家
0
粉丝
11
只看该作者 6楼 发表于: 2017-08-28
好贴,好贴,不顶不行
本帖最近打赏记录:共1条打赏M币+13
离线play51mcu

发帖
171
M币
-174
专家
0
粉丝
11
只看该作者 7楼 发表于: 2017-08-28
这么好的帖子,再顶
离线cao57508

发帖
2211
M币
4240
专家
9
粉丝
81
只看该作者 8楼 发表于: 2017-08-28
谢谢分享,st的人哭晕在厕所里了。
本帖最近打赏记录:共1条打赏M币+13
离线守夜人

发帖
3815
M币
471
专家
4
粉丝
290
只看该作者 9楼 发表于: 2017-08-28
策略很有可能,有没有可能屏蔽那一部分是有问题的,就像CPU那样,生产四核芯的CPU,一个核心有制造缺陷,出厂就标三核CPU,坏两个就标双核的,坏三个就标酷睿E430之类的单核CPU呢???
本帖最近打赏记录:共1条打赏M币+13
如果我的回复对你有帮助,请你在获得帮助的同时也回报给我一点点M币,谢谢。