📄 flash.c
字号:
#include "PublHead.h"
#define ADDRESS(addr) (volatile U16 *)(FLASH_ADDR|(addr))
/*
函数 读取FLASH的厂商ID和芯片ID
*/
extern Ulong ReadFlashID(void)
{
volatile U16 * ptr;
UNION32 Id;
// 进入产商ID模式
ptr = ADDRESS(0x5555<<1);
*ptr = 0xaa;
ptr = ADDRESS(0x2aaa<<1);
*ptr = 0x55;
ptr = ADDRESS(0x5555<<1);
*ptr = 0x90;
// 读取产商ID
ptr = ADDRESS(0<<1);
Id.i[1] = *ptr;
ptr = ADDRESS(1<<1);
Id.i[0] = *ptr;
// 退出产商ID模式
*ptr = 0xf0;
return(Id.l);
}
extern Boolean FlashErase(Ulong addr,Uint SecOrBlk)
{
volatile U16 * ptr;
#ifdef PC_PLATFORM
return Pc_FlashErase(addr,SecOrBlk);
#endif
ptr = ADDRESS(0x5555<<1);
*ptr = 0xaa;
ptr = ADDRESS(0x2aaa<<1);
*ptr = 0x55;
ptr = ADDRESS(0x5555<<1);
*ptr = 0x80;
ptr = ADDRESS(0x5555<<1);
*ptr = 0xaa;
ptr = ADDRESS(0x2aaa<<1);
*ptr = 0x55;
ptr = ADDRESS(addr);
*ptr = SecOrBlk;
while(1)
{
Uint temp1,temp2;
temp1 = *ptr;
temp2 = *ptr;
if(temp1 == temp2)
{
if(temp1 != 0xffff)
{
return(FALSE);
}
else
{
return(TRUE);
}
}
}
}
extern void FlashWriteOneWord(Ulong addr,Uint dt)
{
volatile U16 * ptr;
// 写入一个字节
ptr = ADDRESS(0x5555<<1); // 自动写入时序
*ptr = 0xaa;
ptr = ADDRESS(0x2aaa<<1);
*ptr = 0x55;
ptr = ADDRESS(0x5555<<1);
*ptr = 0xa0;
ptr = ADDRESS(addr);
*ptr = dt; // 写入数据
while(1) // 等待写入完成
{
Uint temp1,temp2;
temp1 = *ptr;
temp2 = *ptr;
if(temp1 == temp2)
{
temp1 = *ptr;
temp2 = *ptr;
if(temp1 == temp2)
{
break;
}
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -