搜索
bottom↓
回复: 8

大胆的请教马老师,请问为什么cvavr的bootloader没有呢?而大都是ICCAVR的,我改写的BOOTL

[复制链接]

出0入0汤圆

发表于 2009-11-3 17:43:51 | 显示全部楼层 |阅读模式
我的程序是按您ICCAVR的BOOTLOADER改写的,多有冒犯,在此深表歉意。

#include <mega64.h>

// Declare your global variables here



#define uchar        unsigned char  
#define uint        unsigned int

#define PAGESIZE1           128   //M16的一个Flash页为128字节(64字)

#define PAGESIZE           256   //M16的一个Flash页为128字节(64字)


uint ADDRESS = 0x1234;           //????地址修改后,数据没存在以次地址开始的flash页内????(问题)
uchar DATA[256];
uchar data1[256] = {0x00};
uchar q,w,e,f;
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)  
{
q=(char)p_address;
w=(char)p_address>>8;
e=(char)code;
#asm
mov r30,_q
mov r31,_w
out 0x3b,_e
#endasm           //将页地址放入Z寄存器和RAMPZ的Bit0中  
    SPMCSR = code;                //寄存器SPMCSR中为操作码  
    #asm("spm");                    //对指定Flash页进行操作  
}

//填充Flash缓冲页中的一个字  
void boot_page_fill(uint address,uint data)  
{  
     q=(char)address;
     w=(char)address>>8;
     e=(char)data;
    f=(char)data>>8;     
     #asm
     mov r30,_q  
     mov r31,_w             //Z寄存器中为填冲页内地址  
     mov r0,_e
     mov r1,_f
     #endasm          //R0R1中为一个指令字
    SPMCSR = 0x01;  
    #asm("spm");  
}  

//等待一个Flash页的写完成  
void wait_page_rw_ok(void)  
{  
   while(SPMCSR & 0x40)  
     {  
         while(SPMCSR & 0x01);  
         SPMCSR = 0x11;  
         #asm("spm");  
     }  
}  
//更新一个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()
{
#asm("CLI");
MCUCR = 0x00;
TIMSK = 0x00;  
#asm("SEI");
FU();
write_one_page(ADDRESS,DATA);
}
运行结果是

flash (原文件名:tu.GIF)
ICCAVR中是自动把函数参数赋值给R16,R17,R18,R19的,而CVAVR没的,所以我自己定义变量赋给R30,R31,R0,R1
可是用AVRSTUDIO运行还是不行,错在哪呢?

出0入0汤圆

 楼主| 发表于 2009-11-3 17:45:29 | 显示全部楼层
程序是在bls里

出0入0汤圆

发表于 2009-11-3 18:54:02 | 显示全部楼层
不同编译器对语法的解释和硬件的使用时不一样的,你嵌汇编弄错了,自己看用户手册,看完就知道什么原因了

出0入0汤圆

 楼主| 发表于 2009-11-4 11:21:32 | 显示全部楼层
回touch_avr

那您认为应该怎么改呢?cvavr也允许我这样嵌汇编啊,您有没有相关的cvavr中文用户手册,链接也行,不过还是希望您能帮忙修改一下,就不用看完CVAVR手册了,省时间啊,万分感谢!

出0入0汤圆

发表于 2009-11-4 12:45:02 | 显示全部楼层
论坛搜搜吧,CVAVR是使用Y指针传递变量的,

出0入0汤圆

 楼主| 发表于 2009-11-4 14:03:53 | 显示全部楼层
谢谢各位,不过我还是希望谁能帮我改改这程序。
如果对CVAVR很了解的话,我想这用不了改几个字吧。
等候中....

出0入0汤圆

 楼主| 发表于 2009-11-6 09:44:11 | 显示全部楼层
的确是用Y寄存器,现可以烧进去了,不过有个问题,为什么用ICC存储进去的FLASH页附近Flash值是F,

ICC (原文件名:q.JPG)
在整个Flash存储器中除了bootloader区里面的程序存储空间和写进去的一页Flash外,其他都是F值

而用CVAVR存储进去的FLASH页附近Flash值是0,

AVR (原文件名:w.JPG)
在整个Flash存储器中除了bootloader区里面的程序存储位置以及此后其余的Flash是F值,和写进去的一页Flash外,其他都是0值

出0入0汤圆

发表于 2009-11-6 12:01:51 | 显示全部楼层
我是我同学调试出问题的,然后我给他弄的,源码不在我电脑上,就提方法是:
1:他用的是GCC版的bootloader源码
2:你就要修改那几个函数,嵌汇编,你可以查一下CVAVR怎么嵌汇编就知道怎么传递参数。
3:剩下的,你应该知道怎么做,不会花多少时间,我用了两个小时搞定所有

出0入0汤圆

发表于 2009-11-6 17:03:20 | 显示全部楼层
请问楼主,能否把改好的bootloader的程序发上来?万分感谢!
主要是我不知道怎么用CVAVR擦写flash.
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-5-3 10:30

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

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