|
已在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周年了!感谢大家的支持与爱护!!
你熬了10碗粥,别人一桶水倒进去,淘走90碗,剩下10碗给你,你看似没亏,其实你那10碗已经没有之前的裹腹了,人家的一桶水换90碗,继续卖。说白了,通货膨胀就是,你的钱是挣来的,他的钱是印来的,掺和在一起,你的钱就贬值了。
|