|
发表于 2010-10-25 08:31:22
|
显示全部楼层
为什么我把上面的例子程序改程mega32的,软件模拟可以,但是实际写入芯片jtag调试和运行,却不行,反映的情况是擦除不掉和不能写入,软件模拟时SPMCR 置数后,指令 asm("SPM") 可以清零SPMCR ,jtag调试看到的却是SPMCR 置数后,指令 asm("SPM")不能清零SPMCR,SPMCR 还是原来的数,I_Automate_Out寄存器是外部输出指示灯,第一个数据没改时,是原来的00时第一个等亮,更改成功不是00时第二个灯亮,用来指示实际运行时的状态,原来我以为,是jtag调试时,是不能更改flash,实际运行也是一样是第一个灯亮就是还是00没有更改成功
#include <iom32.h>
#define N_Isp_PageStart 60 //开始页
#define N_Isp_PageSize 128 //一页字节数
static uint8 I_Isp_Buffer[N_Isp_PageSize]; //M48的FLASH一页的大小为64B
__regvar __no_init uint8 Reg_12 @ 12;
__regvar __no_init uint8 Reg_13 @ 13;
__regvar __no_init uint8 Reg_14 @ 14;
__regvar __no_init uint8 Reg_15 @ 15;
////////////////////////////////////////////////////////////////////////
__root __flash uint8 I_Isp_Rom[N_Isp_PageSize]@(N_Isp_PageStart*N_Isp_PageSize) ={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
uint8 fff = 0;
void SDELFLASH(uint8 page,uint8 x); //选译性删除FLASH页
void WFLASH2B(uint16 add,uint8 data1,uint8 data0); //写一字到缓冲区
void WFLASH(uint8 page); //写一页
void RFLASH(uint8 page); //读入一页
void Pdata(void); //改data[]中的内容
void main(void)
{
while(1)
{
if(fff==0x0)
{
RFLASH(N_Isp_PageStart); //读这页FLASH内容,读到data[]
if(I_Isp_Rom[0] == 0)
{
I_Automate_Out = ~0x2;
Pdata(); //修改data[]的内容
WFLASH(N_Isp_PageStart); //写这页FLASH内容,data[]写到FLASH
RFLASH(N_Isp_PageStart); //读这页FLASH内容,读到data[]
if(I_Isp_Rom[0] == 1)
{
I_Automate_Out = ~0x8;
}
else
{
I_Automate_Out = ~0x2;
}
}
else
{
I_Automate_Out = ~0x8;
}
//fff++;
}
else
{
fff = 0xff;
}
OSTimeDly(N_Isp_rwxmys); //任务休眠时间
}
}
///////////////////////////////////////////////////////////////
void Pdata(void) //改data[]中的内容
{ uint8 n;
for(n=0;n<N_Isp_PageSize;n++)
I_Isp_Buffer[n]=I_Isp_Buffer[n]+1; //全加1
}
///////////////////FLASH操作////////////////////////////////////
void RFLASH(uint8 page) //读入一页data[]
{
uint8 n; uint16 add;
add=page*N_Isp_PageSize;
for(n=0;n<N_Isp_PageSize;n++)
{
asm ("cli");
Reg_13=add>>8;
Reg_14=add;
asm("MOV R31,R13"); //ZH Flash地址
asm("MOV R30,R14"); //ZL
asm("LPM R15,Z");
I_Isp_Buffer[n]=Reg_15;
asm ("sei");
add++;
}
}
////////////////////////////////////////////////////////////////
void SDELFLASH(uint8 page,uint8 x) //选译性删除FLASH程序
{ //page为要删除的页码,x为要删除的页数
uint8 n,dpageh;
uint16 dpage;
dpage=page*N_Isp_PageSize;
for(n=0;n<x;n++)
{
dpageh=dpage>>8;
asm ("cli");
Reg_14 = dpageh;
Reg_15 = dpage;
asm("MOV R31,R14"); //ZH Flash地址
asm("MOV R30,R15"); //ZL
SPMCR=(1<<1)|(1<<0);
asm("SPM");
asm ("sei");
dpage+=N_Isp_PageSize;
}
}
////////////////////////////////////////////////////////
void WFLASH(uint8 page) //写入一页
{
uint8 n;
uint16 add;
uint8 zjs;
while(SPMCR & 0x01 != 0 );//未处理好死循环
{
add = page*N_Isp_PageSize;
zjs = N_Isp_PageSize/2;
for(n=0;n<zjs;n++) //将数据写入这页缓冲区
{
WFLASH2B(add,I_Isp_Buffer[n*2],I_Isp_Buffer[(n*2)+1]);
add += 2;
}
SDELFLASH(page,1); //擦除这页FLASH
asm ("cli");
SPMCR = (1<<2)|(1<<0); //写这页FLASH
asm("SPM");
asm ("sei");
}
}
//////////////////////////////////////////////////////////////////////////
//将一个字写入缓冲区
void WFLASH2B(uint16 add,uint8 data1,uint8 data0)
{
asm ("cli");
Reg_12 = add>>8;
Reg_13 = add;
Reg_14 = data1;
Reg_15 = data0;
asm("MOV R0,R14");
asm("MOV R1,R15");
asm("MOV R31,R12"); //ZH Flash地址
asm("MOV R30,R13"); //ZL
SPMCR=(1<<0);
asm("SPM");
asm ("sei");
} |
|