|
发表于 2010-5-7 16:47:39
|
显示全部楼层
请问各位高手!我使用ATMega128单片机做在线升级出现如下问题:
在应用区读取应用区程序我使用如下函数是可以
unsigned char read_flash(long address)//从flash中读取一字节
{
asm("mov r30,r16");
asm("mov r31,r17");
asm("out 0x3b,r18\n") //zsy add it
asm("lpm r16,z");
//asm("elpm r16,z+"); //zsy add it
//asm("ret");
}
擦出使用如下:
#if RUN_MODE==AP_MODE
#pragma abs_address:0XFC00 //绝对地址定位到boot区
#endif
//擦除(code=0x03)和写入(code=0x05)一个Flash页
void boot_page_ew(long p_address,char m_code)
{
asm("mov r30,r16\n"
"mov r31,r17\n"
"out 0x3b,r18\n"); //将页地址放入Z寄存器和RAMPZ的Bit0中
SPMCSR = m_code; //寄存器SPMCSR中为操作码
asm("spm "); //对指定Flash页进行操作 //(Z)<-R1:R0
}
//填充Flash缓冲页中的一个字
void boot_page_fill(unsigned int address,int dat)
{
asm("mov r30,r16\n"
"mov r31,r17\n" //Z寄存器中为填冲页内地址
"mov r0,r18\n"
"mov r1,r19\n"); //R0R1中为一个指令字
SPMCSR = 0x01;
asm("spm "); //(Z)<-R1:R0
}
//等待一个Flash页的写完成
void wait_page_rw_ok(void)
{
while(SPMCSR & 0x40)
{
while(SPMCSR & 0x01);
SPMCSR = 0x11;
asm("spm\n"); //(Z)<-R1:R0
}
}
//更新一个Flash页的完整处理
void write_one_page(char *dat)
{
unsigned int i;
boot_page_ew(address,0x03); //擦除一个Flash页
wait_page_rw_ok(); //等待擦除完成
for(i=0;i<SPM_PAGESIZE;i+=2) //将数据填入Flash缓冲页中
{
boot_page_fill(i, dat+(dat[i+1]<<8));
}
boot_page_ew(address,0x05); //将缓冲页数据写入一个Flash页
wait_page_rw_ok(); //等待写入完成
}
#if RUN_MODE==AP_MODE
#pragma end_abs_address //结束绝对地址定位
#endif
如果我要在应用程序运行时,擦写应用区的高64K怎么办啊! |
|