热度 18
2013-1-15 14:51
2088 次阅读|
4 个评论
这两天一直在纠结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 , %0" : "=r"(eedata_val) : "r"(eedata_addr)); \ dest = eedata_val; \ } 大家可能很郁闷,为什么不用函数呢?确实用函数做不是会更明了吗,后来我试了一下改写成函数的形式,发现表页地址不能当做参数来进行传递,否则编译器会报错,大家可以自己去尝试一下,具体的我也不是很明白,这个读操作找了我好久呀! 写操作部分比较简单 uint16 __attribute__((space(eedata))) user_data ; _prog_addressT p; _init_prog_address(p, user_data); _write_eedata_word(p, 0xxxxx); _wait_eedata(); 首先要在内部的EEPROM区域得到一个待写入数据的地址。写操作函数的二个参数依次为写入的地址,待写入的值,之后还有一个等待指令,用来查看操作是否已经完成,这里面的操作都有关于单片机内部存储器的,所以有点晕。还有在读写一个字节后,地址指针要移动两个单位,因为它是按照字寻址方式的。 现在算是对内部的EEPROM有了一定的了解,不过还有很多的地方并没有搞明白,暂时先写这么多吧!