有没有用
proteus仿真过IAP的用例? 我写了一个用例, 总是仿真出错。有没有高手说说原因?
//IAP.c文件
void Page_Erase(int32u addr)
{
asm("mov r31, r25");
asm("mov r30, r24");
do{
SPMCR = 0x03;
asm("SPM");
}while(SPMCR & (1 << SPMEN));
}
void Flash_Fill_Buffer(int32u address, int8u data1, int8u data2)
{
asm("mov r0,r18");
asm("mov r1,r19"); //R0R1中为一个指令字
asm("mov r31,r17"); //Z寄存器中为填冲页内地址
asm("mov r30,r16");
do{
SPMCR = 0x01;
asm("SPM");
}while(SPMCR &( 1<< SPMEN));
}
//方式1写页面
void write_one_page1(int32u address, int8u *pdata, int len)
{
int i;
Page_Erase(address);
for(i=0;i<SPM_PAGESIZE;i+=2) //将数据填入Flash缓冲页中
{
Flash_Fill_Buffer( i, pdata
, pdata[i+1]);
}
//开始写
asm("mov r31, r25");
asm("mov r30, r24");
do{
SPMCR = 0x05;
asm("SPM");
}while(SPMCR & (1 << SPMEN));
//使能Rwww
asm("mov r31, r25");
asm("mov r30, r24");
do{
SPMCR = 0x011;
asm("SPM");
}while(SPMCR & (1 << SPMEN));
return;
}
//main.c文件
static int8u data[SPM_PAGESIZE];
//BOOTRST 编程, BOOT的大小2048字= 4096字节
int main()
{
__disable_interrupt();
memset(data, 0xAA, SPM_PAGESIZE);
/*将data写到FLASH为0的地方*/
write_one_page1(0, data, SPM_PAGESIZE);
while(1){
}
}
一周热门 更多>