打印
[51单片机]

STC32 的 EEPROM 设计的真是反人类啊

[复制链接]
4288|45
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
gtbestom|  楼主 | 2023-11-13 15:12 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 gtbestom 于 2023-11-13 15:26 编辑

用过 STM32 的都知道,FLASH 是可以直接读取的,只要给个物理地址就可以

STC 这玩意,从始至终,把 FLASH 读写硬说成 EEPROM 读写,提供的是一个 iap 的读写的代码,iap 读的代码又繁琐效率又低,然后又提供了一个 MOVC 直接读取的方法,用 MOVC 读取就离了个谱,用 iap 写入到一个地址,用 MOVC 读取还得偏移一个地址,地址每个芯片,每种 EEPROM 大小配置,就不一样,无法通用
发展到 STC32 这代,就更离谱了,又不能用 MOVC 了,要用 MOV 读取,还得偏移 0xFE0000 才能读取 iap 写入到 0x000000 地址的数据
今天拿了一片 STC32G8K64 跑 FLASH 读写,原原本本按照手册上读写,死活不行
iap 读,iap 写,是可以的,MOV 读,按照例程来做,啥也不是
后来折腾半天我算明白了,STC32G8K64 根本就不是你们这个 STC32 的逻辑,你们手册就是玩笑呗
我打 STC 技术支持,一个回复我们不支持 EEPROM 读啊,你是要**芯片吗??
转另一个技术支持说,我都用 IAP 读写啊,不用 MOVC,我提醒他 STC32 不用 MOVC,是用 MOV,他说不是啊,语气还怪凶的 ,我让他对一下手册,打脸了,然后让我用 IAP 读,不要用 MOV,白问




为什么说手册是玩笑呢,因为 STC32G8K64 就没按照 STC32 的 FLASH 读逻辑,我测试是用的 STC 8位单片机的逻辑
而且 0xFE0000 和 0xFF0000,这两段读取的结果是一样的
就是读 0xFE0000+addr 和读 0xFF0000+addr 结果一样,就离谱论坛里面的也都是各种错误回答



老老实实按照 STM32 的方法来读写,不行吗?搞了个功能想便利大家,结果搞得什么也不是,不如不搞



使用特权

评论回复
评论
gtbestom 2023-11-14 14:37 回复TA
@cooldog123pp :客户选的,板都做好了 
cooldog123pp 2023-11-14 11:28 回复TA
吐槽那么多,直接换成stm32就行了,干嘛非得stc啊 

相关帖子

沙发
F99343441| | 2023-11-13 19:43 | 只看该作者
"把 FLASH 读写硬说成 EEPROM 读写"
---手册写的是:STC32G系列单片机内部集成了大容量的 EEPROM。利用ISPIAP技术可将内部 Data Flash当EEPROM,擦写次数在10万次以上。EEPROM可分为若干个扇区,每个扇区包含512字节。


另外MOV读取的历程在手册里示例代码,跑下就知道了

使用特权

评论回复
评论
gtbestom 2023-11-14 14:29 回复TA
把内部 Data Flash 当 EEPROM,那说明还是 Flash,不知道为什么要混淆成 EEPROM,能单字节覆写吗? 
板凳
coody| | 2023-11-13 21:21 | 只看该作者
楼主,你贴的是STC32G12K128的EEPROM先关的地址安排,可能技术支持没留意你用的是STC32G8K64,这个用MOV访问时,基地址是0xff0000,不是0xfe0000。你用基地址0xff0000试试。

使用特权

评论回复
评论
gtbestom 2023-11-14 14:32 回复TA
我试过 0xff0000 和 0xfe0000 读出来是一样的数据,问题不在这,问题是烧录软件上设置了 EEPROM 为 0.5K,这个读地址就变了,根本不是固定的地址,这逻辑跟 STC 8 位是一样的,STC32 手册里只字未提 
地板
英雄本色2022| | 2023-11-13 23:56 | 只看该作者
这样做有一个好处就是程序保密性很高,即使开盖拿到代码,不知道EEPROM怎么划分,程序还是跑不起来,前提是不要用IAP读

使用特权

评论回复
5
ayb_ice| | 2023-11-14 10:10 | 只看该作者
多看手册,什么问题都能解决,除非手册写错了

使用特权

评论回复
评论
gtbestom 2023-11-14 14:34 回复TA
手册确实写错了啊,误导开发者 
6
laoxu| | 2023-11-14 10:31 | 只看该作者
EEPROM 还算好, 仔细点, 凑合着能用.

使用特权

评论回复
7
laoxu| | 2023-11-14 10:33 | 只看该作者
最有趣的是  STC8H系列里的硬件乘法器, 速度奇慢.


使用特权

评论回复
8
laoxu| | 2023-11-14 10:34 | 只看该作者
以经典的 int 乘法为例, 硬件乘法(直接使用官方MDU16库) 和 软件乘法 相 PK,  速度差 3倍 .

使用特权

评论回复
9
laoxu| | 2023-11-14 10:34 | 只看该作者
请看 清楚, 是慢 3倍,

使用特权

评论回复
10
alienmiller| | 2023-11-14 13:11 | 只看该作者
32位啊,本人都转为 RISC-V 核心来玩了。其他核心不考虑了。

使用特权

评论回复
评论
gtbestom 2023-11-14 14:38 回复TA
RISC-V 也有用,STC32 本来不考虑,奈何客户已经用上了 
11
chenyong123| | 2023-11-14 16:57 | 只看该作者
stc确实垃圾,客服也很恶心人。我之前用他一片8位的低功耗单片机,他的下载线必须串接电阻和二极管,就很无语,都特么什么年代了,下载口还搞那么复杂,我问技术,他们的技术很不耐烦,好像自己很牛X一样。这种垃圾货,还不如尽早换stm。

使用特权

评论回复
评论
chenyong123 2023-11-21 10:12 回复TA
@F99343441 :另外你说STM没有售后,这个得看你怎么玩,STM原厂一般不会跟小客户对接,但是他们的代理商会认真解决你的问题得。疫情涨价最重要的还是咱们自己这些经销商炒作,STM原厂也涨价,对比国产几家兆易、极海等,算是很遵守市场得厂家了 
chenyong123 2023-11-21 10:05 回复TA
@F99343441 :这个串接二极管和电阻原理都清楚,当时也专门了解了,我是想说既然人家得芯片都不用,为啥他们不直接集成在芯片内部,当时那颗STC8A8K还是低功耗新产品,低功耗产品很多板子集成度很高的,器件排布很密,大家都注重IC封装大小和线路简洁度,我当时跟他们建议,直接集成了多好,他们技术售后很高傲的回答,让人很无语。 
chenyong123 2023-11-21 10:00 回复TA
@ly不好意思,我是想说我当时用的那个低功耗芯片,STC8A8K32没有QFN,本来低功耗MCU用在智能手表类产品上就比较多,这种就需要小封装,但是他们这款低功耗没有,我当时问原厂,态度很不好,最后都放弃了 
F99343441 2023-11-14 21:52 回复TA
串二极管的作用是为了防止给STC单片机冷启动下载程序时,杂牌的USB转TTL芯片通过该引脚将电流倒灌给STC单片机中造成单片机断电不彻底而影响程序下载;如果只做串口通信的话完全不需要这个二极管。 另一个引脚串联个电阻单纯的为了保护端口,有些TTL出来的电压标称3.3,实际误差巨大。其次你说的STM,基本就没有技术支持,疫情的时候涨价涨到天上去了,你真这么喜欢吗 
coody 2023-11-14 17:55 回复TA
@chenyong123 :你没了解过吧?有QFN啊,不少的。 
ly2023 2023-11-14 17:30 回复TA
@chenyong123 :STC早就有QFN封装:DFN8、QFN20、QFN32、QFN48、QFN64 
chenyong123 2023-11-14 16:59 回复TA
而且他的芯片还没QFN封装,只有LQFP,不适合小电子产品使用 
12
coody| | 2023-11-14 17:53 | 只看该作者
laoxu 发表于 2023-11-14 10:33
最有趣的是  STC8H系列里的硬件乘法器, 速度奇慢.

你详细测过吗?我测试是比软件乘法快的,16位x16位,32X32位。

使用特权

评论回复
13
coody| | 2023-11-14 17:55 | 只看该作者
chenyong123 发表于 2023-11-14 16:57
stc确实垃圾,客服也很恶心人。我之前用他一片8位的低功耗单片机,他的下载线必须串接电阻和二极管,就很无 ...

下载线传300R电阻是保护端口的,串二极管是为了防倒灌电流的。

使用特权

评论回复
14
laoxu| | 2023-11-15 05:43 | 只看该作者
coody 发表于 2023-11-14 17:53
你详细测过吗?我测试是比软件乘法快的,16位x16位,32X32位。

当然测试了, 我还编写了 用 MDU16 建立 单精度浮点运算库 呢

也算史上(或许世上) 唯一一个用 MDU16 建立 单精度浮点运算库的人呢

STC8H系列里的  MDU16, 其最大败笔是 参数输入DATA, 放在了 XRAM 区域, 必须通过 DPTR指针才能读写, 拖慢影响了整体性能和速度.

其实, STC8H 的 MDU16, 单从功能上来说, 设计的挺合理的.

使用特权

评论回复
15
laoxu| | 2023-11-15 05:51 | 只看该作者
同样, STC32G12K128 的 MDU32, 我也编写了 单精度浮点运算库, 整体表现良好, 速度提升较多

故, STC8H系列里的MDU16, 推荐 客户不要使用(如要使用请先测试对比一下速度才决定),

当然 , STC8H系列的其他模块, 表现尚可, MDU16的缺陷, 不影响 STC8H系列的整体性能.

使用特权

评论回复
16
coody| | 2023-11-15 10:33 | 只看该作者
本帖最后由 coody 于 2023-11-15 10:54 编辑

STC官方论坛有EEPROM测试例子,实测没问题。搬砖如下:

/*************        本程序功能说明        **************
STC32G系列EEPROM通用测试程序,支持按指定扇区或地址的IAP擦除、写入、读出、用MOV读出等等操作,写入、读出的是64字节的一首古诗.
可以直接下载编译好的"EEPROM-STC32G12K128.hex"或"EEPROM-STC32G8K64.hex"测试. 下载时选择主频11.0592MHZ.
PC串口设置: 波特率115200,8,n,1.

命令例子:
E 0                --> 对EEPROM进行扇区擦除操作,  E表示IAP擦除, 数字0为0扇区(十进制, 0~127, 看具体IC),一个扇区512字节.
W 0                --> 对EEPROM进行写入64字节操作,W表示IAP写入, 数字0为0扇区(十进制, 0~127, 看具体IC). 从扇区的开始地址连续写64字节.
R 0                --> 对EEPROM进行读出64字节操作,R表示IAP读出, 数字0为0扇区(十进制, 0~127, 看具体IC). 从扇区的开始地址连续读64字节.
M 0                --> 对EEPROM进行读出64字节操作,M表示MOV读出, 数字0为0扇区(十进制, 0~127, 看具体IC). 从扇区的开始地址连续读64字节.

E 0x1234        --> 对EEPROM进行扇区擦除操作,  E表示IAP擦除, 0X1234为扇区所在地址,十六进制. 一个扇区512字节,任何一个字节地址均能擦除所在扇区(即地址低9位被忽略)。
W 0x1234        --> 对EEPROM进行写入64字节操作,W表示IAP写入, 0X1234为开始地址,十六进制.
R 0x1234        --> 对EEPROM进行读出64字节操作,R表示IAP读出, 0X1234为开始地址,十六进制.
M 0x1234        --> 对EEPROM进行读出64字节操作,M表示MOV读出, 0X1234为开始地址,十六进制.

注意:为了通用,程序不识别扇区是否有效,用户自己根据具体的型号来决定。

特别提醒:STC32G12K128的EEPROM基地址为0xfe0000,MOV操作EEPROM的地址 = EEPROM地址 + 基地址0xfe0000.
特别提醒:STC32G8K64的EEPROM基地址为0xff0000,但EEROM放在64K的最后面,所以MOV操作EEPROM的地址 = 65536-EEPROM总字节数 + EEPROM地址 + 基地址0xff0000.

根据下面的宏定义来选择STC32G12K128或STC32G8K64的EEPROM操作。

        /********************* 根据型号定义基地址 ****************************/
        #define                EEADDR_OFFSET        0xfe0000        //STC32G12K128,  定义EEPROM用MOV访问时的基地址.

//        #define                EEADDR_OFFSET        0xff0000        //STC32G8K64,  定义EEPROM用MOV访问时的基地址.
        #define                EEPROM_LENGTH        8192                //STC32G8K64,  定义EEPROM长度(字节数),与下载程序时选择的EEPROM长度一致, 1K=1024, 8K=8*1024=8192.

测试结果截图

上传不了附件。

使用特权

评论回复
17
gtbestom|  楼主 | 2023-11-15 11:11 | 只看该作者
coody 发表于 2023-11-15 10:33
STC官方论坛有EEPROM测试例子,实测没问题。搬砖如下:

/*************        本程序功能说明        *** ...

#define                EEADDR_OFFSET        0xfe0000      //STC32G12K128,  定义EEPROM用MOV访问时的基地址
#define                EEADDR_OFFSET        0xff0000      //STC32G8K64,  定义EEPROM用MOV访问时的基地址
#define                EEPROM_LENGTH        8192           //STC32G8K64,  定义EEPROM长度(字节数),与下载程序时选择的EEPROM长度一致, 1K=1024, 8K=8*1024=8192

知道为什么 STC32G12K128 只需要 Flash 基地址,但是 STC32G8K64 还需要 Flash 长度吗?
因为 STC32G8K64 MOV 读不属于手册中 STC32 的逻辑

STC32 的逻辑是,不论烧录时设置 EEPROM 多大,MOV 基地址都是 0xfe0000
STC32G8K64 的逻辑是,MOV 读取的地址是基地址 + 64K - 烧录时设置 EEPROM 的大小

同样是 STC32 芯片,规则不通用就算了,手册也不注明,还得开发者花时间填坑

使用特权

评论回复
18
coody| | 2023-11-15 11:53 | 只看该作者
gtbestom 发表于 2023-11-15 11:11
#define                EEADDR_OFFSET        0xfe0000      //STC32G12K128,  定义EEPROM用MOV访问时的 ...

这应该是STC32G8K64后面出来时,手册没有更新EEPROM内容,我刚才下载最新的手册,已经更新了,STC动作还是很快的。

使用特权

评论回复
评论
gtbestom 2023-11-16 13:55 回复TA
好了,现在看手册已经更新了,STC32G8K64 单独写了一节,大家参考新的手册就好 
19
英雄本色2022| | 2023-11-15 12:47 | 只看该作者
gtbestom 发表于 2023-11-15 11:11
#define                EEADDR_OFFSET        0xfe0000      //STC32G12K128,  定义EEPROM用MOV访问时的 ...

你这理解不对,规则就是MOV读基址都是片内闪存的起始地址,规则是通用的,128K的片内闪存的起始地址是0XFE0000,64K的片内闪存的起始地址是0XFF0000,并且MOV读不需要闪存长度

使用特权

评论回复
评论
gtbestom 2023-11-16 11:30 回复TA
我开始也是你这么理解,手册也是这个意思,但是我实测 64K 的 MOV 需要下载时设置的 EEPROM 大小,128K 的才不需要 coody 的回复也有提示: 特别提醒:STC32G12K128的EEPROM基地址为0xfe0000,MOV操作EEPROM的地址 = EEPROM地址 + 基地址0xfe0000. 特别提醒:STC32G8K64的EEPROM基地址为0xff0000,但EEROM放在64K的最后面,所以MOV操作EEPROM的地址 = 65536-EEPROM总字节数 + EEPROM地址 + 基地址0xff0000. 
20
stb988| | 2023-11-15 17:34 | 只看该作者
stc32我移植了LCD驱动,发现在IF内做多项运算会出错,你们的会这样吗?

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

17

主题

104

帖子

0

粉丝