AVR GCC编译器(AVR STUDIO 4)中关于读写内部eeprom时的指针问题的请教
UCHARuOffset=0;UCHARAddrPointer;
UINT i;
AddrPointer=0x00;//为什么此处定义的起始地址感觉是固定的,设为其他地址如0x50等也是一样的(用双龙的下载器读出的EEPROM内容)
for(i=0;i<500;i++){
eeprom_write_byte(&AddrPointer+uOffset,0x65+uOffset);
uOffset++;
delay1();//写数据延迟
} 没明白你的意思,你是想用AddrPointer指向EEPROM的某个地址? 对,是想用AddrPointer传递EEPROM的某个地址 for(i=0;i<500;i++){
eeprom_write_byte(&AddrPointer+uOffset,0x65+uOffset);
uOffset++;
delay1();//写数据延迟
}
等价于
for(i=0;i<500;i++){
eeprom_write_byte(&AddrPointer,0x65+uOffset);
uOffset++;
delay1();//写数据延迟
}
何必写那么复杂?
你的数组
UCHARAddrPointer;
才定义两个,如何循环到500?
数组的地址也不确定,这是干什么,看不懂 .... 我的本意是如何采用下列函数往片内EEPROM写一段数据temp,由于是第一次使用ATMEGA8,对于eeprom.h内的函数参数调用比较困惑,请用过的高手给予指点。
static inline uint8_t __attribute__ ((always_inline))
eeprom_read_byte (const uint8_t *addr);
static inline uint16_t __attribute__ ((always_inline))
eeprom_read_word (const uint16_t *addr);
static inline void __attribute__ ((always_inline))
eeprom_read_block (void *pointer_ram,
const void *pointer_eeprom,
size_t size);
static inline void __attribute__ ((always_inline))
eeprom_write_byte (uint8_t *addr,uint8_t value);
static inline void __attribute__ ((always_inline))
eeprom_write_word (uint16_t *addr,uint16_t value);
static inline void __attribute__ ((always_inline))
eeprom_write_block (const void *pointer_ram,
void *pointer_eeprom,
size_t size); eeprom_write_block (const void *pointer_ram,
void *pointer_eeprom,
size_t size);
--------------------块写------------
UCHAR temp;
eeprom_write_block(temp, (void*)0, sizeof(temp));
或者用单字节写 eeprom_write_byte (uint8_t *addr,uint8_t value);
UCHAR temp;
UCHAR i;
for (i=0;i<50;++i)
{
eeprom_write_byte((void*)i , temp);
} 关注! 谢谢5楼的大侠!
块写eeprom_write_block(temp, (void*)0, sizeof(temp)); 可以编译通过,可是下载程序后,原来1秒1闪的运行指示灯不断快速闪烁,程序好像在不断自启;
而且用单字节如下写时
UCHAR temp;
UCHAR i;
for (i=0;i<50;++i)
{
eeprom_write_byte((void*)i , temp);
}
出现编译错误如下:
warining: cast to pointer from integer of different size
error: invalid conversion from 'void*' to 'uint8_t*'
error: initializing argument 1 of 'void eeprom_write_byte(uint8_t*,uint8_t)'
不知何故,看以上的参数传递应该没问题呀。 嗯,我写错了,应该如下:
UINTi;
for (i=0;i<50;++i)
{
eeprom_write_byte((uint8_t *)i , temp);
}
或者
UCHAR i;
for (i=0;i<50;++i)
{
eeprom_write_byte((uint8_t *)((UINT)i) , temp);
} 谢谢5楼的,单字节写EEPROM的程序测试正确,
块写eeprom_write_block(temp, (uint16_t*)0, sizeof(temp)); 可以编译通过,可是下载程序后,原来1秒1闪的运行指示灯不断快速闪烁,程序好像在不断自启; 是不是要关闭看门狗呀 估计eeprom_write_block函数内部应该不会有喂狗的语句,所以答案应该是要关。 shark大侠,果然必须关看门狗,谢谢。这个论坛果然有不少古道热肠之士,在我刚用AVR的时候就得到贴心的指导,能否留个QQ号,以便交流。我的QQ:449224425 高山流水 AVR的E2读写真的很无语啊,写一个字节也会马上重启,难道只能关狗狗吗?
页:
[1]