打印
[PIC®/AVR®/dsPIC®产品]

新人求助:PIC33F Flash的读写,擦除操作

[复制链接]
1032|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
爱飞吉|  楼主 | 2017-7-21 16:47 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
项目中需要用到对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期间禁止中断
}

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

1

帖子

0

粉丝