找回密码
 立即注册
查看: 416|回复: 7

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

[复制链接]

1

主题

3

回帖

17

积分

新手上路

积分
17
发表于 2024-6-27 10:57:28 | 显示全部楼层 |阅读模式
芯片型号: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


则取的数据通不校验。

请虾给予赐教


截图202406271055224355.jpg
回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:452
  • 最近打卡:2025-05-01 06:20:50
已绑定手机

13

主题

1257

回帖

2971

积分

金牌会员

积分
2971
发表于 2024-6-27 14:40:19 | 显示全部楼层
movc 和 iap_byte_read 读取EEPROM的地址是不一样的,需要增加偏移量


回复 支持 反对

使用道具 举报 送花

1

主题

3

回帖

17

积分

新手上路

积分
17
发表于 2024-6-27 16:19:53 | 显示全部楼层
21cns*** 发表于 2024-6-27 14:40
movc 和 iap_byte_read 读取EEPROM的地址是不一样的,需要增加偏移量

都是从dptr偏移0的,可以确认地址是一样的
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:452
  • 最近打卡:2025-05-01 06:20:50
已绑定手机

13

主题

1257

回帖

2971

积分

金牌会员

积分
2971
发表于 2024-6-28 09:54:05 | 显示全部楼层
bea*** 发表于 2024-6-27 16:19
都是从dptr偏移0的,可以确认地址是一样的

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

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

你在STC-ISP软件中设置的EEPROM大小是64K吗?
回复 支持 反对

使用道具 举报 送花

1

主题

3

回帖

17

积分

新手上路

积分
17
发表于 2024-6-28 15:20:01 | 显示全部楼层
21cns*** 发表于 2024-6-28 09:54
IAP操作按EEPROM的物理地址访问,MOVC读取EEPROM是EEPROM物理地址+程序大小偏移量。

当然,如果STC15H2K ...

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

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:455
  • 最近打卡:2025-05-01 08:13:06
已绑定手机

27

主题

341

回帖

1687

积分

金牌会员

机长

积分
1687
发表于 2024-6-28 16:42:53 | 显示全部楼层
bea*** 发表于 2024-6-28 15:20
那大抵是这个问题了,现在设置为64K正常了,那比如设置0.5K的EEPROM,那偏移是给512还是64-0.5K的位置呢 ...

63.5
业余撸代码,专业开飞机
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:452
  • 最近打卡:2025-05-01 06:20:50
已绑定手机

13

主题

1257

回帖

2971

积分

金牌会员

积分
2971
发表于 2024-6-28 16:55:38 | 显示全部楼层
bea*** 发表于 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
回复 支持 反对

使用道具 举报 送花

1

主题

3

回帖

17

积分

新手上路

积分
17
发表于 2024-6-29 09:49:13 | 显示全部楼层
清楚了,结构图如下

|      code                                 |      eeprom           |
0                                           FE00                       FFFF

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

具体是否是这样,有时间再做个测试看看
回复 支持 反对

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-5-2 06:10 , Processed in 0.158360 second(s), 102 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表