关于新华龙单片机flash存储非易失性数据的问题
数据需要存入非易失性空间,断电后再读用的单片机flash有8kbyte程序:1、ADC采样,中断一次,得到一个数据2、将数据装入数组A【n】3、对flash操作,进行非易...
数据需要存入非易失性空间,断电后再读
用的单片机flash有8kbyte
程序:
1、ADC采样,中断一次,得到一个数据
2、将数据装入数组A【n】
3、对flash操作,进行非易失性数据存储
4、读出数据时,将flash中的数据载入数组B【n】
问:
数组定义为 unsigned float A【n】,B【n】
会占用DATA空间
如果n 很大,DATA空间会溢出
但是如果将A,B放入XDATA
就无法在flash中存数了
为什么?该怎么解决?
谢谢
接2011.2.25的“追问”
----------------------------------------
汇编记不太清楚,大致如下:
MOV DPTR , #ABC【0x.。。。 】;
MOV A ,#0x01;
MOVX @DPTR , A;
DPTR指向的地址确实是ABC的地址,累加器A的值正确,就是最后ABC的值不变
-------------------------------------------------------------
用其他单片机调都正确。
我用的Keil,C8051F530A,新华龙网下的Keil驱动版本是2.6
他们说有3.4的版本,是和驱动有关? 展开
用的单片机flash有8kbyte
程序:
1、ADC采样,中断一次,得到一个数据
2、将数据装入数组A【n】
3、对flash操作,进行非易失性数据存储
4、读出数据时,将flash中的数据载入数组B【n】
问:
数组定义为 unsigned float A【n】,B【n】
会占用DATA空间
如果n 很大,DATA空间会溢出
但是如果将A,B放入XDATA
就无法在flash中存数了
为什么?该怎么解决?
谢谢
接2011.2.25的“追问”
----------------------------------------
汇编记不太清楚,大致如下:
MOV DPTR , #ABC【0x.。。。 】;
MOV A ,#0x01;
MOVX @DPTR , A;
DPTR指向的地址确实是ABC的地址,累加器A的值正确,就是最后ABC的值不变
-------------------------------------------------------------
用其他单片机调都正确。
我用的Keil,C8051F530A,新华龙网下的Keil驱动版本是2.6
他们说有3.4的版本,是和驱动有关? 展开
展开全部
你用的是C8051F系列单片机吧,如果这些数据连续反复写入,我建议你扩充一个串行外部数据EEPROM,因为内部FLASH写入寿命的限制。
FLASH是按页进行存储,所以要按页进行定义,定义方法如下:
//类型定义
typedef union {
long l;
unsigned char A[4];
}LONG;
typedef unsigned int FLADDR;
//fLASH 数据区定义
LONG DATA_PAGE[128] _at_ 0x1800; // 页绝对地址
char code SCRATCH_PAGE[512] _at_ 0x1A00; // 页绝对地址
这是我做的项目中用flash中存放数据,程序中定义存放数据区的定义。我也是将AD转换计算后的数据保存在flash里面。
因为后期擦除、均按页进行。所以写入时要注意,原来需保留数据的处理。
FLASH是按页进行存储,所以要按页进行定义,定义方法如下:
//类型定义
typedef union {
long l;
unsigned char A[4];
}LONG;
typedef unsigned int FLADDR;
//fLASH 数据区定义
LONG DATA_PAGE[128] _at_ 0x1800; // 页绝对地址
char code SCRATCH_PAGE[512] _at_ 0x1A00; // 页绝对地址
这是我做的项目中用flash中存放数据,程序中定义存放数据区的定义。我也是将AD转换计算后的数据保存在flash里面。
因为后期擦除、均按页进行。所以写入时要注意,原来需保留数据的处理。
更多追问追答
追问
谢谢
今天又看了一下,发现不是存不进flash,而是赋值都不行
程序大致如下:
xdata unsigned char ABC;
unsigned char D = 1;
main()
{
ABC= D;
}
运行后,ABC=0
追答
flash不能那么用,你还没明白我说的,不能这样赋值,你是想这样赋值将数据写入这个地址,是不行的。
这是给写一个字节,写一个字节必须按照一个时序进行,否则随意写,flash不就乱了套
void FLASH_ByteWrite (unsigned int addr, char byte)
{
char xdata * data pwrite; // FLASH write pointer
EA = 0; // disable interrupts
VDM0CN = 0x80; // enable VDD monitor
RSTSRC = 0x02; // enable VDD monitor as a reset source
pwrite = (char xdata *) addr;
FLKEY = 0xA5; // Key Sequence 1
FLKEY = 0xF1; // Key Sequence 2
PSCTL |= 0x01; // PSWE = 1
VDM0CN = 0x80; // enable VDD monitor
RSTSRC = 0x02; // enable VDD monitor as a reset source
*pwrite = byte; // write the byte
PSCTL &= ~0x01; // PSWE = 0
}
这是读一个字节的函数
unsigned char FLASH_ByteRead (unsigned int addr)
{
char code * data pread; // FLASH read pointer
unsigned char byte;
EA = 0; // disable interrupts
pread = (char code *) addr;
byte = *pread; // read the byte
return byte;
}
ZESTRON
2024-09-04 广告
2024-09-04 广告
电子失效分析是指对电子元件或系统进行系统调查,以确定失效原因。通过显微镜、光谱学和电气测试等技术,分析人员可以查明导致故障的缺陷或问题。此过程包括检查物理损坏、分析电气特性和进行环境测试以确定根本原因。电子故障分析在半导体制造、汽车电子和消...
点击进入详情页
本回答由ZESTRON提供
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询