搜索
bottom↓
回复: 13

mega64中如何在应用区实现IAP功能用于完成通过三菱FXGPWIN软件下载PLC程序存储在fla

[复制链接]

出0入0汤圆

发表于 2010-4-8 13:35:35 | 显示全部楼层 |阅读模式
已在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) ;
}

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

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

出0入0汤圆

 楼主| 发表于 2010-4-8 14:29:23 | 显示全部楼层
自顶

出0入0汤圆

发表于 2010-4-8 15:15:45 | 显示全部楼层
这,这也太能省了。

只存PLC code吗?软元件呢,位元件呢,寄存器等等呢,你存哪?

你搞的这么麻烦,多花2元的成本吧。24C256!

出0入0汤圆

 楼主| 发表于 2010-4-8 15:48:33 | 显示全部楼层
因为“DIY“傻娃”PLC ”AVR扩充板中没有另加存储器,是按照“简易PLC 梯型图 解释型监控 示范程序(用于 51单片机)”考虑的

出0入0汤圆

 楼主| 发表于 2010-4-8 16:31:08 | 显示全部楼层
回复 wisebaby 明君
------------------------------------------
谢谢指教!我是想将您的“简易PLC 梯型图 解释型监控 示范程序(用于 51单片机)”移植到“AVR扩充板中”,因学疏才浅,卡在这里了,出来求教。

出0入0汤圆

发表于 2010-4-8 17:00:57 | 显示全部楼层
呵呵,硬件的东西我关注的少,刚才去核实了一下,还真的没有 EEPROM;

说实话,这令我我很惊讶。

出0入0汤圆

 楼主| 发表于 2010-4-8 18:19:45 | 显示全部楼层
回复【6楼】wisebaby 明君
-----------------------------------------------------------------------

谢谢您百忙中还答复AVR扩展板的事,现在看大家有没有解决此问题的好办法,希望大家给出个主意。

出0入0汤圆

发表于 2010-4-8 21:39:13 | 显示全部楼层
还是外扩一个 24C256 吧。我已经在 3楼 说了。

只是AVR扩展板中的确没有外扩EEPROM,我真不知道是为什么。

出0入0汤圆

发表于 2010-4-8 22:08:19 | 显示全部楼层
从APP跳到BOOT执行不行吗?

出0入0汤圆

发表于 2010-4-8 22:40:57 | 显示全部楼层
行是行,关键这来回跳转?

通讯一次,复位一次.这还怎么干活.

出0入0汤圆

 楼主| 发表于 2010-4-9 08:18:54 | 显示全部楼层
外扩一个 24C256 是彻底解决此问题的方法;用call和ret指令在APP和BOOT之间来回跳转没成功,是一定要用复位的方法吗?没有查到有关资料。

出0入0汤圆

发表于 2010-4-10 01:35:02 | 显示全部楼层
【11楼】 peet
您好,要想IAP,必须在BOOT程序里面。难道要把所有的 PLC 代码都放在很小的 引导程序区 里吗?
所以,从这个角度来讲 AVR 扩展板上必须要要有 EEPROM 的。

出0入0汤圆

发表于 2013-8-23 16:39:30 | 显示全部楼层
MARK
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-7-24 01:37

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

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