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) ;
} 上面程序使用CVAVR编译器,在bootloader区编译运行通过。请指教在应用区实现IAP功能的方法。 在 AVR 专区 已回复。 回复 wisebaby 明君
------------------------------------------
谢谢指教!我是想将您的“简易PLC 梯型图 解释型监控 示范程序(用于 51单片机)”移植到“AVR扩充板中”,因学疏才浅,卡在这里了,出来求教。
页:
[1]