|
马老师,我在论坛看到你写的BOOTLOADER技术详谈后,我就写了这样一段代码,好像数据时可以写到flash里了,但好像地址改不了,不管怎么改数据都是存在地址 0x0 ~ 0X3F,是不是我程序哪里有问题啊?(我用ICC编的,生成.cof文件后通过avr studio运行的)
将00到127存入flash一页后分布 (原文件名:QQ截图未命名.jpg)
#include <iom16v.h>
#include <macros.h>
#include <eeprom.h>
#define uchar unsigned char
#define uint unsigned int
#define PAGESIZE1 64 //M16的一个Flash页为128字节(64字)
#define PAGESIZE 128 //M16的一个Flash页为128字节(64字)
uint ADDRESS = 0x0040; //????地址修改后,数据没存在以次地址开始的flash页内????(问题)
uchar DATA[128];
uchar data1[128] = {0x00};
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)
{
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();
FU();
write_one_page(ADDRESS,DATA);
while(1);
} |
阿莫论坛20周年了!感谢大家的支持与爱护!!
你熬了10碗粥,别人一桶水倒进去,淘走90碗,剩下10碗给你,你看似没亏,其实你那10碗已经没有之前的裹腹了,人家的一桶水换90碗,继续卖。说白了,通货膨胀就是,你的钱是挣来的,他的钱是印来的,掺和在一起,你的钱就贬值了。
|