打印
[STM8]

请教EEPROM问题,谢谢!

[复制链接]
3871|13
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
zcxhe|  楼主 | 2010-6-2 20:58 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
STVD+Cosmic CxSTM8 32K 4.3.4(石皮 角刀牛 片反)

;==========================================
    __eep_wall_data[__window_x].__eep_window_ptr += 1;

    __eep_wall_data[__window_x].__eep_window_ptr++;

这样写都有问题,如果后面所示,如下面所写则编译通过

    __eep_wall_data[__window_x].__eep_window_ptr = 1;


这是变量定义:
@eeprom struct __eep_wall
{
    unsigned char __eep_out_fx;                                    //输出换向
    unsigned char __eep_out_lx;                                    //输出类型
    unsigned char __eep_wk_sb_k;                                   //外控开关类型
    unsigned char __eep_window_ptr;                                //保存通道位置
    unsigned char __eep_window[__cst_window_len][__cst_code_len];  //保存8个通道号
    unsigned int  __eep_crc16;                                     //数据CRC16校验结果
} __eep_wall_data[3] =
{
    0
}
;

那位知道是怎么回事?
看其他人写EEPROM都用:*((@far u8*) Address) = Data;不知道是何原因?
谢谢!

;==========================================




cgstm8.exex 已停止工作(提不窗口显示)




----------- Project 2010-05-21-mk100-stm8s103f2 - STM8 Cosmic - Configuration Debug -------------
Removing intermediate files ... Done!
----------- Project 2010-05-21-mk100-stm8s103f2 - STM8 Cosmic - Configuration Debug -------------
Compiling main.c...
cxstm8 +debug -pxp -no -l +mods0 -pp -i"C:\Program Files\COSMIC\CXSTM8\Hstm8"  -clDebug\ -coDebug\ main.c
main.c:


;==================
这段是红色字体


The command: "cxstm8 +debug -pxp -no -l +mods0 -pp -i"C:\Program Files\COSMIC\CXSTM8\Hstm8"  -clDebug\ -coDebug\ main.c " has failed, the returned value is: 1
exit code=1.
;==================


2010-05-21-mk100-stm8s103f2.elf - 2 error(s), 0 warning(s)
沙发
zcxhe|  楼主 | 2010-6-3 10:03 | 只看该作者
那位帮忙解释一下,谢谢!

使用特权

评论回复
板凳
香水城| | 2010-6-3 10:18 | 只看该作者
编译器提示什么问题?

使用特权

评论回复
地板
zcxhe|  楼主 | 2010-6-3 10:37 | 只看该作者
提示如下:
cgstm8.exex 已停止工作(提示窗口显示,点关闭后出现下面的文字)




----------- Project 2010-05-21-mk100-stm8s103f2 - STM8 Cosmic - Configuration Debug -------------
Removing intermediate files ... Done!
----------- Project 2010-05-21-mk100-stm8s103f2 - STM8 Cosmic - Configuration Debug -------------
Compiling main.c...
cxstm8 +debug -pxp -no -l +mods0 -pp -i"C:\Program Files\COSMIC\CXSTM8\Hstm8"  -clDebug\ -coDebug\ main.c
main.c:


;==================
这段是红色字体


The command: "cxstm8 +debug -pxp -no -l +mods0 -pp -i"C:\Program Files\COSMIC\CXSTM8\Hstm8"  -clDebug\ -coDebug\ main.c " has failed, the returned value is: 1
exit code=1.
;==================


2010-05-21-mk100-stm8s103f2.elf - 2 error(s), 0 warning(s)

使用特权

评论回复
5
香水城| | 2010-6-3 10:47 | 只看该作者
估计编译器不允许在EEPROM区域进行运算操作,只允许进行单纯的读或写操作。

你试试看这样是否可以:

temp = __eep_wall_data[__window_x].__eep_window_ptr + 1;
__eep_wall_data[__window_x].__eep_window_ptr  = temp;

使用特权

评论回复
6
zcxhe|  楼主 | 2010-6-3 11:13 | 只看该作者
这样是可以的!

另外我看其他人写EEPROM都用:*((@far u8*) Address) = Data;不知道是何原因?这句子具体意思能解释一下吗?

谢谢!

使用特权

评论回复
7
香水城| | 2010-6-3 11:19 | 只看该作者
这是C语言的类型转换+指针操作。

使用特权

评论回复
8
zcxhe|  楼主 | 2010-6-3 12:20 | 只看该作者
但地址不是16位的吗(0x4000)?为什么要用转为  U8   呢?另外   @far    在这里是什么意思?
还有劳香主详细解释一下!谢谢!

使用特权

评论回复
9
香水城| | 2010-6-3 13:42 | 只看该作者
far 表示长地址类型。
u8 表示Address指向的目标是u8类型。

使用特权

评论回复
10
zcxhe|  楼主 | 2010-6-3 14:44 | 只看该作者
有一点点明白了!万分感谢香主!

使用特权

评论回复
11
txcy| | 2010-6-3 16:36 | 只看该作者
运算操作最好不要在EEPROM进行,在外面进行嘛

使用特权

评论回复
12
zcxhe|  楼主 | 2010-6-5 16:13 | 只看该作者
发现STVD+Cosmic CxSTM8 32K 4.3.4的吐血问题,给大家提个醒:

这样子写:

__eep_wall_data[(__window_x + 1)] = __eep_wall_data[__window_x];
__eep_wall_data[(__window_x + 2)] = __eep_wall_data[__window_x];

运行结果是错误的!

这样子写:

__eep_wall_data[1] = __eep_wall_data[0];
__eep_wall_data[2] = __eep_wall_data[0];

或者这样子写:

__eep_wall_data[__window_x] = __eep_wall_data[(__window_x + 1)];
__eep_wall_data[__window_x] = __eep_wall_data[(__window_x + 2)];

运行结果是正确的!

使用特权

评论回复
13
8bit_MCU| | 2010-6-14 15:47 | 只看该作者
发现STVD+Cosmic CxSTM8 32K 4.3.4的吐血问题,给大家提个醒:

这样子写:

__eep_wall_data[(__window_x + 1)] = __eep_wall_data[__window_x];
__eep_wall_data[(__window_x + 2)] = __eep_wall_data[__window ...
zcxhe 发表于 2010-6-5 16:13


都有问题
STM8系列的EEPROM在使用时一定要注意,在进行一次写操作前要确保上一次写操作已经完成。否则即使你的写入是成功的也有潜在的问题:
当进行EEPROM写入操作时,前一次写入还没有完成,那MCU会被HOLD住,期间不会响应任何中断,连续写入2次,那MCU就会被HOLD12ms.

使用特权

评论回复
14
zcxhe|  楼主 | 2010-6-15 14:38 | 只看该作者
嗯! 这个有检查的!

使用特权

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

本版积分规则

27

主题

138

帖子

2

粉丝