有没有用proteus仿真过IAP的用例? 谁有的话发一份。

2019-07-18 12:20发布

有没有用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){
   
  }
}

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。