|
求大佬幫幫忙,我使用的是IAP15w4k58s4單片機(jī),進(jìn)行掉電保存驗(yàn)證,結(jié)果測(cè)試比較器沒(méi)起作用怎么回事,燒錄哪里我已經(jīng)設(shè)置了允許低壓中斷還有允許低壓eeprom操作,不知道還有哪里出了問(wèn)題,感激不盡
#include "STC15W4K.H"
#include "intrins.h"
#include "time_uart.h"
#include <stdio.h>
#define uint unsigned int
#define uchar unsigned char
#define CMD_IDLE 0 //空閑模式
#define CMD_READ 1 //IAP字節(jié)讀命令
#define CMD_PROGRAM 2 //IAP字節(jié)編程命令
#define CMD_ERASE 3 //IAP扇區(qū)擦除命令
#define ENABLE_IAP 0x83 //ifSYSCLK<12MHZ
#define IAP_address 0x0400
//sfr CMPCR1 = 0xE6; //比較器控制寄存器1
#define CMPEN 0x80 //比較器模塊使能
#define CMPIF 0x40 //比較器中斷標(biāo)志位
#define PIE 0x20 //比較器上升沿中斷使能位
#define NIE 0x10 //比較器下降沿中斷使能位
#define PIS 0x08 //比較器正極選擇位
#define NIS 0x04 //比較器負(fù)極選擇位
#define CMPOE 0x02 //比較器輸出控制位
#define CMPRES 0x01 //比較器比較結(jié)果位
//sfr CMPCR2 =0xE7; //比較器控制寄存器2
#define INVCMPO 0x80 //比較器結(jié)果反向輸出控制位
#define DISFLT 0x40 //比較器輸出端濾波使能位
#define LCDTY 0x3F //比較器輸出的區(qū)抖時(shí)間控制
void delayms(uint n);
void iap_idle();
uint iap_readbyte(uint addr);
void iap_writebyte(uint addr,uint dat);
void iap_erase_sector(uint addr);
uint num;
void cmp_iar() interrupt 21 using 1
{
CMPCR1&=~CMPIF; //掉電后觸發(fā)下降沿中斷,向flash寫入數(shù)據(jù)
iap_erase_sector(0x400);
iap_writebyte(0x400,num);
}
void main()
{
P5M0=0;
P5M1=0;
P55=1;
num=9;
init_uart();
CMPCR1=0; //初始化比較器寄存器1和2
CMPCR2=0;
CMPCR1&=~PIS; //選擇外部管腳P55 CMP+作為比較器正極輸入源
CMPCR1&=~NIS; //選擇內(nèi)部BandGap電壓作為比較器負(fù)極輸入源
CMPCR1&=~CMPOE; //禁用比較器的比較結(jié)果輸出
CMPCR2&=~INVCMPO; //比較器比較結(jié)果正常輸出到P12
CMPCR2&=~DISFLT; //使能比較器輸出端0.1us濾波電路
CMPCR2&=~LCDTY; //比較器結(jié)果不去抖動(dòng)直接輸出
//CMPCR1|=PIE; //使能比較器上升沿中斷
CMPCR1|=NIE; //使能比較器下降沿中斷
CMPCR1|=CMPEN; //使能比較器
EA=1;
// if(iap_readbyte(0x400)!=9)
// iap_erase_sector(0x400);
while(1)
{
if(iap_readbyte(0x400)==9)
{
// CMPCR1&=~CMPEN; //失能比較器
while(1)
{
delayms(1000);
SBUF='0';
while(!TI);
TI=0;
}
}
if(CMPCR1&CMPRES) //正常狀態(tài)CMP也就是P55大于BandGap電壓,沒(méi)問(wèn)題
{
delayms(1000);
SBUF='9';
while(!TI);
TI=0;
}
else //掉電后,我以為可能程序還會(huì)走一點(diǎn),結(jié)果中斷沒(méi)進(jìn)入這里也沒(méi)進(jìn)入
{
iap_erase_sector(0x400);
iap_writebyte(0x400,num);
}
}
}
void delayms(uint n)
{
uint j,k;
for(j=0;j<n;j++)
for(k=0;k<111;k++); //時(shí)鐘頻率11.0592MHZ
}
//關(guān)閉IAP
void iap_idle()
{
IAP_CONTR=0;
IAP_CMD=0;
IAP_TRIG=0;
IAP_ADDRH=0x80;
IAP_ADDRL=0;
}
//從ISP IAP EEPROM區(qū)域讀取一個(gè)字節(jié)
uint iap_readbyte(uint addr)
{
uint dat;
IAP_CONTR=ENABLE_IAP;
IAP_CMD=CMD_READ;
IAP_ADDRL=addr;
IAP_ADDRH=addr>>8;
IAP_TRIG=0x5A;
IAP_TRIG=0xA5;
_nop_();
dat=IAP_DATA;
iap_idle();
return dat;
}
//寫一字節(jié)數(shù)據(jù)到ISP IAP EEPROM區(qū)域
void iap_writebyte(uint addr,uint dat)
{
IAP_CONTR=ENABLE_IAP;
IAP_CMD=CMD_PROGRAM;
IAP_ADDRL=addr;
IAP_ADDRH=addr>>8;
IAP_DATA=dat;
IAP_TRIG=0x5A;
IAP_TRIG=0xA5;
_nop_();
iap_idle();
}
//扇區(qū)擦去
void iap_erase_sector(uint addr)
{
IAP_CONTR=ENABLE_IAP;
IAP_CMD=CMD_ERASE;
IAP_ADDRL=addr;
IAP_ADDRH=addr>>8;
IAP_TRIG=0x5A;
IAP_TRIG=0xA5;
_nop_();
iap_idle();
}
|
|