📄 flash.cpp
字号:
#include "flash.h"
FlashObj::FlashObj(void)
{
SREG->SWWSR = 0x3fff;
Init();
}
void FlashObj::Init(void)
{
Active = false;
MakerId = 0;
DeviceId = 0;
Succeed = false;
FlashId();
}
void FlashObj::FlashReset(void)
{
FLASH(0x5555) = 0xaa;
FLASH(0x2AAA) = 0x55;
FLASH(0x5555) = 0xf0;
Wait(0x5555);
}
void FlashObj::FlashId(void)
{
FlashReset();
FLASH(0x5555) = 0xaa;
FLASH(0x2AAA) = 0x55;
FLASH(0x5555) = 0x90;
Wait(0x5555);
MakerId = FLASH(FlashMaker) & 0xff;
DeviceId = FLASH(FlashDevice) & 0xff;
Active = (MakerId == 0xbf) && (DeviceId == 0x80);
FlashReset();
}
bool FlashObj::ChipErase(void)
{
if (Active)
{
FLASH(0x5555) = 0xaa;
FLASH(0x2AAA) = 0x55;
FLASH(0x5555) = 0x80;
FLASH(0x5555) = 0xaa;
FLASH(0x2AAA) = 0x55;
FLASH(0x5555) = 0x10;
Wait(0x5555);
}
return Active;
}
bool FlashObj::SectorErase(unsigned int SectorNum)
{
if (Active)
{
FLASH(0x5555) = 0xaa;
FLASH(0x2AAA) = 0x55;
FLASH(0x5555) = 0x80;
FLASH(0x5555) = 0xaa;
FLASH(0x2AAA) = 0x55;
FLASH(SectorSize * SectorNum) = 0x30;
Wait(0x5555);
}
return Active;
}
bool FlashObj::BlockErase(unsigned int BlockNum)
{
if (Active)
{
FLASH(0x5555) = 0xaa;
FLASH(0x2AAA) = 0x55;
FLASH(0x5555) = 0x80;
FLASH(0x5555) = 0xaa;
FLASH(0x2AAA) = 0x55;
FLASH(BlockSize * BlockNum) = 0x50;
Wait(0x5555);
}
return Active;
}
bool FlashObj::Write(unsigned int address, unsigned char val)
{
if (Active)
{
FLASH(0x5555) = 0xaa;
FLASH(0x2AAA) = 0x55;
FLASH(0x5555) = 0xa0;
FLASH(address) = val;
Wait(address);
}
return Active;
}
bool FlashObj::Program(unsigned int address, unsigned int len, unsigned short * ramaddr)
{
if (Active)
{
FlashReset();
for (int i = 0; i < len; i ++)
{
Write(address + i, ramaddr[i] & 0xff);
}
/*
for (int i = address; i < (address + len); i ++)
{
Write(i, (*ramaddr) & 0xff);
ramaddr++;
}
*/
// FLASH(0x7ffe) = 0x80;
// FLASH(0x7fff) = 0x00;
FlashReset();
// Succeed = (FLASH(0x7ffe) == 0x80) && (FLASH(0x7fff) == 0);
}
return Active;
}
void FlashObj::Wait(unsigned int address)
{
unsigned int temp, val;
do {
val = FLASH(address);
__nop();
temp = FLASH(address);
__nop();
}
while(((val ^ temp) & (1 << BIT6)) != 0);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -