2020-02-06 09:55发布
sme 发表于 2017-7-5 17:49 写进flash不就行了吗?
tongdayusu 发表于 2017-7-6 18:44 哎呀,我不看好您做的这个产品。。。。太仓促了。
最多设置5个标签!
纠结的就是不会 “写进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,[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;
- }
- }
复制代码之所以想这个办法是因为外部存储芯片仓库用完了,而且后面也不准备用它了。
现在能够在程序区数据,不过没这么干,还是花高价从市场买了存储芯片,求的就是稳定。
一周热门 更多>