[DemoCode下载] 新唐M051 ISP(LDROM、FMC,相当于8位机EEPROM操作)程序

[复制链接]
1944|8
 楼主| 小猫爱吃鱼 发表于 2015-9-29 16:17 | 显示全部楼层 |阅读模式
  1. #include "SmartM_M0.h"
  2. #define DEBUGMSG printf
  3. #define PAGE_SIZE               512
  4. #define DATAFLASH_START_ADDRESS 0x0001F000
  5. #define DATAFLASH_SIZE          0x00001000
  6. #define RW_SIZE                 0x20
  7. STATIC UINT8 g_unDataFlashWRBuf[10];    //全局读写缓冲区
  8. /****************************************
  9. *函数名称:ISPTriger
  10. *输    入:无
  11. *输    出:无
  12. *功    能:ISP执行
  13. ******************************************/
  14. VOID ISPTriger(VOID)
  15. {
  16.     ISPTRG |= ISPGO;
  17.     while((ISPTRG&ISPGO) == ISPGO);
  18. }
  19. /****************************************
  20. *函数名称:ISPEnable
  21. *输    入:无
  22. *输    出:无
  23. *功    能:ISP使能
  24. ******************************************/
  25. VOID ISPEnable(VOID)
  26. {
  27.     Un_Lock_Reg();
  28.     ISPCON |= ISPEN;
  29. }
  30. /****************************************
  31. *函数名称:ISPDisable
  32. *输    入:无
  33. *输    出:无
  34. *功    能:ISP禁用
  35. ******************************************/
  36. VOID ISPDisable(VOID)
  37. {
  38.     Un_Lock_Reg();
  39.     ISPCON &= ~ISPEN;
  40. }
  41. /****************************************
  42. *函数名称:DataFlashRWEnable
  43. *输    入:无
  44. *输    出:无
  45. *功    能:数据区读写使能
  46. ******************************************/
  47. VOID DataFlashRWEnable(VOID)
  48. {
  49.     Un_Lock_Reg();
  50.     ISPCON |= LDUEN;
  51. }
  52. /****************************************
  53. *函数名称:DataFlashErase
  54. *输    入:unPage 页地址
  55. *输    出:无
  56. *功    能:数据区擦除
  57. ******************************************/
  58. VOID DataFlashErase(UINT32 unPage)
  59. {
  60.     ISPEnable();
  61.     DataFlashRWEnable();
  62.     ISPCMD = PAGE_ERASE;
  63.     ISPADR = (unPage*PAGE_SIZE+DATAFLASH_START_ADDRESS);
  64.     ISPTriger();
  65.     ISPDisable();      
  66. }
  67. /****************************************
  68. *函数名称:DataFlashWrite
  69. *输    入:pucBuf 写数据缓冲区
  70.     unSize 写数据大小
  71. *输    出:无
  72. *功    能:数据区写
  73. ******************************************/
  74. VOID DataFlashWrite(UINT8 *pucBuf,UINT32 unSize)//unSize要为4的倍数
  75. {
  76.     UINT32 i;   
  77.     ISPEnable();
  78.     DataFlashRWEnable();
  79.     ISPCMD = PROGRAM;
  80. for(i=0; i<unSize; i+=4)
  81. {
  82.      ISPADR = (i*4+DATAFLASH_START_ADDRESS);
  83.      ISPDAT = *(UINT32 *)(pucBuf+i);
  84.      ISPTriger();   
  85. }
  86.     ISPDisable();      
  87. }
  88. /****************************************
  89. *函数名称:DataFlashRead
  90. *输    入:pucBuf 读数据缓冲区
  91.     unSize 读数据大小
  92. *输    出:无
  93. *功    能:数据区读
  94. ******************************************/
  95. VOID DataFlashRead(UINT8 *pucBuf,UINT32 unSize)
  96. {
  97.     UINT32 i;
  98.     ISPEnable();
  99.     DataFlashRWEnable();
  100.     ISPCMD = READ;
  101.     for(i=0; i<unSize; i+=4)
  102.     {
  103.      ISPADR = (i*4+DATAFLASH_START_ADDRESS);
  104.         ISPTriger();
  105.   *(UINT32 *)(pucBuf+i)=ISPDAT;
  106.     }   
  107.     ISPDisable();      
  108. }
  109. /****************************************
  110. *函数名称:main
  111. *输    入:无
  112. *输    出:无
  113. *功    能:函数主体
  114. ******************************************/
  115. INT32 main(VOID)
  116. {
  117.   UINT32 i;            
  118.   PROTECT_REG         //ISP下载时保护FLASH存储器
  119.   (
  120.    PWRCON |= XTL12M_EN;      //默认时钟源为外部晶振
  121.    while((CLKSTATUS & XTL12M_STB) == 0);   //等待12MHz时钟稳定
  122.   
  123.    CLKSEL0 = (CLKSEL0 & (~HCLK)) | HCLK_12M; //设置外部晶振为系统时钟
  124.   )
  125.   UartInit(12000000,9600);     //串口0波特率为9600
  126.   while(1)
  127.   {
  128.       //擦除第0页
  129.          DataFlashErase(0);      
  130.    DEBUGMSG("\r\nData Flash Write:\r\n");
  131.    //初始化缓冲区,所有数值全为0x11
  132.    memset(g_unDataFlashWRBuf,0x11,sizeof(g_unDataFlashWRBuf));  
  133.    for(i=0; i<sizeof(g_unDataFlashWRBuf); i++)
  134.    {
  135.        DEBUGMSG("%02X ",g_unDataFlashWRBuf[i]);
  136.    }
  137.    //数据区写
  138.          DataFlashWrite(g_unDataFlashWRBuf,sizeof(g_unDataFlashWRBuf));
  139.    DEBUGMSG("\r\nData Flash Read:\r\n");
  140.    //清零缓冲区
  141.    memset(g_unDataFlashWRBuf,0,sizeof(g_unDataFlashWRBuf));  
  142.    //数据区读
  143.          DataFlashRead(g_unDataFlashWRBuf,sizeof(g_unDataFlashWRBuf));
  144.    for(i=0; i<sizeof(g_unDataFlashWRBuf); i++)
  145.    {
  146.        DEBUGMSG("%02X ",g_unDataFlashWRBuf[i]);
  147.    }
  148.   
  149.    Delayms(500);
  150.   }
  151. }


734774645 发表于 2015-10-4 12:30 来自手机 | 显示全部楼层
每一个寄存器操作的子函数,都用解锁寄存器操作开始
598330983 发表于 2015-10-6 13:04 | 显示全部楼层
小括号里的怎么没见过
ccw1986 发表于 2015-10-9 07:55 | 显示全部楼层
734774645 发表于 2015-10-4 12:30
每一个寄存器操作的子函数,都用解锁寄存器操作开始

您这个回答是什么意思啊
Messi1999 发表于 2015-10-9 21:44 | 显示全部楼层
这个ISP也是下载程序用的吗
芙蓉洞 发表于 2015-10-10 07:41 | 显示全部楼层
这个ISP主要是做什么的呢?下载用的吗
玛尼玛尼哄 发表于 2015-10-10 10:26 | 显示全部楼层
新唐的单片机在对寄存器操作前,都需要解锁操作,然后修改寄存器的值,最后再锁定,生效。
gejigeji521 发表于 2015-10-10 10:48 | 显示全部楼层
建议楼主参考官网的例程,修改为自己的程序,这样在结构上,和基本操作上,一般都是一样的,因此不容易有错。
734774645 发表于 2015-10-10 22:34 | 显示全部楼层
    {
     ISPADR = (i*4+DATAFLASH_START_ADDRESS);
        ISPTriger();
  *(UINT32 *)(pucBuf+i)=ISPDAT;
    }   
地址通过便宜,每次四个字节操作。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

33

主题

294

帖子

2

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