|
我的程序是按您ICCAVR的BOOTLOADER改写的,多有冒犯,在此深表歉意。
#include <mega64.h>
// Declare your global variables here
#define uchar unsigned char
#define uint unsigned int
#define PAGESIZE1 128 //M16的一个Flash页为128字节(64字)
#define PAGESIZE 256 //M16的一个Flash页为128字节(64字)
uint ADDRESS = 0x1234; //????地址修改后,数据没存在以次地址开始的flash页内????(问题)
uchar DATA[256];
uchar data1[256] = {0x00};
uchar q,w,e,f;
void FU()
{
uchar i;
for(i=0;i<128;i++)
DATA = i;
}
//擦除(code=0x03)和写入(code=0x05)一个Flash页
void boot_page_ew(uint p_address,uchar code)
{
q=(char)p_address;
w=(char)p_address>>8;
e=(char)code;
#asm
mov r30,_q
mov r31,_w
out 0x3b,_e
#endasm //将页地址放入Z寄存器和RAMPZ的Bit0中
SPMCSR = code; //寄存器SPMCSR中为操作码
#asm("spm"); //对指定Flash页进行操作
}
//填充Flash缓冲页中的一个字
void boot_page_fill(uint address,uint data)
{
q=(char)address;
w=(char)address>>8;
e=(char)data;
f=(char)data>>8;
#asm
mov r30,_q
mov r31,_w //Z寄存器中为填冲页内地址
mov r0,_e
mov r1,_f
#endasm //R0R1中为一个指令字
SPMCSR = 0x01;
#asm("spm");
}
//等待一个Flash页的写完成
void wait_page_rw_ok(void)
{
while(SPMCSR & 0x40)
{
while(SPMCSR & 0x01);
SPMCSR = 0x11;
#asm("spm");
}
}
//更新一个Flash页的完整处理
void write_one_page(uint address,uchar data[])
{
uint i;
uint da[PAGESIZE1];
uchar j;
boot_page_ew(address,0x03); //擦除一个Flash页
wait_page_rw_ok(); //等待擦除完成
for(i=0,j=0;i<PAGESIZE;i+=2,j++) //将数据填入Flash缓冲页中
{
da[j] = data[i+1];
da[j] = data+ (da[j] <<8 );
boot_page_fill(i,da[j]);
}
boot_page_ew(address,0x05); //将缓冲页数据写入一个Flash页
wait_page_rw_ok(); //等待写入完成
}
void main()
{
#asm("CLI");
MCUCR = 0x00;
TIMSK = 0x00;
#asm("SEI");
FU();
write_one_page(ADDRESS,DATA);
}
运行结果是
flash (原文件名:tu.GIF)
ICCAVR中是自动把函数参数赋值给R16,R17,R18,R19的,而CVAVR没的,所以我自己定义变量赋给R30,R31,R0,R1
可是用AVRSTUDIO运行还是不行,错在哪呢? |
|