Dspic33EP512*写flash的问题

2019-03-25 18:50发布

用的是Dspic33ep512GM310,把一些参数写在flash里面保存,写的地址是0x52400,在擦除和写之后,Usart中断就停止工作了,是不是我的擦除函数和写函数有问题,熟悉的帮我看下
uint8 PageErase( uint32 flashAddress )
{
    NVMADR = ( flashAddress & 0xffff );
    NVMADRU = ( (flashAddress >> 16) & 0xffff );
       
    while(NVMCONbits.WR);
    NVMCON = 0x4003;
    __builtin_disi( 6);
    __builtin_write_NVM();
    Nop();
    Nop();
    while(NVMCONbits.WR);
    Nop();
    Nop();
    NVMCONbits.WREN=0;
    Nop();

    if( (NVMCONbits.WRERR == 1) || (NVMCONbits.URERR == 1) )
    {
        return ( WRERR_OR_UERR_ERROR );
    }
    else
    {
        return ( NO_ERROR );
    }
}
uint8  WordWrite( uint32 flashAddress, uint16 ramBuffer1,uint16 ramBuffer2)
{
    // Set up the NVMADR registers to the starting address of the page
    NVMADR = ( flashAddress & 0xFFFF );
    NVMADRU = ( (flashAddress >> 16) & 0xFFFF );
    NVMCON = 0x4001;
    TBLPAG=0xfa;
    __builtin_tblwtl(0x0000,ramBuffer1);//(( flashAddress & 0xFFFF ),ramBuffer);
    __builtin_tblwth(0x0001,0x00);//(( flashAddress & 0xFFFF )+1,0x00);
    __builtin_tblwtl(0x0002,ramBuffer2);
    __builtin_tblwth(0x0003,0x00);
    __builtin_disi( 6);
    __builtin_write_NVM();

    if( (NVMCONbits.WRERR == 1) || (NVMCONbits.URERR == 1) )
    {
        return ( WRERR_OR_UERR_ERROR );
    }
    else
    {
        return ( NO_ERROR );
    }

}

此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
12条回答
lounny_wu
1楼-- · 2019-03-26 11:40
各位工程大咖们,方案这块有用到硬件加密芯片,保护软件,防止抄板的,请联系我。QQ:937684930
风铃
2楼-- · 2019-03-26 17:27
 精彩回答 2  元偷偷看……
yuyuyu2517
3楼-- · 2019-03-26 22:23
风铃 发表于 2017-5-19 14:40
手册好像是XC16编译器的使用手册

楼主能把文档分享下吗,我刚找了下XC16编译器的手册,里面并没有提到这些接口函数
风铃
4楼-- · 2019-03-27 01:16
yuyuyu2517 发表于 2017-5-30 20:05
楼主能把文档分享下吗,我刚找了下XC16编译器的手册,里面并没有提到这些接口函数

uint8 PageErase( uint32 flashAddress )
uint8  WordWrite( uint32 flashAddress, uint16 ramBuffer1,uint16 ramBuffer2)
这两函数是自己写的,__builtin_tblwth(),__builtin_write_NVM();这种是编译手册里有的
yuyuyu2517
5楼-- · 2019-03-27 02:31
风铃 发表于 2017-6-1 13:45
uint8 PageErase( uint32 flashAddress )
uint8  WordWrite( uint32 flashAddress, uint16 ra ...

了解,非常感谢!
您能再分享下读取flash的函数吗?
我现在用的dspic33ep16gs202,也同样需要在flash某地址保存几个字节的参数,我想用你的代码试试看
风铃
6楼-- · 2019-03-27 06:17
yuyuyu2517 发表于 2017-6-1 16:13
了解,非常感谢!
您能再分享下读取flash的函数吗?
我现在用的dspic33ep16gs202,也同样需要在flash ...

uint16_t WordRead( uint32_t flashAddress )
{
    uint16_t i;
    int savedTBLPAG=0;
    savedTBLPAG = TBLPAG;
    TBLPAG=((flashAddress>>16)&0xff);
    i=__builtin_tblrdl((flashAddress&0xffff));
TBLPAG=savedTBLPAG ;
    return i;

}

一周热门 更多>