R8C/1B单片机的Flash编程/擦除挂起功能
sp;
本文引用地址:http://www.amcfsurvey.com/article/96982.htmfmr40 = 0;
fmr40 = 1;//允许中断擦除挂起
asm("FSET I");//开中断
g_Timers = 0;//计数值清零
prex=0x32-1;tx=0x32-1;//定时值1ms
txs=1;//定时器X开始计数
*((unsigned char *)adr) = 0x20;//执行块擦除软件命令
*((unsigned char *)adr) = 0xD0;
while(fmr00 != 1){//判断擦除是否结束
fmr41 = 0;//中断返回后继续擦除
}
txs=0;//定时器X停止计数
fmr01 = 0;//退出CPU改写模式
if(!checkStatusRegister()){//查看状态寄存器
result = 0;//擦除成功
}
else //擦除失败
clearStatusRegister();//清除状态寄存器
return result;
}
/* 对MCU进行初始化 */
void initMCU(){
unsigned char i="0";
asm("FCLR I");//关中断
//将CPU时钟切换为主时钟20MHz
prcr = 1;//解除对cm0,cm1,ocd寄存器的写保护
cm13 = 1;//接通 Xin-Xout
cm15 = 1;//Xin-Xout驱动能力:高
cm05 = 0;//Xin-Xout启动
cm16 = 0;//无分频模式
cm17 = 0;
cm06 = 0;//使CM16,CM17有效
while(1){//等待主时钟振荡稳定
if(!ocd3){
if(i>=10) break;
else ++i;
}
}
ocd2 = 0;//选择主时钟
prcr = 0;//设定对cm0,cm1,ocd寄存器的写保护
//设置定时器
txmr=0x00;//定时器X设为定时器模式
tcss=0x11;//选择计数源为f8
txic=0x07;//定时器X中断优先级为7
asm("FSET I");//开中断
}
/* 主函数 */
void main(void)
{
unsigned char flag;
initMCU();//对MCU进行初始化
flag = eraseBlock(0x2400);//擦除大小为1kB的块A,块首地址为2400H
while (1);
}
评论