我正在使用带有PIC18F87J11的 MPLAB C18 编译器,并且我正在尝试使用内联汇编将一些值保存到闪存中,这是 C 和汇编代码的组合。
看起来我可以正确地写入和读取闪存,但是一旦我重启我的 PIC,然后尝试读取我之前从特定地址保存的内容,我就不会得到相同的值。我正在保存0x09
地址0xB22A
。就像我说的那样,如果我保存该值然后立即读取它,一切都会正确显示,但是在重置 PIC 时我得到了0x00
.
我不是永久保存到闪存还是这里真正发生了什么?
这是我的代码:
擦除内存行
_asm
MOVLW 0x00
MOVWF TBLPTRU,BANKED
MOVLW 0xB2
MOVWF TBLPTRH,BANKED
MOVLW 0x2A
MOVWF TBLPTRL,BANKED
_endasm
EECON1bits.FREE = 1;
INTCONbits.GIE = 0;
_asm
MOVLW 0x55
MOVWF EECON2,BANKED
MOVLW 0xAA
MOVWF EECON2,BANKED
_endasm
EECON1bits.WR = 1;
INTCONbits.GIE = 1;
写入闪存
_asm
MOVLW 0x00
MOVWF TBLPTRU,BANKED
MOVLW 0xB2
MOVWF TBLPTRH,BANKED
MOVLW 0x2A
MOVWF TBLPTRL,BANKED
MOVLW 0x09
MOVWF TABLAT,BANKED
TBLWTPOSTINC
MOVLW 0x09
MOVWF TABLAT,BANKED
TBLWT
_endasm
EECON1bits.WPROG = 1;
EECON1bits.WREN = 1;
INTCONbits.GIE = 0;
_asm
MOVLW 0x55
MOVWF EECON2,BANKED
MOVLW 0xAA
MOVWF EECON2,BANKED
_endasm
EECON1bits.WR = 1;
INTCONbits.GIE = 1;
EECON1bits.WPROG = 0;
EECON1bits.WREN = 0;
从闪存读取
_asm
MOVLW 0x00
MOVWF TBLPTRU,BANKED
MOVLW 0xB2
MOVWF TBLPTRH,BANKED
MOVLW 0x2A
MOVWF TBLPTRL,BANKED
READ_WORD:
TBLRDPOSTINC
MOVF TABLAT, 0,BANKED
MOVWF WORD_EVEN,ACCESS
TBLRDPOSTINC
MOVF TABLAT, 0,BANKED
MOVWF WORD_ODD,ACCESS
_endasm
printf("\r\n");
PrintChar(WORD_EVEN);
printf("\r\n");
PrintChar(WORD_ODD);
原始代码可以在第 6 章的数据表中找到,但请记住,我必须对其进行一些修改才能与 C 一起使用。我不确定它们之间有什么区别ACCESS
,BANKED
因为我怀疑它们可能与问题。