请教马老师:关于在CVAVR里定义EEPROM型值的问题!
马老师:在CVAVR里我需要定义一个EEPROM类型的值,比如:eeprom int EEP_CaliVolt00;你的那本书上也是这么写的,可是编译时,他提示没有初始化EEPROM,所以我改成eeprom int EEP_CaliVolt00=20;这样就可以编译通过了,但是这样一来就有一个问题,我这个值在程序里是要校正它的,如果这样定义,并且它还是个全局变量,那么就算校正好了,再下一次RESET后,这个EEPROM不是又被初始化成20了,那这样一来不是每次开机后都需要校正了吗??请帮忙解惑!这个问题很棘手啊! eeprom int EEP_CaliVolt00;可是编译时,他提示没有初始化EEPROM,====>此句定义一个INT变量在EEPROM中,但没有值.编译只是给出警告,可以认为通过编译.
eeprom int EEP_CaliVolt00=20;这样就可以编译通过了
====>此句定义一个INT变量在EEPROM中,初值为20.此时会生成一个ROM文件,在下载HEX文件时,需要同时将ROM文件下载,这样在EEPROM中的变量才能为20.即EEPROM中变量的初值时通过ISP编程下载写入的.
但是这样一来就有一个问题,我这个值在程序里是要校正它的,如果这样定义,并且它还是个全局变量,那么就算校正好了,再下一次RESET后,这个EEPROM不是又被初始化成20了!
=====>与RAM中的变量不同,EEPROM中的初值不是程序在启动初始化时写入的,而是通过ISP下载时写入的.如果程序中没有对该EEPROM变量写入语句的话,该变量永远不变.除非你重新擦除芯片,再次编程写入.
为了操作简单,我通常这样处理:
eeprom char flag;
eeprom int EEP_CaliVolt00;
main()
{
if (flag != 0xa5)
{
EEP_CaliVolt00 = 20;
flag = 0x05;
}
......
......
}
这样,就不必理会编译时给出的警告提示:没有初始化EEPROM.程序下载后第一次上电运行,由程序写入初值20.而以后的上电启动过程中,由于flag是0x05了,程序就不会再对EEP_CaliVolt00写初值了. 这个警告看起来很不爽,所以通常在软件里将其屏蔽! 我已经习惯了.警告作为提醒,否则会忘掉做必要的处理.
页:
[1]