dsPIC33EP64GP503 Flash擦除失效问题求助
dsPIC33EP64GP503 Flash页擦除失效排查方案
结合你描述的情况(可写入Flash但擦除无效果、无调试器仅靠CAN验证、已调整页边界并使用官方汇编擦除函数),以下是针对性的排查点:
核心排查方向
解锁序列与操作流程正确性
dsPIC的Flash擦除必须严格遵循解锁流程,任何步骤顺序错误都会导致操作失效:- 确认汇编函数中是否先设置
NVMCON为页擦除模式(低5位操作码设为0x04,ERASE位置1); - 检查解锁序列的写入顺序:必须先写
0x0000到NVMKEY,再依次写入0xAA99、0x5566,最后置NVMCON的WR位启动擦除; - 擦除完成后必须等待
NVMCON的WR位自动清零,才能执行后续操作——如果没等待就读取,会读到旧数据误以为擦除失败。
- 确认汇编函数中是否先设置
目标页地址与存储器区域合法性
- 确认结构体所在页的起始地址属于程序Flash区域,而非配置位、引导区等受保护区域(参考器件存储器映射表);
- 检查
NVMADRU和NVMADR寄存器是否正确加载了目标页的24位起始地址——dsPIC33的程序地址是24位,高8位存于NVMADRU,低16位存于NVMADR,漏设高位会导致擦除错误区域。
写保护与寄存器配置检查
- 确认
NVMCON的WREN位(写使能)在解锁前已置1; - 检查器件写保护相关寄存器(如
WPEND、WPCFG),确保目标页未被纳入写保护范围; - 排查是否误设
CFGS位,导致操作指向配置空间而非程序Flash。
- 确认
擦除操作的执行触发检查
由于无法用调试器,可通过CAN输出以下信息验证:- 擦除操作调用前后,输出
NVMCON的寄存器值,确认擦除模式、写使能位是否正确配置; - 擦除完成后立刻读取
byStructValid的值:若仍为0x11,说明擦除未执行;若变为0xFF后又被改写,需排查是否擦除后未正确执行写入逻辑,或擦除函数未被正确调用。
- 擦除操作调用前后,输出
汇编擦除函数的关键核对点
以下是dsPIC33EP页擦除的标准流程(对照你的代码片段检查):
; 1. 设置页擦除模式 MOV #0x4004, W0 ; NVMCON = 0x4004 (ERASE=1, 操作码0x04=页擦除) MOV W0, NVMCON ; 2. 加载目标页24位地址(示例:页起始地址0x120000) MOV #0x00, W1 ; NVMADRU = 0x00(高8位) MOV W1, NVMADRU MOV #0x1200, W0 ; NVMADR = 0x1200(低16位) MOV W0, NVMADR ; 3. 开启写使能 BSR NVMCON, #WREN ; 4. 执行解锁序列 MOV #0x0000, W0 MOV W0, NVMKEY MOV #0xAA99, W0 MOV W0, NVMKEY MOV #0x5566, W0 MOV W0, NVMKEY ; 5. 启动擦除 BSR NVMCON, #WR ; 6. 等待擦除完成(WR位自动清零) WAIT_ERASE: BTSS NVMCON, #WR BRA WAIT_ERASE ; 7. 关闭写使能 BCLR NVMCON, #WREN
内容的提问来源于stack exchange,提问作者A Mir
相关产品推荐
相关产品推荐

