要求很简单:上5v电读data flash,可以读出上次写入的值(现在是3),触发外中断,值加加,显示4,之后断电再上电,应该显示4,但为什么还是显3?在外中断里写
data flash断电可以保存(不接电池),一样的语句在欠压中断里写data flash为什么存不了(写不进去),欠压值设4.5v,vcc接法拉电容,还特意接钮扣电池试验,断5v几秒后再拆电池还是存不了,看了下手册,还是想不明白,是没这功能还是要做特别的操作,求前辈们指点,谢谢帮助!
代码也是拿别人的例程改的,不知问题出在哪里?
#define PAGE_SIZE 512
#define DATAFLASH_START_ADDRESS 0x0001F000 //data flash开始固定地址
#define DATAFLASH_SIZE 0x00001000
static char s_p32=0;
UINT8 buf[32]={0};
static char a2=1;
VOID BODInit(UINT32 unVoltage) //BOD初始化
{
PROTECT_REG //解锁
(
switch(unVoltage) /* 欠压检测门槛电压 电压选择 */
{
case 4500:BODCR|=3<<1; // 设欠压值为4.5V,
break;
case 3800:BODCR|=2<<1;
break;
case 2700:BODCR|=1<<1;
break;
case 2200:BODCR|=0<<1;
break;
default:break;
}
BODCR|=1<<4; //电压上升或下降到欠压值,该位置1,写1清0
BODCR|=0x01; // BOD欠压检测使能
)
/* BOD中断使能 */
NMI_SEL=0x01;
NVIC_ISER |= BOD_OUT_INT;
}
/////////////////////////////
INT32 main(VOID)
{
P3_IMD&=~(1<<2); //设P3.2工作于边沿触发中断功能
P3_IEN|=(1<<2); //使能P3.2低电平或下降沿触发的中断
Delayms(1000);
BODInit(4500); // BOD 初始化 低于或高于4.5V进入掉电中断
NVIC_ISER|=(1<<2); //使能2号中断EINT0 P3.2
FMC_Read(DATAFLASH_START_ADDRESS, buf, 1); // 读片内data flash
s_p32 = buf[0];
while(1)
{
while(a2)
{
shuma_xianshi(buf[0]); //显示函数
}
}
}
//////////////////////////////////////////////
VOID BOD_IRQHandler(VOID)
{
STATIC BOOL IsBod=FALSE;
if(BODCR & (1<<6))
{
if(!IsBod)
{
IsBod=TRUE;
a2=0;
P2_DOUT|=(0xff<<0); //P2输出高电平,关闭数码管显示
P0_DOUT|=(0xff<<0); //P0输出高电平,关闭数码管显示
memset(buf,s_p32,1);
FMC_Erase(DATAFLASH_START_ADDRESS); //擦除指定地址页
FMC_Write(DATAFLASH_START_ADDRESS, buf, 1); //FMC执行写操作
P4_DOUT&=~(1<<0); //P4.0输出低电平
}
}
else
{
if(IsBod)
{
IsBod=FALSE;
a2=1;
P4_DOUT&=~(1<<1); //P4.1输出低电平
}
}
BODCR|=1<<4; //写1清除欠压中断标志
}
////////////////////////////////////////////////////////////
void EINT0_IRQHandler() //P3.2外部中断0服务函数
{
s_p32++;
if(s_p32>250)
{
s_p32 =0; //归0,从头来
}
buf[0]=s_p32;
// memset(buf,s_p32,1);
// FMC_Erase(DATAFLASH_START_ADDRESS); //擦除指定地址页
// FMC_Write(DATAFLASH_START_ADDRESS, buf, 1); //FMC执行写操
P3_ISRC|=(1<<2); //写1清除P3.2中断标志
}
|