打印
[技术问答]

新唐8051 范例中dataflash 为什么可以直接写?不用先擦除?

[复制链接]
821|14
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
medety|  楼主 | 2023-8-27 11:31 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
如题:新唐8051  范例中dataflash 为什么可以直接写?不用先擦除?

我看上面说有128字节的DataFlash,我在想,这个空间是不是烧录的时候不会烧录到这里?这里是独立的区域么?
然后还有个疑问, 就是为什么新塘的规格书上面,找不到寄存器的详细说明,比如第几位是干啥的
都找不到这样的资料。

大家开发这个时候,难道都是去找STC的规格书来参考的么????

使用特权

评论回复
沙发
medety|  楼主 | 2023-8-27 11:34 | 只看该作者
自己先顶一下~~

使用特权

评论回复
板凳
medety|  楼主 | 2023-8-27 11:41 | 只看该作者
比如这个DataFlash地址是哪里,在哪个资料可以看到,比如型号是MS51FB9AE的

使用特权

评论回复
地板
medety|  楼主 | 2023-8-27 14:21 | 只看该作者
附件图中:
1. 第一步往0x3882写入一个字字节数据0x34 ;

2. 第二步往0x38E0写入50个字字节数据0~49 ;
3. 第三步往0x38FE写入结构体StructData;
4. 第四步却又将0x38FD地址的数据跟0x38FE的数据合并。

以上理解对么?

5. 另外还有疑问,新唐的MCU内部的DataFlash地址是从0x3882开始么?还是? 这点从官方那个手册有这方面的描述?
6. 按照上面步骤的说明,既然是Flash,肯定写之前是要做擦除动作的,每写入一次,不是把前面那次写入的数据给擦除掉了?
   官方例程为什么还要搞以上那么多个步骤?用意是啥?
7. 结构体写入的时候,由于每个成员数据长度不同,占去的空间也会不同,他是如何将几个成员的数据写入进去的?
   而官方例程中,如果便于区别,可以完全用0x01234  0x456789 0x98 这种作为范例,方便区别,怎么写入的,0x55的范例的用途是啥?
8. 其中后面读值的时候,将将2个相邻地址的数据合并成一个16数据,用意是什么呢?

麻烦各位用过的大佬指导一下,感谢~~

nuvoton8051_DataFlash.PNG (52.33 KB )

nuvoton8051_DataFlash.PNG

nuvoton8051_DataFlash.PNG (52.33 KB )

官方范例

官方范例

使用特权

评论回复
5
medety|  楼主 | 2023-8-28 08:18 | 只看该作者
顶上去

使用特权

评论回复
6
逍遥派掌门| | 2023-8-28 08:37 | 只看该作者
新唐的 datasheet 确实令人难以下咽,很多东西都不在datasheet里说清楚。
MS51FB9AE 这款,定时器的定时时间是怎么计算出来的,datasheet里没说,BSP里也就是给个数字,不阐述怎么计算的,很蛋疼。

51单片机的资料,最齐全的只有STC家了。

使用特权

评论回复
7
逍遥派掌门| | 2023-8-28 08:51 | 只看该作者
楼主,看这个手册,估计有帮助:
https://www.nuvoton.com.cn/export/resource-files/TRM_MS51FB9AE_MS51XB9AE_MS51XB9BE_SC_Rev1.04.pdf

使用特权

评论回复
8
kkstun| | 2023-8-28 09:26 | 只看该作者
MS51FB9AE 这个应该是替换n76e003的吧,我记得n76e的demo还是不错的。

使用特权

评论回复
9
datouyuan| | 2023-8-28 10:17 | 只看该作者
medety 发表于 2023-8-27 14:21
附件图中:
1. 第一步往0x3882写入一个字字节数据0x34 ;

5: APROM地址范围是0~0x3fff,可以使用任意地址,IAP ISP就是靠这个实现的。0x3882在APROM的末端,一般的代码到不了这,不会改动代码功能。当然你可以把DataFlash地址定义在任何位置,这样会改动你代码功能。
6:写之前一定要确保是空白的,不然会出错。但不是说“写之前是要做擦除动作”。写只能按字节操作,擦除是按页操作。官方例程的地址都在一页中,只需在开头执行一次擦除即可。
7: flash读写只需要知道结构体的首地址和占用字节数即可。不需要知道结构体内部情形,你可以任意调整结构。用0x55没啥特定含义,你可以使用任意值。
8:没啥用意。u32i=(read(0x0001)<<24)+(read(0x0002)<<16)+(read(0x0003)<<8)+(read(0x0003)<<0);你可以随意。

使用特权

评论回复
10
datouyuan| | 2023-8-28 10:45 | 只看该作者
写之前已经是空白的,可以直接写,不用先擦除。
这和其它的没啥区别。

假如不是空白的,操作如下
1 把要写的整页读出,备份
2.擦除整页
3 修改备份
4 把备份写入整页

使用特权

评论回复
11
qiangtech| | 2023-8-28 15:32 | 只看该作者
你要看一 下具体的实现函数,里面就有擦除操作。只是现在封装好了给你用,不用具体去操作罢了。让你像操作EEPROM一样。

使用特权

评论回复
12
datouyuan| | 2023-8-28 23:16 | 只看该作者
qiangtech 发表于 2023-8-28 15:32
你要看一 下具体的实现函数,里面就有擦除操作。只是现在封装好了给你用,不用具体去操作罢了。让你像操作E ...

官方只会提供擦除、读、写这几个函数。stm也是这样。
具体该怎么调用,还得你自己安排。
flash和eeprom不一样,擦写次数低了1个数量级。eeprom不需要擦除操作,直接写。

使用特权

评论回复
13
春娇霹雳娃| | 2023-8-29 10:04 | 只看该作者

使用特权

评论回复
14
奔跑的牛| | 2023-9-1 10:02 | 只看该作者
datouyuan 发表于 2023-8-28 10:45
写之前已经是空白的,可以直接写,不用先擦除。
这和其它的没啥区别。

5、        MS51没有设置单独的data flash区域。只要APROM空余的区域都可以用做data flash保存数据,通常会选择后面部分,因为程序一般没有到达这个区域。烧写程序时不要选择整颗芯片擦除,这样烧程序就不会把DATA flash的内容擦掉。
MS51的Flash读写单位是字节,擦除是以页(128字节)为单位。例程是将最后一页作为了data flash保存数据。
6、        Flash里数据如果不是0XFF,就需要擦除后才能再写。例程里操作的都是同一页,所以如果写过了,只需要在开头加一条擦除一整页,然后就可以按字节写。
如果这一页内容非0XFF,要再写,按照下面操作:
先将整页内容读出备份===》页擦除==》在备份里修改内容==》重新写入flash
7、        往flash里读写结构体,只需要知道结构体的首地址和结构体大小,不需要知道具体结构体的内容哪个放在什么位置。0X55和前面写的数据不一样就行。
8、        为了演示写过的地方没有擦除前无法再次写入

使用特权

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

本版积分规则

11

主题

69

帖子

0

粉丝