找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2477|回复: 0
收起左侧

松翰5703例程-ISP

[复制链接]
ID:856645 发表于 2020-12-8 11:19 | 显示全部楼层 |阅读模式
  1. //-----------------------------------------------------------------------------
  2. //  FILE:   ISP.c
  3. //-----------------------------------------------------------------------------
  4. //  Copyright 2014 SONiX Technology Corp. All rights reserved.
  5. //
  6. //  AUTHOR:     SONIX
  7. //  DATE:       2015/08/16

  8. //  CheckSum = 0xC0BD

  9. //
  10. //  The program is an example of ISP to implement it.
  11. //   
  12. //  ISP decription:
  13. //      ISP operation follow -
  14. //          Step 1. set start ROM Address
  15. //          Step 2. set start RAM Address
  16. //          Step 3. execute Page Erase and Write
  17. //
  18. //-----------------------------------------------------------------------------
  19. // Includes
  20. //-----------------------------------------------------------------------------
  21. #include <SN8F5703.h>
  22. #include "GenericTypeDefs.h"
  23. #include <absacc.h>
  24. #include <intrins.h>                            // for _nop_

  25. //-----------------------------------------------------------------------------
  26. //用户可以修改这个常量值,即修改ISP的地址
  27. //ISP每次写入固定都是一页(32BYTE)
  28. //不管地址是否是一页的开始,都从一页的开始写起,如果写入数据不足一页,剩余全部写为0x00
  29. //-----------------------------------------------------------------------------
  30. #define L_ispaddr 0x02F0                                                                                                //isp addr 0x02F0
  31. unsigned char code MyBuf[32] _at_ L_ispaddr;                //define 32byte 绝对地址
  32. //-----------------------------------------------------------------------------
  33. //
  34. //-----------------------------------------------------------------------------
  35. unsigned  int j;      
  36. //-----------------------------------------------------------------------------
  37. // Global Constants
  38. //-----------------------------------------------------------------------------

  39. //-----------------------------------------------------------------------------
  40. // Global Variables
  41. //-----------------------------------------------------------------------------

  42. //-----------------------------------------------------------------------------
  43. // Function Prototypes
  44. //-----------------------------------------------------------------------------
  45. void ISPSetROMAddr(UINT16 u16addr);
  46. void ISPSetRAMAddr(UINT8 u8addr);
  47. void ISPWritePage(void);
  48. void ISPExecute(void);
  49. //void ISPEraseAllROM(void);
  50. void rdrom(void);

  51. //-----------------------------------------------------------------------------
  52. // Main loop
  53. //-----------------------------------------------------------------------------
  54. void main(void)
  55. {
  56.                 CLKSEL = 0x06;                                                                                                                        //Fcpu=Fosc/2=16M
  57.                 CLKCMD = 0x69;
  58.                 CKCON  = 0x10;                                                                                                            //2 cycles = 16M/2 =8M       
  59.        
  60.           WDTR = 0x5A;                                                                                // clear watchdog if watchdog enable
  61.        
  62.                 P0 = 0;
  63.                 P0M = 0;
  64.                 P0UR = 0xFF;
  65.        
  66.                 P1 = 0;
  67.                 P1M = 0;
  68.                 P1UR = 0xFF;
  69.        
  70.                 P2 = 0;
  71.                 P2M = 0;
  72.                 P2UR = 0xFF;
  73.        
  74.                 j = 0;
  75.        
  76.     ISPExecute();                                                                               // Program one page by ISP
  77.        
  78.                 rdrom();                                                                                                                                                //Read one page data

  79.     while (1)
  80.                 {
  81.         WDTR = 0x5A;                                                                            // clear watchdog if watchdog enable
  82.         
  83.         // To Do ...
  84.     }
  85. }

  86. //-----------------------------------------------------------------------------
  87. // 将ISP的数据读出                              
  88. //-----------------------------------------------------------------------------
  89. void rdrom(void)
  90. {
  91.           UINT8 u8data[32] = {0};
  92.     UINT8 i =0;
  93.                 UINT romaddr = L_ispaddr;
  94.                
  95.                 for(i =0; i<32; i++)
  96.                 {
  97.                         u8data[i] = CBYTE[romaddr];               
  98. //                u8data[i] = ((UINT8 volatile code*)(0))[romaddr]; 与上面一句等效
  99.                         romaddr++;
  100.                 }
  101. }
  102. //-----------------------------------------------------------------------------
  103. // 将ROM中的数据ISP到ROM中                              
  104. //-----------------------------------------------------------------------------
  105. void ISPExecute(void)
  106. {
  107.     UINT8 u8data[32] = {0};
  108.     UINT8 i =0;

  109.     // step 1 : Get data
  110.     for (i =0; i<32; i++)
  111.                 {
  112.         u8data[i] = j;                                                        // write data for test,用户可以自夹薷暮写入需要的数据
  113.                                 j++;
  114.                 }

  115.     // step 2 : Set RAM addr of data
  116.     i = u8data;                                                         // get start addr
  117.     ISPSetRAMAddr(i);

  118.     // step 3 : Set ROM start addr (Range is 0x0000~0x03FF)
  119.     ISPSetROMAddr(L_ispaddr);                                                                    //addr 0x0200

  120.     // step 4 : Progarm one page (32 bytes)
  121.     ISPWritePage();

  122.     //erase all USER ROM
  123.     //ISPEraseAllROM();
  124. }

  125. //-----------------------------------------------------------------------------
  126. //  Function:   void ISPSetROMAddr Addr(UINT16 u16addr)
  127. //  Description:
  128. //          set start ROM Address (Range is 0x0000~0x03FF)
  129. //          ROM is 16k byte
  130. //                                
  131. //          |  set value  |  real rom addr  |
  132. //          |-------------------------------|
  133. //          |    0x0000   ->    0x0000      |
  134. //          |    0x0002   ->    0x0020      |
  135. //          |    0x0004   ->    0x0040      |
  136. //          |    0x0050   ->    0x0500      |
  137. //          |    0x0100   ->    0x1000      |
  138. //
  139. //-----------------------------------------------------------------------------
  140. void ISPSetROMAddr(UINT16 u16addr)
  141. {
  142.     // set ROM addr
  143.     PEROML &= 0x0F;
  144.     PEROML |= (u16addr & 0x00F0);
  145.     PEROMH = (u16addr>>8);
  146. }

  147. //-----------------------------------------------------------------------------
  148. //  Function:   void ISPSetRAMAddr(UINT8 u8addr)
  149. //  Description:
  150. //          set start RAM Address
  151. //          RAM is 256 byte
  152. //
  153. //-----------------------------------------------------------------------------
  154. void ISPSetRAMAddr(UINT8 u8addr)
  155. {
  156.     // set RAM addr
  157.     PERAM = u8addr;   
  158. }

  159. //-----------------------------------------------------------------------------
  160. //  Function:   void ISPEraseAllROM(void)
  161. //  Description:
  162. //          erase whole USER ROM
  163. //
  164. //-----------------------------------------------------------------------------
  165. /*void ISPEraseAllROM(void)
  166. {
  167.     // erase whole USER ROM
  168.     PECMD = 0x96;
  169.     PEROML |= 0x0A;
  170. }*/

  171. //-----------------------------------------------------------------------------
  172. //  Function:   void ISPWritePage(void)
  173. //  Description:
  174. //          execute Page Erase and Write
  175. //
  176. //-----------------------------------------------------------------------------
  177. void ISPWritePage(void)
  178. {
  179.     // execute Page Erase and Write

  180.     PEROML |= 0x0A;
  181.        
  182.           PECMD = 0x5A;
  183. }
复制代码


5703_ISP_20161103.rar

39.33 KB, 下载次数: 6, 下载积分: 黑币 -5

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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