[DemoCode下载] N76E003 flash模拟EEPROM例程

[复制链接]
3870|16
 楼主| yiyigirl2014 发表于 2018-4-14 10:02 | 显示全部楼层 |阅读模式
N76E003 flash.zip (1.98 KB, 下载次数: 129)
本例程可以一次读写多个字节,支持跨页读写。并且在写入前会对待写入区域检测是否是空白的,如果空白就不执行擦除动作就直接写入数据,这样可以节省时间。
 楼主| yiyigirl2014 发表于 2018-4-14 10:02 | 显示全部楼层
  1. //=======================================================================================                                                                                                      */
  2. // Copyright(c) 2017 Nuvoton(SH) Technology Corp. All rights reserved.                       
  3. // Website: http://www.nuvoton.com
  4. // Date   : 6/1/2017
  5. //=======================================================================================                                                                                                      */
  6. #include "N76E003.h"
  7. #include "SFR_Macro.h"
  8. #include "Function_define.h"
  9. #include "Flash.h"





  10. /******************************************************************************************************************/       


  11. void main (void)
  12. {
  13.         UINT8 xdata datatemp[8];       

  14.         datatemp[0]=0x10;
  15.         datatemp[1]=0x21;
  16.         datatemp[2]=0x32;
  17.         datatemp[3]=0x43;

  18.     WriteDataFlash (0x3800,datatemp+0,1);
  19.         WriteDataFlash (0x3801,datatemp+1,3);
  20.         ReadDataFlash (0x3800,datatemp+4,4);
  21.     while(1)
  22.         {
  23. //                                printf ("\n data temp = 0x%bx", datatemp);
  24.         }
  25. }
 楼主| yiyigirl2014 发表于 2018-4-14 10:03 | 显示全部楼层
  1. #ifndef  __FLASH_H
  2. #define  __FLASH_H

  3. #define     CID_READ            0x0B
  4. #define     DID_READ            0x0C

  5. #define     PAGE_ERASE_AP       0x22
  6. #define     BYTE_READ_AP        0x00
  7. #define     BYTE_PROGRAM_AP     0x21
  8. #define     PAGE_SIZE           128u

  9. #define     ERASE_FAIL          0x70
  10. #define     PROGRAM_FAIL        0x71
  11. #define     IAPFF_FAIL          0x72
  12. #define     IAP_PASS            0x00



  13. //=======================================================================================
  14. // 输入 u16_addr,  待写入APROM的起始地址
  15. //      pDat,      待写数据的起始地址
  16. //      num,       总共写入数据的字节数
  17. //支持跨page写,写数据时不需要擦flash,函数内部会自己擦除
  18. //=======================================================================================
  19. void WriteDataFlash(uint16_t u16_addr,uint8_t *pDat,uint16_t num);

  20. //=======================================================================================
  21. // 输入 u16_addr,  待读出APROM的起始地址
  22. //      pDat,      待读数据的起始地址
  23. //      num,       总共读出数据的字节数
  24. //支持跨page读
  25. //=======================================================================================
  26. void ReadDataFlash(uint16_t u16_addr,uint8_t *pDat,uint16_t num);
  27. #endif //__FLASH_H
 楼主| yiyigirl2014 发表于 2018-4-14 10:03 | 显示全部楼层
  1. /*---------------------------------------------------------------------------------------------------------*/
  2. /*                                                                                                         */
  3. /* Copyright(c) 2017 Nuvoton Technology Corp. All rights reserved.                                         */
  4. /*                                                                                                         */
  5. /*---------------------------------------------------------------------------------------------------------*/

  6. //***********************************************************************************************************
  7. //  Website: http://www.nuvoton.com
  8. //  E-Mail : MicroC-8bit@nuvoton.com
  9. //  Date   : Jan/21/2017
  10. //***********************************************************************************************************

  11. //***********************************************************************************************************
  12. //  File Function: N76E003 APROM program DATAFLASH as EEPROM way
  13. //***********************************************************************************************************
  14. #include "N76E003.h"
  15. #include "Flash.h"

  16. static bit EA_Save_bit;

  17. void Enable_IAP_Mode(void)
  18. {
  19.   EA_Save_bit=EA;
  20.         EA=0;
  21.         TA=0xAA;
  22.         TA=0x55;
  23.         CHPCON|=0x01 ;
  24.         TA=0xAA;
  25.         TA=0x55;
  26.         IAPUEN|=0x01;
  27.         EA=EA_Save_bit;
  28. }
  29. //-----------------------------------------------------------------------------------------------------------
  30. void Disable_IAP_Mode(void)
  31. {
  32.   EA_Save_bit=EA;
  33.   EA=0;
  34.   TA=0xAA;
  35.   TA=0x55;
  36.   IAPUEN&=~0x01;
  37.   TA=0xAA;
  38.   TA=0x55;
  39.   CHPCON&=~0x01;
  40.   EA=EA_Save_bit;
  41. }
  42. //-----------------------------------------------------------------------------------------------------------
  43. void Trigger_IAP(void)
  44. {
  45.         EA_Save_bit=EA;
  46.         EA=0;
  47.         TA=0xAA;
  48.         TA=0x55;
  49.         IAPTRG|=0x01;
  50.         EA=EA_Save_bit;
  51. }

  52.        
  53. uint8_t WriteDataToOnePage(uint16_t u16_addr,const uint8_t *pDat,uint8_t num)
  54. {
  55.   uint8_t i,offset;
  56.   uint8_t code *pCode;
  57.   uint8_t xdata xd_tmp[128];

  58.         Enable_IAP_Mode();
  59.         offset=u16_addr&0x007F;
  60.         i = PAGE_SIZE - offset;
  61.         if(num>i)num=i;
  62.   pCode = (uint8_t code *)u16_addr;
  63.   for(i=0;i<num;i++)
  64.   {
  65.     if(pCode[i]!=0xFF)break;
  66.   }
  67.         if(i==num)
  68.         {
  69.           IAPCN =BYTE_PROGRAM_AP;
  70.                 IAPAL = u16_addr;
  71.                 IAPAH = u16_addr>>8;
  72.                 for(i=0;i<num;i++)
  73.                 {
  74.                         IAPFD = pDat[i];
  75.                         Trigger_IAP();
  76.                         IAPAL++;
  77.                 }
  78.                 for(i=0;i<num;i++)
  79.                 {
  80.                         if(pCode[i]!=pDat[i])break;
  81.                 }
  82.                 if(i!=num) goto WriteDataToPage20;
  83.         }
  84.         else
  85.         {
  86.                 WriteDataToPage20:
  87.                 pCode = (uint8_t code *)(u16_addr&0xff80);
  88.                 for(i=0;i<128;i++)
  89.                 {
  90.                         xd_tmp[i] = pCode[i];
  91.                 }
  92.                 for(i=0;i<num;i++)
  93.                 {
  94.                         xd_tmp[offset+i] = pDat[i];
  95.                 }
  96.                 do
  97.                 {
  98.                         IAPAL = (u16_addr&0xff80);
  99.                         IAPAH = u16_addr>>8;
  100.                         IAPCN = PAGE_ERASE_AP;
  101.                         IAPFD = 0xFF;       
  102.                         Trigger_IAP();
  103.                         IAPCN =BYTE_PROGRAM_AP;
  104.                         for(i=0;i<128;i++)
  105.                         {
  106.                                 IAPFD = xd_tmp[i];
  107.                                 Trigger_IAP();
  108.                                 IAPAL++;
  109.                         }
  110.                         for(i=0;i<128;i++)
  111.                         {
  112.                                 if(pCode[i]!=xd_tmp[i])break;
  113.                         }
  114.                 }while(i!=128);
  115.                
  116.         }
  117.         Disable_IAP_Mode();
  118.        
  119.         return num;
  120. }       

  121. //-------------------------------------------------------------------------
  122. void WriteDataFlash(uint16_t u16_addr,uint8_t *pDat,uint16_t num)
  123. {
  124.         uint8_t CPageAddr,EPageAddr,cnt;
  125.         CPageAddr=u16_addr>>7;
  126.         EPageAddr=(u16_addr+num)>>7;
  127.         while(CPageAddr!=EPageAddr)
  128.         {
  129.                 cnt=WriteDataToOnePage(u16_addr,pDat,128);
  130.                 u16_addr+=cnt;
  131.                 pDat+=cnt;
  132.                 num-=cnt;
  133.                 CPageAddr=u16_addr>>7;
  134.         }
  135.         if(num)
  136.         {
  137.                 WriteDataToOnePage(u16_addr,pDat,num);
  138.         }
  139. }
  140. //-------------------------------------------------------------------------
  141. void ReadDataFlash(uint16_t u16_addr,uint8_t *pDat,uint16_t num)
  142. {
  143.         uint16_t i;
  144.         for(i=0;i<num;i++)
  145.     pDat[i] = *(uint8_t code *)(u16_addr+i);
  146. }
  147. //-----------------------------------------------------------------------------------------------------------
dongliushui 发表于 2018-4-14 10:24 | 显示全部楼层
是验证过的?收下了。
598330983 发表于 2018-4-14 17:24 | 显示全部楼层
  1. //******************************************************************************
  2. // This code illustrates how to use IAP to make APROM 201h as a byte of
  3. // Data Flash when user code is executed in APROM.
  4. //******************************************************************************
  5. #define PAGE_ERASE_AP 0x22
  6. #define BYTE_PROGRAM_AP 0x21
  7. /*Data Flash, as part of APROM, is read by MOVC. Data Flash can be defined as
  8. 128-element array in “code” area from absolute address 0x0200 */
  9. volatile unsigned char code Data_Flash[128] _at_ 0x0200;
  10. Main (void)
  11. {
  12. TA = 0xAA; //CHPCON is TA protected
  13. TA = 0x55;
  14. CHPCON |= 0x01; //IAPEN = 1, enable IAP mode
  15. TA = 0xAA; //IAPUEN is TA protected
  16. TA = 0x55;
  17. IAPUEN |= 0x01; //APUEN = 1, enable APROM update
  18. IAPCN = PAGE_ERASE_AP; //Erase page 200h~27Fh
  19. IAPAH = 0x02;
  20. IAPAL = 0x00;
  21. IAPFD = 0xFF;
  22. TA = 0xAA; //IAPTRG is TA protected
  23. TA = 0x55;
  24. IAPTRG |= 0x01; //write ‘1’ to IAPGO to trigger IAP process
  25. IAPCN = BYTE_PROGRAM_AP; // Program 201h with 55h
  26. IAPAH = 0x02;
  27. IAPAL = 0x01;
  28. IAPFD = 0x55;
  29. TA = 0xAA;
  30. TA = 0x55;
  31. IAPTRG |= 0x01; //write ‘1’ to IAPGO to trigger IAP process
  32. TA = 0xAA; //IAPUEN is TA protected
  33. TA = 0x55;
  34. IAPUEN &= ~0x01; //APUEN = 0, disable APROM update
  35. TA = 0xAA; //CHPCON is TA protected
  36. TA = 0x55;
  37. CHPCON &= ~0x01; //IAPEN = 0, disable IAP mode
  38. P0 = Data_Flash[1]; //Read content of address 200h+1
  39. while(1);
  40. }
huangcunxiake 发表于 2018-4-15 08:52 | 显示全部楼层
楼上的这个看着更简单。
gejigeji521 发表于 2018-4-15 10:45 | 显示全部楼层
官方提供的也有这个例子的。BSP里面。
pmw_56 发表于 2018-4-15 15:53 来自手机 | 显示全部楼层
幸福小强 发表于 2018-4-15 22:46 | 显示全部楼层
可以节约一片存储颗粒,还可以用于掉电数据保护。
zhuomuniao110 发表于 2018-4-16 17:17 | 显示全部楼层
通过IAP方式实现吗
yiy 发表于 2018-4-16 21:25 | 显示全部楼层
MARK,应该可以。
yiy 发表于 2018-4-16 21:26 | 显示全部楼层
这个用的人还是很多的。
shuben 发表于 2018-4-19 18:19 | 显示全部楼层
xuanhuanzi 发表于 2018-4-20 22:35 | 显示全部楼层
IAP下的一种操作方式。
dongliushui 发表于 2018-4-20 23:32 | 显示全部楼层
用IAP指令操作存储区
奇立电源 发表于 2019-5-23 22:31 来自手机 | 显示全部楼层
时间怎么样
您需要登录后才可以回帖 登录 | 注册

本版积分规则

230

主题

3676

帖子

10

粉丝
快速回复 在线客服 返回列表 返回顶部