peet 发表于 2010-4-8 12:47:39

mega64IAP如何在应用区调用

已在BOOTLOADER区实现IAP功能,如何在应用区实现IAP功能用于完成通过三菱FXGPWIN软件下载PLC程序存储在flash中?指令SPM必须在bootloader区运行!我用call bootadder没成功,请指教。
#include <mega64.h>
#define SPM_PAGESIZE 256
//擦除(code=0x03)和写入(code=0x05)一个Flash页
void boot_page_ew(unsigned int p_address,char code)
{
    #asm
      .equ spmcsr = 0x68
      push r30
      push r31
      push r0
      ldd r30,y+1
      ldd r31,y+2
      ldr0,y
      sts spmcsr,r0
      spm
      pop r0
      pop r31
      pop r30
    #endasm               ;       //将页地址放入Z寄存器
                                 //寄存器SPMCSR中为操作码
                                 //对指定Flash页进行操作
}         
//填充Flash缓冲页中的一个字
//Z寄存器中为填冲页内地址
//R0R1中为一个指令字
void boot_page_fill(unsigned int address,int data)
{
    #asm
      push r30
      push r31
      push r16
      push r0
      push r1
      ldd r30,y+2
      ldd r31,y+3            
      ldi r16,0x01
      sts spmcsr,r16
      ldr0,y      
      ldd r1,y+1
      spm   
      pop r1
      pop r0
      pop r16
      pop r31
      pop r30
    #endasm                        
}
//等待一个Flash页的写完成
void wait_page_rw_ok(void)
{
      while(SPMCSR & 0x40)
   {
         while(SPMCSR & 0x01);
         SPMCSR = 0x11;
         #asm("spm");
   }
}
//更新一个Flash页的完整处理
unsigned int address = 0;
void write_one_page(char *data)
{
    int i=0;
    boot_page_ew(address,0x03);                  //擦除一个Flash页
    wait_page_rw_ok();                           //等待擦除完成
    for(i=0;i<SPM_PAGESIZE;i+=2)                   //将数据填入Flash缓冲页中
    {
      boot_page_fill(i, data+((unsigned int)data<<8));
    }
    boot_page_ew(address,0x05);                  //将缓冲页数据写入一个Flash页
    wait_page_rw_ok();                           //等待写入完成
   
}
      
unsigned char i,buf;
void main(void)
{
for(i=0;i<255;i++)
{
   buf=i;
}
write_one_page(&buf);
while(1) ;
}

peet 发表于 2010-4-8 13:43:13

上面程序使用CVAVR编译器,在bootloader区编译运行通过。请指教在应用区实现IAP功能的方法。

wisebaby 发表于 2010-4-8 15:17:07

在 AVR 专区 已回复。

peet 发表于 2010-4-8 16:34:31

回复 wisebaby 明君
------------------------------------------
谢谢指教!我是想将您的“简易PLC 梯型图 解释型监控 示范程序(用于 51单片机)”移植到“AVR扩充板中”,因学疏才浅,卡在这里了,出来求教。
页: [1]
查看完整版本: mega64IAP如何在应用区调用