[DemoCode下载]

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

[复制链接]
1612|8
手机看帖
扫描二维码
随时随地手机跟帖
小猫爱吃鱼|  楼主 | 2015-9-29 16:17 | 显示全部楼层 |阅读模式
#include "SmartM_M0.h"
#define DEBUGMSG printf
#define PAGE_SIZE               512
#define DATAFLASH_START_ADDRESS 0x0001F000
#define DATAFLASH_SIZE          0x00001000
#define RW_SIZE                 0x20
STATIC UINT8 g_unDataFlashWRBuf[10];    //全局读写缓冲区
/****************************************
*函数名称:ISPTriger
*输    入:无
*输    出:无
*功    能:ISP执行
******************************************/
VOID ISPTriger(VOID)
{
    ISPTRG |= ISPGO;
    while((ISPTRG&ISPGO) == ISPGO);
}
/****************************************
*函数名称:ISPEnable
*输    入:无
*输    出:无
*功    能:ISP使能
******************************************/
VOID ISPEnable(VOID)
{
    Un_Lock_Reg();
    ISPCON |= ISPEN;
}
/****************************************
*函数名称:ISPDisable
*输    入:无
*输    出:无
*功    能:ISP禁用
******************************************/
VOID ISPDisable(VOID)
{
    Un_Lock_Reg();
    ISPCON &= ~ISPEN;
}
/****************************************
*函数名称:DataFlashRWEnable
*输    入:无
*输    出:无
*功    能:数据区读写使能
******************************************/
VOID DataFlashRWEnable(VOID)
{
    Un_Lock_Reg();
    ISPCON |= LDUEN;
}
/****************************************
*函数名称:DataFlashErase
*输    入:unPage 页地址
*输    出:无
*功    能:数据区擦除
******************************************/
VOID DataFlashErase(UINT32 unPage)
{
    ISPEnable();
    DataFlashRWEnable();
    ISPCMD = PAGE_ERASE;
    ISPADR = (unPage*PAGE_SIZE+DATAFLASH_START_ADDRESS);
    ISPTriger();
    ISPDisable();      
}
/****************************************
*函数名称:DataFlashWrite
*输    入:pucBuf 写数据缓冲区
    unSize 写数据大小
*输    出:无
*功    能:数据区写
******************************************/
VOID DataFlashWrite(UINT8 *pucBuf,UINT32 unSize)//unSize要为4的倍数
{
    UINT32 i;   
    ISPEnable();
    DataFlashRWEnable();
    ISPCMD = PROGRAM;
for(i=0; i<unSize; i+=4)
{
     ISPADR = (i*4+DATAFLASH_START_ADDRESS);
     ISPDAT = *(UINT32 *)(pucBuf+i);
     ISPTriger();   
}
    ISPDisable();      
}
/****************************************
*函数名称:DataFlashRead
*输    入:pucBuf 读数据缓冲区
    unSize 读数据大小
*输    出:无
*功    能:数据区读
******************************************/
VOID DataFlashRead(UINT8 *pucBuf,UINT32 unSize)
{
    UINT32 i;
    ISPEnable();
    DataFlashRWEnable();
    ISPCMD = READ;
    for(i=0; i<unSize; i+=4)
    {
     ISPADR = (i*4+DATAFLASH_START_ADDRESS);
        ISPTriger();
  *(UINT32 *)(pucBuf+i)=ISPDAT;
    }   
    ISPDisable();      
}
/****************************************
*函数名称:main
*输    入:无
*输    出:无
*功    能:函数主体
******************************************/
INT32 main(VOID)
{
  UINT32 i;            
  PROTECT_REG         //ISP下载时保护FLASH存储器
  (
   PWRCON |= XTL12M_EN;      //默认时钟源为外部晶振
   while((CLKSTATUS & XTL12M_STB) == 0);   //等待12MHz时钟稳定
  
   CLKSEL0 = (CLKSEL0 & (~HCLK)) | HCLK_12M; //设置外部晶振为系统时钟
  )
  UartInit(12000000,9600);     //串口0波特率为9600
  while(1)
  {
      //擦除第0页
         DataFlashErase(0);      
   DEBUGMSG("\r\nData Flash Write:\r\n");
   //初始化缓冲区,所有数值全为0x11
   memset(g_unDataFlashWRBuf,0x11,sizeof(g_unDataFlashWRBuf));  
   for(i=0; i<sizeof(g_unDataFlashWRBuf); i++)
   {
       DEBUGMSG("%02X ",g_unDataFlashWRBuf[i]);
   }
   //数据区写
         DataFlashWrite(g_unDataFlashWRBuf,sizeof(g_unDataFlashWRBuf));
   DEBUGMSG("\r\nData Flash Read:\r\n");
   //清零缓冲区
   memset(g_unDataFlashWRBuf,0,sizeof(g_unDataFlashWRBuf));  
   //数据区读
         DataFlashRead(g_unDataFlashWRBuf,sizeof(g_unDataFlashWRBuf));
   for(i=0; i<sizeof(g_unDataFlashWRBuf); i++)
   {
       DEBUGMSG("%02X ",g_unDataFlashWRBuf[i]);
   }
  
   Delayms(500);
  }
}


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

粉丝