dspic33f芯片没有内部EEPROM,仅有的一个数据需要存储且掉电...
dspic33f芯片没有内部EEPROM,仅有的一个数据需要存储且掉电能保存,用表读表写功能实现吗?刚看了一下没怎么看懂,明天就要交货了。
18的芯片还可以用flashwrite.c和flashread.c两个文件操作,33f的芯片不知道怎么弄了。 写进flash不就行了吗? sme 发表于 2017-7-5 17:49
写进flash不就行了吗?
{:smile:} 纠结的就是不会“写进flash”的方法 #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
哎呀,我不看好您做的这个产品。。。。太仓促了。
之所以想这个办法是因为外部存储芯片仓库用完了,而且后面也不准备用它了。
现在能够在程序区数据,不过没这么干,还是花高价从市场买了存储芯片,求的就是稳定。 可以写在程序空间没有用到的FLASH里边
页:
[1]