发一个M051单片机的 ISP操作程序(LDROM、FMC,相当于8位机EEPROM操作)
- #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);
- }
- }
|