搜索
bottom↓
回复: 3

mega64IAP如何在应用区调用

[复制链接]

出0入0汤圆

发表于 2010-4-8 12:47:39 | 显示全部楼层 |阅读模式
已在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
        ld  r0,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
        ld  r0,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[i+1]<<8));  
    }  
    boot_page_ew(address,0x05);                    //将缓冲页数据写入一个Flash页  
    wait_page_rw_ok();                             //等待写入完成
   
}
      
unsigned char i,buf[256];
void main(void)
{
  for(i=0;i<255;i++)
  {  
     buf=i;
  }
  write_one_page(&buf[0]);
  while(1) ;
}

出0入0汤圆

 楼主| 发表于 2010-4-8 13:43:13 | 显示全部楼层
上面程序使用CVAVR编译器,在bootloader区编译运行通过。请指教在应用区实现IAP功能的方法。

出0入0汤圆

发表于 2010-4-8 15:17:07 | 显示全部楼层
在 AVR 专区 已回复。

出0入0汤圆

 楼主| 发表于 2010-4-8 16:34:31 | 显示全部楼层
回复 wisebaby 明君
------------------------------------------
谢谢指教!我是想将您的“简易PLC 梯型图 解释型监控 示范程序(用于 51单片机)”移植到“AVR扩充板中”,因学疏才浅,卡在这里了,出来求教。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-3 11:07

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表