当我为这个芯片做引导加载器时,我发现如果一次写一条指令如下,那么一段时间有些位会出错(例如0x040400有些时候会变成0x050400),这段代码是dspic33ep512mu810的演示,在dspic33ep512mu810上它工作得很好,但是这里写错了,然后我改写两个in结构一次,它工作,我不知道为什么,如果“WR”标志返回错误的消息,如果“WR”错误,下一个指令写将把0xff写到最后一个地址,如果上次没有完成所有位,一些位将错误地写“1”UINT NVMemWriteWord(UINT32地址,UINT32数据){DWORD_VAL写Address;DWORD_VAL writeData;writeAddress.Val=address;writeData.Val=data;NVMCON=0x4001;NVMADRU= WordDras.Word.HW;NVMADR = WraveAddio.Word.LW;/ /设置“锁存器”的表地址。从临时锁存器将数据编程到Flash中。TBLPAG=0xFA;//可以在//单个操作中编程的最小数据块是2个指令字(6个字节+2个幻影字节)。/或根据地址屏蔽高或低指令字,并写入高或低指令字。如果(地址% 4){Sy-Buff
tiNIN TBLWTL(0,0xFFFF);/ /将1ST指令的低字掩蔽到锁存器中。(1,0x00 FF);/ /将1ST指令的高字掩蔽到锁存器中。(8位数据+8位“幻象数据”(幻象字节总是0)u builtin_tblwtl(2,writeData.word.LW);//将第2条指令的低位字写入锁存器_builtin_tblwth(3,writeData.word.HW);//将第2条指令的高位字写入锁存器}否则{_builtin_tblwtl(0,wri将1-st指令的低级单词写入锁存器_builtin_tblwth(1,writeData.word.HW);//将1-st指令的高级单词写入锁存器_builtin_tblwtl(2,0xFFFFFF);//将第2-nd指令的低级单词屏蔽到锁存器中。(3,0x00 FF);/ /将2-ND指令的高字掩蔽到锁存器中。(8位数据+8位“幻象数据”(幻象字节总是0)}INTCON2bits.GIE=0;//禁用中断,用于解锁序列_u builtin_write_NVM()的下几个指令;而(NVMCONbits.WR==1){}INTCON2bits.GIE=1;//Re-enable中断(如果需要的话)//Re.WRERR状态。返回nvMcNord.Wrrr;}