fangjikun 发表于 2017-7-5 17:45:18

dspic33f芯片没有内部EEPROM,仅有的一个数据需要存储且掉电...

dspic33f芯片没有内部EEPROM,仅有的一个数据需要存储且掉电能保存,
用表读表写功能实现吗?刚看了一下没怎么看懂,明天就要交货了。
18的芯片还可以用flashwrite.c和flashread.c两个文件操作,33f的芯片不知道怎么弄了。

sme 发表于 2017-7-5 17:49:37

写进flash不就行了吗?

fangjikun 发表于 2017-7-5 19:59:58

sme 发表于 2017-7-5 17:49
写进flash不就行了吗?

{:smile:} 纠结的就是不会“写进flash”的方法

cheungman 发表于 2017-7-5 21:05:09

#ifndef __FLASH_H__
#define __FLASH_H__

#define FLASH_ERASE_PAGE         0x4042
#define FLASH_WRITE_BLOCK        0x4001
#define FLASH_WRITE_WORD        0x4003

typedef struct
{
        unsigned char lowData;
        unsigned char midData;
        unsigned char highData;
        unsigned char nothing;
}FLASHFRAME;

extern void FlashErasePage(unsigned long flashAddr);
extern void FlashWrite3Byte(unsigned long flashAddr, FLASHFRAME *flashFrame);
extern void FlashWriteBlock(unsigned long flashAddr, unsigned char *Dest);
extern void FlashRead3Byte(unsigned long flashAddr, FLASHFRAME *flashFrame);
extern void FlashReadBlock(unsigned long flashAddr,unsigned char *Dest);

#endif


/**************************************************************************************************
        PIC24H闪存程序存储器阵列以64条指令(每条指令
包含3个字节, 即192 字节)为1行(或“块”)。
        运行时自编程(Run-Time Self-Programming, RTSP)
允许用户一次擦除由 8 行数据(512条指令, 1536 字节)
组成的程序存储器页,一次将 64 条指令(192 字节)的1
行或单条指令写入程序存储器.
**************************************************************************************************/

#if defined(__dsPIC33F__)
        #include <p33Fxxxx.h>
#elif defined(__PIC24H__)
        #include <p24Hxxxx.h>
#elif defined(__PIC24F__)
        #include <p24Fxxxx.h>
#endif

#include "flash.h"

/********************************************************************************************
* 函数名称:void FlashProgCycle(void)
* 函数功能:启动编程时序
* 入口参数:无
* 出口参数:无
* 说    明:
*********************************************************************************************/
void FlashProgCycle(void)
{
           NVMKEY = 0x55;
           NVMKEY = 0xaa;
           _WR = 1;
           Nop();
           Nop();
}

/********************************************************************************************
* 函数名称:void FlashErasePage(unsigned long flashAddr)
* 函数功能:在指定的FLASH地址上擦除8行块,512条指令,1536字节
* 入口参数:flashAddr:指定要擦除Flash 8行块的起始地址(0x400的倍数)
* 出口参数:无
* 说    明:对FLASH进行块擦除操作时, 擦除的起始地址应该是0x400的倍数;
*********************************************************************************************/
void FlashErasePage(unsigned long flashAddr)
{        
           NVMCON = FLASH_ERASE_PAGE;
          
        TBLPAG = ((flashAddr & 0x7F0000)>>16);
        flashAddr = (flashAddr & 0x00FFFF);
    asm("tblwtl w0,");

        FlashProgCycle();
}

/********************************************************************************************
* 函数名称:void FlashWrite3Byte(unsigned long flashAddr, FLASHFRAME *flashFrame)
* 函数功能:在指定的FLASH地址上写入1条指令,3个字节
* 入口参数:flashAddr:指定写入的起始地址;
                        *flashFrame:待写入的数据(3个字节, 包含lowData,midData,highData);
* 出口参数:无
* 说    明:
*********************************************************************************************/
void FlashWrite3Byte(unsigned long flashAddr, FLASHFRAME *flashFrame)
{
           NVMCON = FLASH_WRITE_WORD;
                  
        TBLPAG = ((flashAddr & 0x7F0000)>>16);
        flashAddr = (flashAddr & 0x00FFFF);

        asm("tblwtl.b %1,[%0]"::"r"(flashAddr),"d"(flashFrame->lowData));
    asm("tblwth.b %1,[%0]"::"r"(flashAddr),"d"(flashFrame->highData));
    flashAddr++;
    asm("tblwtl.b %1,[%0]"::"r"(flashAddr),"d"(flashFrame->midData));

        FlashProgCycle();
}

/********************************************************************************************
* 函数名称:void FlashWriteBlock(unsigned long flashAddr, unsigned char *Dest)
* 函数功能:在指定的FLASH地址上写入1行块,64条指令,192字节
* 入口参数:flashAddr:指定写入的起始地址(0x80的倍数);
                        *Dest:待写入的数据(192字节);
* 出口参数:无
* 说    明:写入的起始地址应该是0x80的倍数;
*********************************************************************************************/
void FlashWriteBlock(unsigned long flashAddr, unsigned char *Dest)
{
    unsigned int i;

           NVMCON = FLASH_WRITE_BLOCK;
          
        TBLPAG = ((flashAddr & 0x7F0000)>>16);
        flashAddr = (flashAddr & 0x00FFFF);
          
           for(i=0; i<64; i++)
        {       
                asm("tblwtl.b %0,[%1]"::"r"(*Dest),"d"(flashAddr));
            Dest++;
            asm("tblwtl.b %0,[%1]"::"r"(*Dest),"d"(flashAddr+1));
            Dest++;
            asm("tblwth.b %0,[%1]"::"r"(*Dest),"d"(flashAddr));
            Dest++;
            Dest++;
                   flashAddr += 2;
           }

        FlashProgCycle();
}

/********************************************************************************************
* 函数名称:void FlashRead3Byte(unsigned long flashAddr, FLASHFRAME *flashFrame)
* 函数功能:从指定地址读取1条指令
* 入口参数:flashAddr:读指定地址上的1条指令
* 出口参数:*flashFrame:保存读取到数据
* 说    明:
*********************************************************************************************/
void FlashRead3Byte(unsigned long flashAddr, FLASHFRAME *flashFrame)
{       
        flashAddr = (flashAddr & 0x00FFFF);
        TBLPAG = ((flashAddr & 0x7F0000)>>16);
       
        asm("tblrdl.b [%1],%0":"=r"(flashFrame->lowData):"r"(flashAddr));
    asm("tblrdl.b [%1],%0":"=r"(flashFrame->midData):"r"(flashAddr+1));
           asm("tblrdh.b [%1],%0":"=r"(flashFrame->highData):"r"(flashAddr));
}

/********************************************************************************************
* 函数名称:void FlashReadBlock(unsigned long flashAddr, unsigned char *Dest)
* 函数功能:从指定地址读取1行块,64条指令,192字节
* 入口参数:flashAddr:指定要读取数据的起始地址
* 出口参数:*Dest:保存读取到数据
* 说    明:
*********************************************************************************************/
void FlashReadBlock(unsigned long flashAddr, unsigned char *Dest)
{
        unsigned int i;
       
        TBLPAG = ((flashAddr & 0x7F0000)>>16);
        flashAddr = (flashAddr & 0x00FFFF);
       
           for(i=0; i<64; i++)
        {
            asm("tblrdl.b [%1],%0":"=r"(*Dest):"r"(flashAddr));
      Dest++;
               asm("tblrdl.b [%1],%0":"=r"(*Dest):"r"(flashAddr+1));
      Dest++;
              asm("tblrdh.b [%1],%0":"=r"(*Dest):"r"(flashAddr));
               Dest++;
               *Dest = 0x00;
               Dest++;          
               flashAddr += 2;
        }
}

tongdayusu 发表于 2017-7-6 18:44:24

哎呀,我不看好您做的这个产品。。。。太仓促了。

fangjikun 发表于 2017-7-26 15:19:54

tongdayusu 发表于 2017-7-6 18:44
哎呀,我不看好您做的这个产品。。。。太仓促了。

之所以想这个办法是因为外部存储芯片仓库用完了,而且后面也不准备用它了。
现在能够在程序区数据,不过没这么干,还是花高价从市场买了存储芯片,求的就是稳定。

mandzy 发表于 2017-7-27 21:33:09

可以写在程序空间没有用到的FLASH里边
页: [1]
查看完整版本: dspic33f芯片没有内部EEPROM,仅有的一个数据需要存储且掉电...