项目中需要用到对flash的操作,按照官网给的例子不能操作,网上找了一份也不行,在程序存储器中没有观察到写入的数据,望大神给看看。。。
例 4-1: 使用表指令访问程序存储器
#define PM_ROW_ERASE 0x4042
#define PM_ROW_WRITE 0x4001
#define CONFIG_WORD_WRITE0X4000
unsigned long Data;
/* Erase 512 instructions starting at address 0x12000 */
MemWriteLatch(0x1, 0x2000,0x0,0x0);
MemCommand(PM_ROW_ERASE);
/* Write 0x12345 into program address 0x12000 */
MemWriteLatch(0x1, 0x2000,0x0012,0x3456);
MemCommand(PM_ROW_WRITE);
/* Write 0x789ABC into program address 0x12002 */
MemWriteLatch(0x1, 0x2002,0x0078,0x9ABC);
MemCommand(PM_ROW_WRITE);
/* Read program addresses 0x12000 and 0x12002 */
Data = ReadLatch(0x1, 0x2000);
Data = ReadLatch(0x1, 0x2002);
/***********************************网上找到的**********************************************************************/
void PIC33_Flash_Erase(unsigned long add)//0.Flash擦除操作,一次擦除192*8=1536个字节的块或页。
{
//WREN=1(使能闪存编程/擦除操作) & ERASE=1(在下一条WR命令时执行NVMOP<3:0>指定的擦除操作) & NVMOP=0b0010(存储器页擦除操作)
while(NVMCONbits.WR);//判断上个写周期是否完成?由写操作完成后硬件清零。写控制位。
NVMCON = 0x4042;
//注:高[23:16]位页地址:
TBLPAG = ((add>>16)&0xff);//将(页面边界)高8位地址写入程序存储地址的高8位TBLPAG(0x0032),初始化时页面边界寄存器
__builtin_tblwtl((add&0xffff),0xFF);//设置擦除程序存储单元页的基地址的<15:0>:低16位地址。
asm("DISI #0x3FFF"); //在k(最大2^14-1) 个指令周期内禁止中断
__builtin_write_NVM(); //解锁FLASH,并启动对闪存的写操作。相当于以下汇编指令:
while(NVMCONbits.WR); //判断写周期是否完成?
NVMCONbits.WREN=0; //写完后禁止闪存编程/ 擦除操作
asm("DISI #0X0000"); //重新使能中断
}
//1.写入Flash,1个半字16位数据的数据。
void PIC33_Flash_WriteHalfWord(unsigned long add, unsigned int dat)
{
PIC33_Flash_Erase(add);//先擦除FLASH,全部置1
//装载写缓冲器
NVMCON = 0x4001; //WREN=1(使能闪存编程/擦除操作) & ERASE=0(在下一条WR命令时执行NVMOP<3:0>指定的编程操作) & NVMOP=0b0001(存储器行编程操作)
TBLPAG = ((add>>16)&0xff);//初始化页面边界
__builtin_tblwtl((add&0xffff), dat); // 写低字进缓冲区[15:0]
__builtin_tblwth(((add&0xffff)+1), 0x00);// 写高字(8位)[23:16]进缓冲区,强制为设置为0xFF 或0x00,为一条NOP 指令
asm("DISI #0x3FFF"); //在k(最大2^14-1) 个指令周期内禁止中断
__builtin_write_NVM(); //使能对闪存的写操作。
asm("DISI #0X0000"); //确保写FLASH期间禁止中断
}
|