|
我参考网上的一些实例,用icc编了这一段写一页flash的代码,请高人帮我看看,这样的写法能不能实现flash写一页操作???
又该如何读取这一页的数据??????
#include <iom16v.h>
#include <macros.h>
#include <eeprom.h>
#define uchar unsigned char
#define uint unsigned int
#define PAGESIZE 128 //M16的一个Flash页为128字节(64字)
#define PAGESIZE1 64 //M16的一个Flash页为128字节(64字)
uint ADDRESS = 0x0000;
uchar DATA[128] = {0X01};
uchar data1[128] = {0x00};
//擦除(code=0x03)和写入(code=0x05)一个Flash页
void boot_page_ew(uint p_address,uchar code)
{
asm("mov r30,r16\n"
"mov r31,r17\n"
"out 0x3b,r18\n"); //将页地址放入Z寄存器和RAMPZ的Bit0中
SPMCR = code; //寄存器SPMCSR中为操作码
asm("spm\n"); //对指定Flash页进行操作
}
//填充Flash缓冲页中的一个字
void boot_page_fill(uint address,uint data)
{
asm("mov r30,r16\n"
"mov r31,r17\n" //Z寄存器中为填冲页内地址
"mov r0,r18\n"
"mov r1,r19\n"); //R0R1中为一个指令字
SPMCR = 0x01;
asm("spm\n");
}
//等待一个Flash页的写完成
void wait_page_rw_ok(void)
{
while(SPMCR & 0x40)
{
while(SPMCR & 0x01);
SPMCR = 0x11;
asm("spm\n");
}
}
//更新一个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()
{
CLI();
MCUCR = 0x00;
TIMSK = 0x00;
SEI();
write_one_page(0,DATA);
while(1);
} |
阿莫论坛20周年了!感谢大家的支持与爱护!!
曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……
|