搜索
bottom↓
回复: 6

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

[复制链接]

出0入0汤圆

发表于 2017-7-5 17:45:18 | 显示全部楼层 |阅读模式
dspic33f芯片没有内部EEPROM,仅有的一个数据需要存储且掉电能保存,
用表读表写功能实现吗?刚看了一下没怎么看懂,明天就要交货了。
18的芯片还可以用flashwrite.c和flashread.c两个文件操作,33f的芯片不知道怎么弄了。

出0入0汤圆

发表于 2017-7-5 17:49:37 | 显示全部楼层
写进flash不就行了吗?

出0入0汤圆

 楼主| 发表于 2017-7-5 19:59:58 | 显示全部楼层
sme 发表于 2017-7-5 17:49
写进flash不就行了吗?

纠结的就是不会  “写进flash”的方法

出0入0汤圆

发表于 2017-7-5 21:05:09 | 显示全部楼层
  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. }
复制代码

出0入8汤圆

发表于 2017-7-6 18:44:24 来自手机 | 显示全部楼层
哎呀,我不看好您做的这个产品。。。。太仓促了。

出0入0汤圆

 楼主| 发表于 2017-7-26 15:19:54 | 显示全部楼层
tongdayusu 发表于 2017-7-6 18:44
哎呀,我不看好您做的这个产品。。。。太仓促了。

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

出0入0汤圆

发表于 2017-7-27 21:33:09 | 显示全部楼层
可以写在程序空间没有用到的FLASH里边
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-20 04:24

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表