[DemoCode下载] APROM 编程数据Flash

[复制链接]
1410|13
 楼主| 643757107 发表于 2017-1-26 10:24 | 显示全部楼层 |阅读模式
  1. /*---------------------------------------------------------------------------------------------------------*/
  2. /*                                                                                                         */
  3. /* Copyright(c) 2015 Nuvoton Technology Corp. All rights reserved.                                         */
  4. /*                                                                                                         */
  5. /*---------------------------------------------------------------------------------------------------------*/

  6. //***********************************************************************************************************
  7. //  Nuvoton Technology Corp.
  8. //  E-mail: MicroC-8bit@nuvoton.com
  9. //***********************************************************************************************************
  10. //  Application: APROM program Data Flash Function
  11. //  ISP_AP.bin need to program to APROM
  12. //  Config0 bit0(DFEN) =0 (enable DFEN)
  13. //  Config1(CHBDA)=0x30
  14. //  Output : Test OK                  =>  P0 = 0
  15. //           Erase Data Verify err    =>  P0 = ~0xA1
  16. //           Program Data Verify err  =>  P0 = ~0xA2
  17. //***********************************************************************************************************

  18. //------------------------- <<< Use Configuration Wizard in Context Menu >>> --------------------------------
  19. // <h> UART pin Select
  20. //     <o0.6> UART pin
  21. //          <0=> Select P1.0, P1.1 as UART pin(default)
  22. //          <1=> Select P2.6, P2.7 as UART pin(28 pin only)
  23. // </h>
  24. //-------------------------------- <<< end of configuration section >>> -------------------------------------

  25. #define Uart_Port_Sel   0x00

  26. #include "N79E715.h"
  27. #include "Typedef.h"
  28. #include "Define.h"
  29. #include "Common.h"
  30. #include "Delay.h"
  31. #include "Version.h"

  32. #include <intrins.h>
  33. #include <stdio.h>
  34. #include <string.h>

  35. #define   ERASE_ALL_DATA        0x22
  36. #define   FLASH_READ_DATA       0x00
  37. #define   BYTE_PROGRAM_DATA     0x21

  38. #define   ERASE_ALL_CONFIG      0xE2
  39. #define   FLASH_READ_CONFIG     0xC0
  40. #define   BYTE_PROGRAM_CONFIG   0xE1
  41. bit EA_Save_bit;
  42. //-----------------------------------------------------------------------------------------------------------
  43. void Clear_BOF(void)
  44. {
  45.     EA_Save_bit = EA;
  46.     EA = 0;
  47.     TA = 0xAA;
  48.     TA = 0x55;
  49.     PMCR &= CLR_BIT3;
  50.     EA = EA_Save_bit;
  51. }
  52. //-----------------------------------------------------------------------------------------------------------
  53. void Enable_ISP_Mode(void)
  54. {
  55.     /* Enable ISP  */
  56.     EA_Save_bit = EA;
  57.     EA = 0;
  58.     TA = 0xAA;
  59.     TA = 0x55;
  60.     CHPCON |= 0x01;
  61.     EA = EA_Save_bit;
  62. }
  63. //-----------------------------------------------------------------------------------------------------------
  64. void Disable_ISP_Mode(void)
  65. {
  66.     /* Disable ISP */
  67.     EA_Save_bit = EA;
  68.     EA = 0;
  69.     TA = 0xAA;
  70.     TA = 0x55;
  71.     CHPCON &= 0xFE;
  72.     EA = EA_Save_bit;
  73. }
  74. //-----------------------------------------------------------------------------------------------------------
  75. void Trigger_ISP(void)
  76. {
  77.     EA_Save_bit = EA;
  78.     EA = 0;
  79.     EA = 0;
  80.     TA = 0xAA;
  81.     TA = 0x55;
  82.     ISPTRG |= 0x01;
  83.     EA = EA_Save_bit;
  84. }
  85. //-----------------------------------------------------------------------------------------------------------
  86. void Erase_DATA(void)
  87. {
  88.     UINT16 u16Count;

  89.     Enable_ISP_Mode();
  90.     P0 = ~0x01;
  91.     ISPCN = ERASE_ALL_DATA;

  92.     for(u16Count=96;u16Count<128;u16Count++)
  93.     {
  94.         ISPAL = LOBYTE(u16Count*128);               // 96*128=12288=0x3000
  95.         ISPAH = HIBYTE(u16Count*128);               // 96*128=12288=0x3000
  96.         Trigger_ISP();
  97.     }
  98.     Disable_ISP_Mode();
  99. }
  100. //-----------------------------------------------------------------------------------------------------------
  101. void Erase_DATA_Verify(void)
  102. {
  103.     UINT16 u16Count;

  104.     Enable_ISP_Mode();
  105.     P0 = ~0x02;
  106.     ISPAL = 0x00;
  107.     ISPAH = 0x30;
  108.     ISPCN = FLASH_READ_DATA;

  109.     for(u16Count=12288;u16Count<16384;u16Count++)
  110.     {
  111.         ISPFD = 0;
  112.         Trigger_ISP();

  113.         if(ISPFD != 0xFF)
  114.         {
  115.             printf ("\nEV err.");
  116.             P0 = ~0xA1;
  117.             while(1);
  118.         }

  119.         ISPAL++;
  120.         if(ISPAL == 0)
  121.         {
  122.             ISPAH++;
  123.         }
  124.     }
  125.     Disable_ISP_Mode();
  126. }
  127. //-----------------------------------------------------------------------------------------------------------
  128. void Program_DATA(void)
  129. {
  130.     UINT16 u16Count;

  131.     Enable_ISP_Mode();
  132.     P0 = ~0x03;
  133.     ISPAL = 0x00;
  134.     ISPAH = 0x30;
  135.     ISPFD = 0xFF;
  136.     ISPCN = BYTE_PROGRAM_DATA;

  137.     for(u16Count=12288;u16Count<16384;u16Count++)
  138.     {
  139.         ISPFD++;
  140.         Trigger_ISP();

  141.         ISPAL++;
  142.         if(ISPAL == 0)
  143.         {
  144.             ISPAH++;
  145.         }
  146.     }
  147.     Disable_ISP_Mode();
  148. }
  149. //-----------------------------------------------------------------------------------------------------------
  150. void Program_DATA_Verify(void)
  151. {
  152.     UINT16 u16Count;
  153.     UINT8  u8Read_Data;

  154.     Enable_ISP_Mode();
  155.     P0 = ~0x04;
  156.     ISPAL = 0x00;
  157.     ISPAH = 0x30;
  158.     u8Read_Data = 0x00;
  159.     ISPCN = FLASH_READ_DATA;

  160.     for(u16Count=12288;u16Count<16384;u16Count++)
  161.     {
  162.         Trigger_ISP();
  163.         if(ISPFD != u8Read_Data)
  164.         {
  165.             printf ("\nPV err.");
  166.             P0 = ~0xA2;
  167.             while(1);
  168.         }

  169.         ISPAL++;
  170.         if(ISPAL == 0)
  171.         {
  172.             ISPAH++;
  173.         }
  174.             u8Read_Data++;
  175.     }
  176.     Disable_ISP_Mode();
  177. }
  178. //-----------------------------------------------------------------------------------------------------------
  179. void main (void)
  180. {

  181.     Clear_BOF();
  182.     AUXR1 |= Uart_Port_Sel;             // Select P10/P11 as UART pin(default)
  183.     InitialUART0_Timer1(9600);          // 9600 Baud Rate [url=home.php?mod=space&uid=72445]@[/url] 11.0592MHz
  184.     Show_Version_Number_To_PC();
  185.     printf ("\n N79E84x ISP APROM Program Data Flash Sample Code.");

  186.     Erase_DATA();
  187.     Erase_DATA_Verify();
  188.     Program_DATA();
  189.     Program_DATA_Verify();

  190.     printf ("\n N79E715 ISP APROM Program Data Flash OK!\n");

  191.     P14 = 0;
  192.     P21 = 0;
  193.     while(1);
  194. }
  195. //-----------------------------------------------------------------------------------------------------------


 楼主| 643757107 发表于 2017-1-26 10:25 | 显示全部楼层
那些无参函数实际上就是固定的形式,直接拿来用就行了。
 楼主| 643757107 发表于 2017-1-26 11:23 | 显示全部楼层
编程后,还要编程核验。
捉虫天师 发表于 2017-1-26 13:55 | 显示全部楼层
编写和擦除都要进行校验
zhuomuniao110 发表于 2017-1-26 17:59 | 显示全部楼层
这个功能可以用多余的空间存储一些数据。
734774645 发表于 2017-1-26 19:04 | 显示全部楼层
Flash memory for program memory(FLASH中的用户程序存储器)=APROM Flash memory for loader(FLASH中的程序管理区)=LDROM
dongnanxibei 发表于 2017-1-26 19:55 | 显示全部楼层
搞明白这几个操作顿时就高大上了,还可以节约成本。
heisexingqisi 发表于 2017-1-26 20:04 | 显示全部楼层
用这个功能可以利用没有被使用的空间啊
gejigeji521 发表于 2017-1-26 20:20 | 显示全部楼层
其实有多种编程的方法,不过归根结底是相同的。
huangcunxiake 发表于 2017-1-26 20:33 | 显示全部楼层
根据这个例程可以很好的理解这个操作的方法和原理。
wahahaheihei 发表于 2017-1-27 13:42 | 显示全部楼层
利用这个可以做Bootloader吧。
dongnanxibei 发表于 2017-1-27 15:18 | 显示全部楼层
对存储空间编程确实可以啊。
天灵灵地灵灵 发表于 2017-1-27 17:08 | 显示全部楼层
大过年的来看看有什么好玩的没
zhuotuzi 发表于 2017-1-28 09:48 | 显示全部楼层
通过这些在程序的编程可以做很多事情。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

223

主题

3972

帖子

11

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