uc_c++ 发表于 2012-4-30 17:58:10

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

shian0551 发表于 2012-4-30 18:11:39

汇编写的,板凳啊

longwu911 发表于 2012-4-30 19:15:24

我也测试下了EEPROM 读写速度真的不是老妖产品所能比的

guolun 发表于 2012-5-1 08:21:50

汇编!!高深!!
页: [1]
查看完整版本: IAR LGT重写EEPROM库(IAR能直接用EEPROM关键字操作EEPROM)