Pic18F67K22无法读取0x10000地址以上程序存储器问题求助
问题根因与修复方案
按照触发概率从高到低排列可能的原因:
配置位读保护开启
PIC18F67K22的EBTR(扩展表读保护)系列配置位会限制CPU通过TBLRD指令读取指定区域的程序Flash,被保护区域读取返回固定值0x00,但ICD3这类调试器可以绕过读保护直接读取Flash物理内容,完全匹配你描述的现象。请检查MPLAB工程的配置位设置,关闭所有程序存储区的表读保护,尤其是0x10000以上高位区域对应的保护选项。TBLPTR寄存器赋值时Bank选择错误
你在Verify_Next_Block段给TBLPTRU赋值前,没有切换到TBLPTR寄存器所在的特殊功能寄存器Bank:此前你执行过banksel EE_25LC_addr_L切换到了自定义变量所在的通用寄存器Bank,此时直接执行movwf TBLPTRU实际写入的是通用寄存器区的对应地址,并未真正修改TBLPTRU的值,导致TBLPTRU一直停留在初始值0x00,访问超过0xFFFF的地址时直接回卷到低位地址,无法读取高位内容。
修复方案:在给TBLPTR系列寄存器赋值前显式切换Bank,示例如下:
Verify_Next_Block banksel TBLPTRL ; 新增:切换到TBLPTR寄存器所在Bank movf File_byte_Counter_Low,w movwf TBLPTRL movf File_byte_Counter_High,w movwf TBLPTRH movf File_byte_Counter_Upper,w movwf TBLPTRU
- EEPGD/CFGS位配置错误
TBLRD指令访问程序Flash要求EECON1寄存器的EEPGD=1、CFGS=0,如果之前操作EEPROM、配置位的逻辑修改过这两个位,校验阶段没有重新配置,就会导致TBLRD实际访问的是EEPROM或配置位空间,返回值为0x00。
修复方案:在校验循环开始前显式配置EECON1:
Jmp_V ; 新增:配置EECON1指向程序Flash BSF EECON1, EEPGD BCF EECON1, CFGS banksel EE_25LC_addr_L ...
内容的提问来源于stack exchange,提问作者Bobby
相关产品推荐
相关产品推荐

