tong7127 发表于 2009-8-28 15:44:10

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);
}

tong7127 发表于 2009-8-29 09:06:33

可以正确的写入了,原来是我地址设的不对。可是怎么样才能将flash一页的数据读出来呢??

xingkong911 发表于 2009-9-15 21:33:58

请问楼主:我的atmega128的boot地址根据熔丝位的设置是:0xFC,这样是不是必须把boot程序写到这个0xFC地址才能运行呢?我用编程器写到0x00,这样不能运行。

tong7127 发表于 2009-9-16 08:13:49

boot区程序只有写入boot区才能运行。你要根据你boot区的大小来确定地址。

qiuxiangkai 发表于 2009-9-16 13:01:21

你用IAR的吗?我在搞boot,IAR不太会设

machao 发表于 2009-9-17 12:02:48

lz:你看到的会是你的代码吗?会这么有规律从0X00到0XFF吗?

先把基本的东西都弄明白后,再学习BOOTLOAD。

tong7127 发表于 2009-9-23 15:05:08

问题解决了。

zhoujinwei 发表于 2009-9-23 15:54:09

怎么解决的,给大家一个思路啊

wodetianmyday 发表于 2009-10-23 15:22:34

boot_page_ew(address,0x05);                  //将缓冲页数据写入一个Flash页

这不是擦除吗?怎么也能写入啊

还有RAMPZ是什么东东?

qzf368 发表于 2009-10-24 01:06:59

RAMPZ请见文档说明,M16不用RAMPZ

haolei432370 发表于 2013-6-20 16:53:40

我遇到的问题和楼主不一一样,先下载bootloader中的程序。然后在下载应用区的程序,下载后 读取bootloader就是这样的代码了。求解
(我打算从U盘中读取数据来更新程序)
页: [1]
查看完整版本: mage16 bootloader写flash