搜索
bottom↓
回复: 10

mage16 bootloader写flash

[复制链接]

出0入0汤圆

发表于 2009-8-28 15:44:10 | 显示全部楼层 |阅读模式
马老师,我在论坛看到你写的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周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入0汤圆

 楼主| 发表于 2009-8-29 09:06:33 | 显示全部楼层
可以正确的写入了,原来是我地址设的不对。可是怎么样才能将flash一页的数据读出来呢??

出0入0汤圆

发表于 2009-9-15 21:33:58 | 显示全部楼层
请问楼主:我的atmega128的boot地址根据熔丝位的设置是:0xFC,这样是不是必须把boot程序写到这个0xFC地址才能运行呢?我用编程器写到0x00,这样不能运行。

出0入0汤圆

 楼主| 发表于 2009-9-16 08:13:49 | 显示全部楼层
boot区程序只有写入boot区才能运行。你要根据你boot区的大小来确定地址。

出0入0汤圆

发表于 2009-9-16 13:01:21 | 显示全部楼层
你用IAR的吗?我在搞boot,IAR不太会设

出0入0汤圆

发表于 2009-9-17 12:02:48 | 显示全部楼层
lz:你看到的会是你的代码吗?会这么有规律从0X00到0XFF吗?

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

出0入0汤圆

 楼主| 发表于 2009-9-23 15:05:08 | 显示全部楼层
问题解决了。

出0入0汤圆

发表于 2009-9-23 15:54:09 | 显示全部楼层
怎么解决的,给大家一个思路啊

出0入0汤圆

发表于 2009-10-23 15:22:34 | 显示全部楼层
boot_page_ew(address,0x05);                    //将缓冲页数据写入一个Flash页

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

还有RAMPZ是什么东东?

出0入0汤圆

发表于 2009-10-24 01:06:59 | 显示全部楼层
RAMPZ请见文档说明,M16不用RAMPZ

出0入0汤圆

发表于 2013-6-20 16:53:40 | 显示全部楼层
我遇到的问题和楼主不一一样,先下载bootloader中的程序。然后在下载应用区的程序,下载后 读取bootloader就是这样的代码了。求解
(我打算从U盘中读取数据来更新程序)
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-3-29 05:12

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表