这两天一直在纠结PIC24F单片机内部的EEPROM操作,现在终于算得上有了一定的了解,现将其写下供大家参考和指出相关的问题。
PIC24F单片机内部有256字的内存(不同的型号可能不同),它的寻址方式是字寻址,当每读写一个字后,它的地址指针好像跟外部的EEPROM有所不同,不会自动的增加,需要人为的对地址指针进行增加或减小,不过同样有数据覆盖的特点。
目前,我还没有找到完全用C代码读写EEPROM的方法,用的是行内汇编和编译器自带的函数,其实对EEPROM的操作也不是很难,就是当初没有这方面的概念,对于内部的EEPROM的读写,编译器其实就已经给我们提供了两个函数。就是在帮助文件中漫无思想的寻找很纠结。首先介绍几个概念,表读指令TBLRD,表写指令TBLWT,几个内建函数 __builtin_tblpage_ __builtin_tbloffset_ ......这些函数涉及到汇编的知识,帮助文件中有详细的说明,大家可以自己去看看。
这是编译器自带的读EEPROM操作,是用宏定义做的 #define eedata_read(src, offset, dest) { \
register int eedata_addr; \
register int eedata_val; \
\
eedata_addr = __builtin_tbloffset(&src)+offset; \
__asm__("tblrdl [%1], %0" : "=r"(eedata_val) : "r"(eedata_addr)); \
dest = eedata_val; \
}
大家可能很郁闷,为什么不用函数呢?确实用函数做不是会更明了吗,后来我试了一下改写成函数的形式,发现表页地址不能当做参数来进行传递,否则编译器会报错,大家可以自己去尝试一下,具体的我也不是很明白,这个读操作找了我好久呀!
写操作部分比较简单
uint16 __attribute__((space(eedata))) user_data[2];
_prog_addressT p;
_init_prog_address(p, user_data);
_write_eedata_word(p, 0xxxxx);
_wait_eedata();
首先要在内部的EEPROM区域得到一个待写入数据的地址。写操作函数的二个参数依次为写入的地址,待写入的值,之后还有一个等待指令,用来查看操作是否已经完成,这里面的操作都有关于单片机内部存储器的,所以有点晕。还有在读写一个字节后,地址指针要移动两个单位,因为它是按照字寻址方式的。
现在算是对内部的EEPROM有了一定的了解,不过还有很多的地方并没有搞明白,暂时先写这么多吧!
用户1602177 2013-2-18 14:31
用户1610239 2013-1-16 10:36
huhaomcu_856934054 2013-1-15 20:06
用户1602177 2013-1-15 15:01