打印
[AVR单片机]

bootloder为何写不了flash?

[复制链接]
3797|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
chrisbo|  楼主 | 2011-3-1 10:40 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我用winavr+GCC写了个mega32的bootloder程序,但是发现flash一直没有能写进去。。通过pgm_read_byte/word读出来看的全是FF,下面是我写flash的程序,恳请高手帮忙看看有什么不对的地方?
uchar write_flash_one_page(uint add,uchar *buf)
{
   uchar  pagptr;
   ushort pdata;
   boot_page_erase(add);
   boot_spm_busy_wait();      //等待页擦除完成
   for(pagptr=0;pagptr<page_size;pagptr+=2)//数据填入Flash缓冲页,按字填充
   {
     pdata=buf[pagptr];
pdata+=buf[pagptr+1]<<8;
     boot_page_fill(add+pagptr,pdata);
   }
   boot_page_write(add);     //将缓冲页数据写入个一Flash页
   boot_spm_busy_wait();     // Wait until the memory is written.
   boot_rww_enable();
   return TRUE;
}
自己反复找了一天了始终找不到原因。。我的AVR Studio是4.18版本的用的JTAG编程下载器,不知道是不是软件有问题

相关帖子

沙发
chrisbo|  楼主 | 2011-3-1 16:30 | 只看该作者
继续沉吧。。。

使用特权

评论回复
板凳
john_lee| | 2011-3-1 16:55 | 只看该作者
1、检查熔丝位BLBxx,BOOTRST,BOOTSZx是否设置正确。
2、确认write_flash_one_page()位于bootloader区,并且确实被调用了。
3、write_flash_one_page()中最好关中断,参考boot.h中的范例。
4、write_flash_one_page()中的page_size是什么?建议使用SPM_PAGESIZE宏定义。

使用特权

评论回复
地板
chrisbo|  楼主 | 2011-3-2 09:53 | 只看该作者
3# john_lee
熔丝位bootrst设置的是从boot区开始复位,boot区大小设置为2k,bootloder程序已经烧录到起始地址为0x3C00的boot区里,我接收数据使用的接口是TWI两线串行接口,程序运行到哪一步我都有从串口发出数据提示,程序的过程倒是都跑完了就是flash没写进去,我感觉有可能写flash的时间上出了问题。。

使用特权

评论回复
5
chrisbo|  楼主 | 2011-3-2 13:10 | 只看该作者
哎自己太粗心了,这毛病老改不过来啊。。面壁去了

使用特权

评论回复
6
john_lee| | 2011-3-2 15:19 | 只看该作者
:D 其实我早就估摸着是LZ犯了低级错误,所以才提醒一些原本不用提醒的细节。

使用特权

评论回复
7
kdkt2011| | 2013-11-13 10:43 | 只看该作者
你好,我的也是flash写不进去,楼主给看看,谢谢
.include "tn13def.inc"

.ORG        0x0000
                RJMP        Chu_Shi_Hua
.ORG        0x0020
Chu_Shi_Hua:
;定义定时器T/C0
        LDI                R16,1<<WGM01        ;工作模式CTC
        OUT                TCCR0A,R16
;定义ADC
        LDI                R16,(1<<ADEN)|(1<<ADPS1)|(1<<ADPS0)        ;开ADC,采样频率8分频
        OUT                ADCSRA,R16
        LDI                R16,(1<<ADC2D)|(1<<ADC3D)        ;关闭PB3,PB4的数字输入缓冲       
        OUT                DIDR0,R16
;                LDI                R16,(0<<REFS0)|(0<<ADLAR)|(0<<MUX1);设置ADC
;                OUT                ADMUX,R16
        LDI                R16,(1<<SM0)|(1<<SE)        ;开ADC模式,使能SLEEP指令
        OUT                MCUCR,R16
;定义堆栈
        LDI                R16,LOW(RAMEND)               
        OUT                SPL,R16
        SEI                          ;开全局中断

        LDI                ZL,LOW(2*Date)
        LDI                ZH,HIGH(2*Date)

ldi                r16,0x33
mov                r0,r16
ldi                r16,0x44
mov                r1,r16

                LDI                R16,0x01;填充页缓冲器
                OUT                SPMCSR,R16
                SPM

                LDI                R16,0x03;页擦除
                OUT                SPMCSR,R16
                SPM
;                LDI                R16,0x05;写页
;                OUT                SPMCSR,R16
;                SPM

;sleep
bb:
;nop
rjmp                bb

.ORG        0x10
Date: .DW        0x0100


使用特权

评论回复
8
kdkt2011| | 2013-11-13 10:46 | 只看该作者
上面的不清楚,从新发个
.include "tn13def.inc"

.ORG        0x0000
                RJMP        Chu_Shi_Hua
.ORG        0x0020
Chu_Shi_Hua:
;定义定时器T/C0
        LDI                R16,1<<WGM01        ;工作模式CTC
        OUT                TCCR0A,R16
;定义ADC
        LDI                R16,(1<<ADEN)|(1<<ADPS1)|(1<<ADPS0)        ;开ADC,采样频率8分频
        OUT                ADCSRA,R16
        LDI                R16,(1<<ADC2D)|(1<<ADC3D)        ;关闭PB3,PB4的数字输入缓冲       
        OUT                DIDR0,R16
;                LDI                R16,(0<<REFS0)|(0<<ADLAR)|(0<<MUX1);设置ADC
;                OUT                ADMUX,R16
        LDI                R16,(1<<SM0)|(1<<SE)        ;开ADC模式,使能SLEEP指令
        OUT                MCUCR,R16
;定义堆栈
        LDI                R16,LOW(RAMEND)               
        OUT                SPL,R16
        SEI                          ;开全局中断

        LDI                ZL,LOW(2*Date)
        LDI                ZH,HIGH(2*Date)

ldi                r16,0x33
mov                r0,r16
ldi                r16,0x44
mov                r1,r16

                LDI                R16,0x01;填充页缓冲器
                OUT                SPMCSR,R16
                SPM

                LDI                R16,0x03;页擦除
                OUT                SPMCSR,R16
                SPM
                LDI                R16,0x05;写页
                OUT                SPMCSR,R16
                SPM


bb:
rjmp                bb

.ORG        0x10
Date: .DW        0x0100

使用特权

评论回复
9
fayfive| | 2014-3-26 22:16 | 只看该作者
请问你是怎样解决  bootloder为何写不了flash?  这个问题,我遇上和你同样的问题,我用iar编译了一个boot文件,设置了4kboot区,用isp烧写,可以看到所有数据都在相应的boot区(0xf000开始),我用xmodem协议接收数据,当我接收到数据后,也是写不到用户区,rstboot配了,bootload是在想要的区域,我没有用中断,请问你最后发现是什么问题,我也是找了很久也找不到问题,期望赐教,BLBXX熔丝和这个有关系吗?

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:吾生之有涯,而知也无涯!

0

主题

55

帖子

0

粉丝