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

2020-02-06 09:55发布

dspic33f芯片没有内部EEPROM,仅有的一个数据需要存储且掉电能保存,
用表读表写功能实现吗?刚看了一下没怎么看懂,明天就要交货了。
18的芯片还可以用flashwrite.c和flashread.c两个文件操作,33f的芯片不知道怎么弄了。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
7条回答
cheungman
2020-02-06 23:55
  1. #ifndef __FLASH_H__
  2. #define __FLASH_H__

  3. #define FLASH_ERASE_PAGE         0x4042
  4. #define FLASH_WRITE_BLOCK          0x4001
  5. #define FLASH_WRITE_WORD        0x4003

  6. typedef struct
  7. {
  8.         unsigned char lowData;
  9.         unsigned char midData;
  10.         unsigned char highData;
  11.         unsigned char nothing;
  12. }FLASHFRAME;

  13. extern void FlashErasePage(unsigned long flashAddr);
  14. extern void FlashWrite3Byte(unsigned long flashAddr, FLASHFRAME *flashFrame);
  15. extern void FlashWriteBlock(unsigned long flashAddr, unsigned char *Dest);
  16. extern void FlashRead3Byte(unsigned long flashAddr, FLASHFRAME *flashFrame);
  17. extern void FlashReadBlock(unsigned long flashAddr,unsigned char *Dest);

  18. #endif
复制代码

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

  9. #if defined(__dsPIC33F__)
  10.         #include <p33Fxxxx.h>
  11. #elif defined(__PIC24H__)
  12.         #include <p24Hxxxx.h>
  13. #elif defined(__PIC24F__)
  14.         #include <p24Fxxxx.h>
  15. #endif

  16. #include "flash.h"

  17. /********************************************************************************************
  18. * 函数名称:void FlashProgCycle(void)
  19. * 函数功能:启动编程时序
  20. * 入口参数:无
  21. * 出口参数:无
  22. * 说    明:
  23. *********************************************************************************************/
  24. void FlashProgCycle(void)
  25. {
  26.            NVMKEY = 0x55;
  27.            NVMKEY = 0xaa;
  28.            _WR = 1;
  29.            Nop();
  30.            Nop();
  31. }

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

  46.         FlashProgCycle();
  47. }

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

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

  66.         FlashProgCycle();
  67. }

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

  79.            NVMCON = FLASH_WRITE_BLOCK;
  80.           
  81.           TBLPAG = ((flashAddr & 0x7F0000)>>16);
  82.         flashAddr = (flashAddr & 0x00FFFF);
  83.           
  84.            for(i=0; i<64; i++)
  85.         {       
  86.                 asm("tblwtl.b %0,[%1]"::"r"(*Dest),"d"(flashAddr));
  87.             Dest++;
  88.             asm("tblwtl.b %0,[%1]"::"r"(*Dest),"d"(flashAddr+1));
  89.             Dest++;
  90.             asm("tblwth.b %0,[%1]"::"r"(*Dest),"d"(flashAddr));
  91.             Dest++;
  92.             Dest++;
  93.                    flashAddr += 2;
  94.            }

  95.         FlashProgCycle();
  96. }

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

  113. /********************************************************************************************
  114. * 函数名称:void FlashReadBlock(unsigned long flashAddr, unsigned char *Dest)
  115. * 函数功能:从指定地址读取1行块,64条指令,192字节
  116. * 入口参数:flashAddr:指定要读取数据的起始地址
  117. * 出口参数:*Dest:保存读取到数据
  118. * 说    明:
  119. *********************************************************************************************/
  120. void FlashReadBlock(unsigned long flashAddr, unsigned char *Dest)
  121. {
  122.         unsigned int i;
  123.        
  124.         TBLPAG = ((flashAddr & 0x7F0000)>>16);
  125.         flashAddr = (flashAddr & 0x00FFFF);
  126.        
  127.            for(i=0; i<64; i++)
  128.         {
  129.             asm("tblrdl.b [%1],%0":"=r"(*Dest):"r"(flashAddr));
  130.         Dest++;
  131.                asm("tblrdl.b [%1],%0":"=r"(*Dest):"r"(flashAddr+1));
  132.         Dest++;
  133.               asm("tblrdh.b [%1],%0":"=r"(*Dest):"r"(flashAddr));
  134.                Dest++;  
  135.                *Dest = 0x00;
  136.                Dest++;            
  137.                flashAddr += 2;
  138.         }
  139. }
复制代码

一周热门 更多>