gtbestom 发表于 2023-11-13 15:12

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

本帖最后由 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 读写,原原本本按照手册上读写,死活不行 {:smile:}{:smile:}
iap 读,iap 写,是可以的,MOV 读,按照例程来做,啥也不是
后来折腾半天我算明白了,STC32G8K64 根本就不是你们这个 STC32 的逻辑,你们手册就是玩笑呗
我打 STC 技术支持,一个回复我们不支持 EEPROM 读啊,你是要**芯片吗??
转另一个技术支持说,我都用 IAP 读写啊,不用 MOVC,我提醒他 STC32 不用 MOVC,是用 MOV,他说不是啊,语气还怪凶的 {:smile:}{:smile:},我让他对一下手册,打脸了,然后让我用 IAP 读,不要用 MOV,白问




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



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



F99343441 发表于 2023-11-13 19:43

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


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

coody 发表于 2023-11-13 21:21

楼主,你贴的是STC32G12K128的EEPROM先关的地址安排,可能技术支持没留意你用的是STC32G8K64,这个用MOV访问时,基地址是0xff0000,不是0xfe0000。你用基地址0xff0000试试。

英雄本色2022 发表于 2023-11-13 23:56

这样做有一个好处就是程序保密性很高,即使开盖拿到代码,不知道EEPROM怎么划分,程序还是跑不起来,前提是不要用IAP读

ayb_ice 发表于 2023-11-14 10:10

多看手册,什么问题都能解决,除非手册写错了

laoxu 发表于 2023-11-14 10:31

EEPROM 还算好, 仔细点, 凑合着能用.

laoxu 发表于 2023-11-14 10:33

最有趣的是STC8H系列里的硬件乘法器, 速度奇慢.


laoxu 发表于 2023-11-14 10:34

以经典的 int 乘法为例, 硬件乘法(直接使用官方MDU16库) 和 软件乘法 相 PK,速度差 3倍 .

laoxu 发表于 2023-11-14 10:34

请看 清楚, 是慢 3倍,

alienmiller 发表于 2023-11-14 13:11

32位啊,本人都转为 RISC-V 核心来玩了。其他核心不考虑了。

chenyong123 发表于 2023-11-14 16:57

stc确实垃圾,客服也很恶心人。我之前用他一片8位的低功耗单片机,他的下载线必须串接电阻和二极管,就很无语,都特么什么年代了,下载口还搞那么复杂,我问技术,他们的技术很不耐烦,好像自己很牛X一样。这种垃圾货,还不如尽早换stm。

coody 发表于 2023-11-14 17:53

laoxu 发表于 2023-11-14 10:33
最有趣的是STC8H系列里的硬件乘法器, 速度奇慢.

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

coody 发表于 2023-11-14 17:55

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

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

laoxu 发表于 2023-11-15 05:43

coody 发表于 2023-11-14 17:53
你详细测过吗?我测试是比软件乘法快的,16位x16位,32X32位。

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

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

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

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

laoxu 发表于 2023-11-15 05:51

同样, STC32G12K128 的 MDU32, 我也编写了 单精度浮点运算库, 整体表现良好, 速度提升较多

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

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

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.

测试结果截图
https://www.stcaimcu.com/data/attachment/forum/202311/15/001917c0zt60cdhgt6vc6a.jpg
上传不了附件。

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 芯片,规则不通用就算了,手册也不注明,还得开发者花时间填坑

coody 发表于 2023-11-15 11:53

gtbestom 发表于 2023-11-15 11:11
#define                EEADDR_OFFSET      0xfe0000      //STC32G12K128,定义EEPROM用MOV访问时的 ...

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

英雄本色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读不需要闪存长度

stb988 发表于 2023-11-15 17:34

stc32我移植了LCD驱动,发现在IF内做多项运算会出错,你们的会这样吗?
页: [1] 2
查看完整版本: STC32 的 EEPROM 设计的真是反人类啊