beacon 发表于 2024-6-27 10:57:28

关于MOVC不能取指令数据的问题请教

芯片型号:STC15H2K64S4

开发环境,MDK
开发语言:ASM
问题描述:
自己做一个ISP的程序,会检测应用区是否有合格的数据,测试使用IAP READ 可以取得数据,使用MOVC取的数据不是实际数据,相关问题代码如下:

check_userarea:
    mov   DPTR, #0x7FFE
    lcall   iap_byte_read
    xrl   A, #0x5A   
    jz      code_81   
    clr   C         
    ret               
code_81:
    mov   RAM_22, #0x10
    mov   RAM_23, #0
    mov   R7, #0
code_85:
    mov   a, RAM_23
    jnz   code_98
    mov   a, RAM_22
    xrl   a, #0x80
    jz      code_A8
code_98:
    mov   DPL, RAM_23
    mov   DPH, RAM_22
    lcall   iap_byte_read
    ; clr   A
    ; movc    A, @A+DPTR
    add   A, R7
    mov   R7, A
code_A6:
    inc   RAM_23
    mov   a, RAM_23
    jnz   $+4
    inc   RAM_22
    sjmp    code_85
code_A8:
    mov   A, R7
    jnz   code_AE
    setb    C
    sjmp    code_AF
code_AE:
    clr   C
code_AF:
    ret



使用指令中的
    lcall   iap_byte_read

可以取到数据并通过校验,而


    ; clr   A
    ; movc    A, @A+DPTR


则取的数据通不校验。

请虾给予赐教


21cnsound 发表于 2024-6-27 14:40:19

movc 和 iap_byte_read 读取EEPROM的地址是不一样的,需要增加偏移量


beacon 发表于 2024-6-27 16:19:53

21cnsound 发表于 2024-6-27 14:40
movc 和 iap_byte_read 读取EEPROM的地址是不一样的,需要增加偏移量

都是从dptr偏移0的,可以确认地址是一样的

21cnsound 发表于 2024-6-28 09:54:05

beacon 发表于 2024-6-27 16:19
都是从dptr偏移0的,可以确认地址是一样的

IAP操作按EEPROM的物理地址访问,MOVC读取EEPROM是EEPROM物理地址+程序大小偏移量。

当然,如果STC15H2K64S4在STC-ISP软件中设置了EEPROM为64k,程序大小偏移量就为0了。

你在STC-ISP软件中设置的EEPROM大小是64K吗?

beacon 发表于 2024-6-28 15:20:01

21cnsound 发表于 2024-6-28 09:54
IAP操作按EEPROM的物理地址访问,MOVC读取EEPROM是EEPROM物理地址+程序大小偏移量。

当然,如果STC15H2K ...

那大抵是这个问题了,现在设置为64K正常了,那比如设置0.5K的EEPROM,那偏移是给512还是64-0.5K的位置呢?

hsrzq 发表于 2024-6-28 16:42:53

beacon 发表于 2024-6-28 15:20
那大抵是这个问题了,现在设置为64K正常了,那比如设置0.5K的EEPROM,那偏移是给512还是64-0.5K的位置呢 ...

63.5

21cnsound 发表于 2024-6-28 16:55:38

beacon 发表于 2024-6-28 15:20
那大抵是这个问题了,现在设置为64K正常了,那比如设置0.5K的EEPROM,那偏移是给512还是64-0.5K的位置呢 ...

64K-0.5K是EEPROM的首地址。
你这样记就容易理解了,64K FLASH/EEPROM的结束地址始终是0xFFFF,设置的EEPROM是从后向前规划使用的。

0.5K EEPROM的IAP地址范围是0x0000-0x01FF,MOVC访问首地址=0xFFFF-0x01FF=0xFE00

beacon 发表于 2024-6-29 09:49:13

清楚了,结构图如下

|      code                                 |      eeprom         |
0                                           FE00                     FFFF

访问code区时,使用movc a, @a + dptr, 此时a为0即可
访问eeprom时,此时dptr的基址就是FE00,再偏移A才能访问

具体是否是这样,有时间再做个测试看看
页: [1]
查看完整版本: 关于MOVC不能取指令数据的问题请教