专家
公告
财富商城
电子网
旗下网站
首页
问题库
专栏
标签库
话题
专家
NEW
门户
发布
提问题
发文章
PIC单片机
dspic33f芯片没有内部EEPROM,仅有的一个数据需要存储且掉电...
2020-02-06 09:55
发布
×
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮
站内问答
/
51单片机
2698
7
7
dspic33f芯片没有内部EEPROM,仅有的一个数据需要存储且掉电能保存,
用表读表写功能实现吗?刚看了一下没怎么看懂,明天就要交货了。
18的芯片还可以用flashwrite.c和flashread.c两个文件操作,33f的芯片不知道怎么弄了。
友情提示:
此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
7条回答
cheungman
2020-02-06 23:55
#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,[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;
}
}
复制代码
加载中...
查看其它7个回答
一周热门
更多
>
相关问题
PIC单片机不同的IO口驱动74HC573驱动共阴极的数码管,有的段不亮
1 个回答
一种简单精确的pic延时方法
21 个回答
谁熟悉PIC的产品发布时间的,帮看看PIC18F47K40啥版本IDE能开发
12 个回答
求AN1078对应的源代码下载地址
5 个回答
PIC单片机应用技巧
4 个回答
相关文章
一种用PIC单片机主时钟驱动的老式挂钟
0个评论
×
关闭
采纳回答
向帮助了您的知道网友说句感谢的话吧!
非常感谢!
确 认
×
关闭
编辑标签
最多设置5个标签!
PIC单片机
保存
关闭
×
关闭
举报内容
检举类型
检举内容
检举用户
检举原因
广告推广
恶意灌水
回答内容与提问无关
抄袭答案
其他
检举说明(必填)
提交
关闭
×
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮
×
付费偷看金额在0.1-10元之间
确定
×
关闭
您已邀请
0
人回答
查看邀请
擅长该话题的人
回答过该话题的人
我关注的人
- #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,[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;
- }
- }
复制代码一周热门 更多>