1139193886 发表于 2015-4-23 23:32:14

AVR的bootloader问题,请求大神帮忙解决一下,非常感谢。

我就简单的描述一下情况,这个问题困扰两天都没解决,感觉有点迷茫了,请大神指点一下,非常感谢。

也写入的函数如下:
void boot_write_one_page(void)
{
        unsigned int i;
        DataUnionByte TempData;
        eeprom_busy_wait();
        boot_page_erase(address);                        /* 擦除一页 */
        boot_spm_busy_wait();                                /*等待擦除完成*/
        for (i=0;i<DATA_BUFFER_SIZE;i+=2)
        {
                TempData.databuff8=databuff.databuff8;
                TempData.databuff8=databuff.databuff8;
                boot_page_fill_safe(i,TempData.databuff16);
        }
        boot_page_write_safe(address);                /* 写入一页 */
        boot_rww_enable_safe();
}

用的是atmega32单片机,主要问题是,在用bootloader写入程序之后,通过jmp 0x0000直接跳到app区的代码开始执行,但是结果是当通过bootloader烧入程序之后,程序并没有运行。

下面说一下我用的工具等情况:
开发环境是atmelstudio 6(avrstudio 6)
bootloader 上位机用的是avrubd,来自邵子扬老师

通过开发环境生成hex文件,然后通过bootloader上位机烧入hex文件,上位机提示烧写成功,下位机无反映。通过flash读取函数读出来的数据与写入的一致,!也就是写入的数据是没有问题的。

静候大神指点,有什么地方不明确的地方欢迎提出,谢谢!

netting 发表于 2015-4-24 00:29:16

这是一个漫长的过程,中间有苦有乐

1139193886 发表于 2015-4-24 00:38:09

netting 发表于 2015-4-24 00:29
这是一个漫长的过程,中间有苦有乐

嗯嗯,谢谢支持

cock 发表于 2015-4-24 00:46:56

---->通过flash读取函数读出来的数据与写入的一致,!也就是写入的数据是没有问题的。

用stk500读出比较,如果FLASH一样却不能运行,再继续发帖探讨。

柱子哥 发表于 2015-4-24 06:30:55

路过,想学习相关的问题,苦于没有资料。

chenshichao541 发表于 2015-4-24 10:42:08

请问一下楼主,楼主在6上面的bootloader地址,在工程中怎么设置的呢?我找不到在哪里设置。

1139193886 发表于 2015-4-24 12:27:55

chenshichao541 发表于 2015-4-24 10:42
请问一下楼主,楼主在6上面的bootloader地址,在工程中怎么设置的呢?我找不到在哪里设置。 ...

属性-->Toolchain-->AVR/GUN Linker-->Memory Settings-->FLASH setment

1139193886 发表于 2015-4-24 12:32:07

cock 发表于 2015-4-24 00:46
---->通过flash读取函数读出来的数据与写入的一致,!也就是写入的数据是没有问题的。

用stk500读出比较, ...

怎么操作,麻烦指点一下,或是发个教程什么的,谢谢啦

wujiaodalou911 发表于 2015-4-24 12:56:12

感觉刁刁的,楼主能介绍一下这个是自己写的还是编译器自带的吗。能说一下你整个工程想要实现的功能不。想学习一下。。{:lol:}{:lol:}

chenshichao541 发表于 2015-4-24 14:16:37

1139193886 发表于 2015-4-24 12:27
属性-->Toolchain-->AVR/GUN Linker-->Memory Settings-->FLASH setment

谢谢了,我也是在这里设置的,这样写的.bootloader=0x1fc00,不知道对不对,但是app部分烧录不进去。

cock 发表于 2015-4-24 15:14:05

1139193886 发表于 2015-4-24 12:32
怎么操作,麻烦指点一下,或是发个教程什么的,谢谢啦

或者说我就不相信你写入的程序没错,你用STK500读出来对比,而不是用你自己的bootload读出来对比。如果写入真的没有错,用STK500把复位入口改为0000,看是否正常运行。如果不能说明是APP有错。

Gorgon_Meducer 发表于 2015-4-25 00:03:22

首先判断不用bootloader,直接用isp工具写入到芯片,程序是否能执行(当然,要修改启动地址到应用区)
这是要排除你观察不到现象的原因是你的应用程序本身还是bootloader。你说程序没有执行,这是一个片面
的判断,你只是观察不到你期望的现象,不代表你的jmp不成功,另外,我觉得你是不是忘记把中断向量切换
到应用区了?

1139193886 发表于 2015-4-25 10:30:24

chenshichao541 发表于 2015-4-24 14:16
谢谢了,我也是在这里设置的,这样写的.bootloader=0x1fc00,不知道对不对,但是app部分烧录不进去。 ...

烧录不进去是bootloader有问题吧

1139193886 发表于 2015-4-25 10:31:17

cock 发表于 2015-4-24 15:14
或者说我就不相信你写入的程序没错,你用STK500读出来对比,而不是用你自己的bootload读出来对比。如果写 ...

嗯嗯,就是手头上没有STK500

1139193886 发表于 2015-4-25 10:40:58

Gorgon_Meducer 发表于 2015-4-25 00:03
首先判断不用bootloader,直接用isp工具写入到芯片,程序是否能执行(当然,要修改启动地址到应用区)
这是 ...

用isp烧进去了可以执行,程序就是一个LED闪烁的程序。至于中断向量,首先在bootloader里面没用用程序,但是还是补上了中断向量的操作,就是启动bootloader时将中断向量移至boot区,退出后移至应用区。
还有个现象就是刚烧进bootloader,还没有用bootloader烧其他程序的时候bootloader会循环执行(之所以说循环执行是因为bootloader里面有计时时间到会自动推出bootloader)。当烧进去程序之后(就是一个LED闪烁的程序),bootloader就不会再循环执行了。

判断循环执行bootloader方法是因为,在bootloader里面会定时发送一个字符。

tomhe666 发表于 2015-4-25 11:24:39

中断向量转移有时序要求的, 我记得是必须四个周期内完成, 一般C语言如果没处理好,就超出了, 然后中断向量转移不成功, 程序运行很多问题

1139193886 发表于 2015-4-25 11:42:40

tomhe666 发表于 2015-4-25 11:24
中断向量转移有时序要求的, 我记得是必须四个周期内完成, 一般C语言如果没处理好,就超出了, 然后中断向量转 ...

那我用汇编试试。

1139193886 发表于 2015-4-25 11:55:00

tomhe666 发表于 2015-4-25 11:24
中断向量转移有时序要求的, 我记得是必须四个周期内完成, 一般C语言如果没处理好,就超出了, 然后中断向量转 ...

试了,没效果。

Gorgon_Meducer 发表于 2015-4-25 22:33:09

1139193886 发表于 2015-4-25 10:40
用isp烧进去了可以执行,程序就是一个LED闪烁的程序。至于中断向量,首先在bootloader里面没用用程序,但 ...

尝试在你的测试程序里面关闭中断,并且不要开启中断,然后再做LED闪烁测试(只做闪烁),基本只依赖GPIO之类的。
主要是测试是否是因为bootloader的某些寄存器操作改变了复位状态导致的问题。另外,尝试关闭看门狗。
页: [1]
查看完整版本: AVR的bootloader问题,请求大神帮忙解决一下,非常感谢。