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

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

发一个M051单片机的 ISP操作程序(LDROM、FMC,相当于8位机EEPROM操作)

#include "SmartM_M0.h"
#define DEBUGMSG printf

#define PAGE_SIZE 512
#define DATAFLASH_START_ADDRESS0x0001F000
#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);
}
}


唯样商城-电子元器件采购网(www.oneyac.com)是本土元器件目录分销商,采用“小批量、现货、样品”销售模式,致力于满足客户多型号、高质量、快速交付的采购需求。唯样自建高效智能仓储,拥有自营库存超过50,000种,提供一站式正品现货采购、个性化解决方案、选型替代等多元化服务。
本文由网络整理转载自单片机教程网,原文标题为:新唐M051 ISP(LDROM、FMC,相当于8位机EEPROM操作)程序,本站所有转载文章系出于传递更多信息之目的,且明确注明来源,不希望被转载的媒体或个人可与我们联系,我们将立即进行删除处理。

上一篇:新唐M051 UART0使用程序

下一篇:新唐M051 IIC使用程序

唯样头条公众号
最新最热
行业资讯
领先元件
技术方案
订阅栏目
效率阅读
品牌专区
相关文章
最新入库
编号 分类 库存
12110844
APTIV
未分类 5200
EEEFK1C101P
Panasonic
铝电解电容 50269
ISO5451QDWRQ1
TI
未分类 1675
LFD21433MMF5E258
Murata
未分类 3978
JMK107B7105KA-T
Taiyo Yuden
MLCC 16000
BLM15EX121SN1D
Murata
未分类 19900