mage16 bootloader写flash
马老师,我在论坛看到你写的BOOTLOADER技术详谈后,我就写了这样一段代码,好像数据时可以写到flash里了,但好像地址改不了,不管怎么改数据都是存在地址 0x0 ~ 0X3F,是不是我程序哪里有问题啊?(我用ICC编的,生成.cof文件后通过avr studio运行的)http://cache.amobbs.com/bbs_upload782111/files_17/ourdev_475515.jpg
将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;
uchar data1 = {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;
uchar j;
boot_page_ew(address,0x03); //擦除一个Flash页
wait_page_rw_ok(); //等待擦除完成
for(i=0,j=0;i<PAGESIZE;i+=2,j++) //将数据填入Flash缓冲页中
{
da = data;
da = data+ (da <<8 );
boot_page_fill(i,da);
}
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);
} 可以正确的写入了,原来是我地址设的不对。可是怎么样才能将flash一页的数据读出来呢?? 请问楼主:我的atmega128的boot地址根据熔丝位的设置是:0xFC,这样是不是必须把boot程序写到这个0xFC地址才能运行呢?我用编程器写到0x00,这样不能运行。 boot区程序只有写入boot区才能运行。你要根据你boot区的大小来确定地址。 你用IAR的吗?我在搞boot,IAR不太会设 lz:你看到的会是你的代码吗?会这么有规律从0X00到0XFF吗?
先把基本的东西都弄明白后,再学习BOOTLOAD。 问题解决了。 怎么解决的,给大家一个思路啊 boot_page_ew(address,0x05); //将缓冲页数据写入一个Flash页
这不是擦除吗?怎么也能写入啊
还有RAMPZ是什么东东? RAMPZ请见文档说明,M16不用RAMPZ 我遇到的问题和楼主不一一样,先下载bootloader中的程序。然后在下载应用区的程序,下载后 读取bootloader就是这样的代码了。求解
(我打算从U盘中读取数据来更新程序)
页:
[1]