IAR LGT重写EEPROM库(IAR能直接用EEPROM关键字操作EEPROM)
本帖最后由 uc_c++ 于 2012-4-30 18:01 编辑文件直接加入到IAR工程。
没有仔细测试。
//IAR寄存器使用规则:
//R0-R3,R16-23,R30,R31草稿寄存器
//R4-R7 R24-R27 存储寄存器 (R4-R7也可设置为为全局变量寄存器)
//R8-R15 全局变量寄存器
PUBLIC__eeput8_16
PUBLIC__eeput16_16
PUBLIC__eeput32_16
PUBLIC__eeget8_16
PUBLIC__eeget16_16
PUBLIC__eeget32_16
//r16 data
//r20:r21 addr
RSEG CODE:NOROOT(1)
__eeput8_16:
ST -Y,R2 //保护寄存器R2
IN R2, 0x3F //保护SREG
CLI //关中断
??__eeput8_16_1:
SBIC 0x1F, 0x01 //while(EECR & (1 << EEPE));
RJMP ??__eeput8_16_1
OUT 0x22, R21 //EEARH=ADDR_H
OUT 0x21, R20 //EEARL=ADDR_L
OUT 0x20, R16 //EEDR=DATA
SBI 0x1F, 0x02 //EECR |= (1 << EEMPE);
SBI 0x1F, 0x01 //EECR |= (1 << EEPE);
OUT 0x3F, R2 //恢复SREG
LD R2, Y+ //恢复寄存器R2
RET
//r16:r17 data
//r20:r21 addr
RSEG CODE:NOROOT(1)
__eeput16_16
CALL __eeput8_16
SUBI R20, HIGH(-1)
SBCI R21, LOW(-1)
MOV R16,R17
CALL __eeput8_16
RET
//r16:r17:r18:r19 data
//r20:r21 addr
RSEG CODE:NOROOT(1)
__eeput32_16
CALL __eeput8_16
SUBI R20, HIGH(-1)
SBCI R21, LOW(-1)
MOV R16,R17
CALL __eeput8_16
SUBI R20, HIGH(-1)
SBCI R21, LOW(-1)
MOV R16,R18
CALL __eeput8_16
SUBI R20, HIGH(-1)
SBCI R21, LOW(-1)
MOV R16,R19
CALL __eeput8_16
RET
//r16 data
//r20:r21 addr
RSEG CODE:NOROOT(1)
__eeget8_16:
??__eeget8_16_1:
SBIC 0x1F, 0x01
RJMP ??__eeget8_16_1
OUT 0x22, R21
OUT 0x21, R20
SBI 0x1F, 0x00
NOP
NOP
IN R16, 0x20
RET
//r16:17 data
//r20:r21 addr
RSEG CODE:NOROOT(1)
__eeget16_16:
SUBI R20, HIGH(-1)
SBCI R21, LOW(-1)
CALL __eeget8_16
MOV R17,R16
SUBI R20, HIGH(1)
SBCI R21, LOW(1)
CALL __eeget8_16
RET
//r16:17:R18:R19 data
//r20:r21 addr
RSEG CODE:NOROOT(1)
__eeget32_16:
SUBI R20, HIGH(-3)
SBCI R21, LOW(-3)
CALL __eeget8_16
MOV R19,R16
SUBI R20, HIGH(1)
SBCI R21, LOW(1)
CALL __eeget8_16
MOV R18,R16
SUBI R20, HIGH(1)
SBCI R21, LOW(1)
CALL __eeget8_16
MOV R17,R16
SUBI R20, HIGH(1)
SBCI R21, LOW(1)
CALL __eeget8_16
RET
END
汇编写的,板凳啊 我也测试下了EEPROM 读写速度真的不是老妖产品所能比的 汇编!!高深!!
页:
[1]