avr77 发表于 2017-11-15 19:45:31

AT32UC3 程序已下载 但在重新上电后不能自动执行

本帖最后由 avr77 于 2017-11-15 19:47 编辑

开发环境是Atmel Studio 7.0,程序是通过JTAG下载的,每次重新下载,然后开始调试,一切正常。但是断电后重新上电,就不能工作。第一次接触AVR32,请大家给一些方向,在此先谢过了!

liuqian 发表于 2017-11-15 20:56:26

熔丝位
系统时钟设定
看门狗

先搞个最简单的闪灯

avr77 发表于 2017-11-16 00:20:41

本帖最后由 avr77 于 2017-11-16 00:23 编辑

liuqian 发表于 2017-11-15 20:56
熔丝位
系统时钟设定
看门狗


先谢谢您的回复。

我按照您的答案重新设置了熔丝位,没有什么变化。然后写了一个LED闪烁的程序,在重新上电后可以自动运行。在这个程序里面,除了跟那个不运行的程序一样的初始化时钟以及让LED闪烁以外,没有任何其他操作。另外LED闪烁得明显比用JTAG调试的时候快很多。

可能是我的系统时钟设置有问题,但是原来的程序用到串口还有CAN,波特率都是对的,如果改系统时钟设置不知道会不会有另外的错误,还请您继续帮忙分析一下,谢谢~

liuqian 发表于 2017-11-16 14:01:43

本帖最后由 liuqian 于 2017-11-16 14:05 编辑

AVR32时钟有一大堆,一定确认外设使用正确的时钟。如果你使用了外设,但是外设对应的时钟没有设置好,会死机。AST时钟的库有bug,别用,自己写寄存器。
只能提示到这个程度了,然后就是你自己细心读datasheet,核对自己的程序,有时候就是小错误。前几天我刚出现一个bug,开优化O1就错,关优化O0就能正常运行,整了两天,最后发现有个分支少了一个return false。

tongdayusu 发表于 2017-11-16 14:11:27

哈,现在开发新产品用AVR32的话,慎重啊。停产了就over了。

avr77 发表于 2017-11-16 17:17:17

本帖最后由 avr77 于 2017-11-16 18:55 编辑

liuqian 发表于 2017-11-16 14:01
AVR32时钟有一大堆,一定确认外设使用正确的时钟。如果你使用了外设,但是外设对应的时钟没有设置好,会死 ...

我现在做的东西是在以前的项目基础上添加新的模块,一个是电机的控制一个是串口。我自己写的那部分还好说,但是别人写的那一大堆查看起来就很费力了。所以我想先弄清楚,用JTAG在线调试和烧完程序重新上电执行,这两种方式到底有什么区别,这个区别会不会导致LED闪烁频率的变化。我之前就在学校学过51单片机,项目经历基本为零,如果有什么书籍或者网站推荐也很好,麻烦大家了。

另外,我是从客户那里得到过两个版本的源代码,第一个版本是纯 c 工程一切正常,虽然LED闪的比调试快,但是至少还在闪。第二个版本变成了 c 和 c++ 混合工程,并添加了一些模块。然后我在第二个版本中把主程序改的和第一个版本一摸一样,但是重新上电后LED不闪,并且时不时在 JTAG 调试的时候也不正常,需要手动在 tools-> Device Programming-> Memories 里面去擦除 Flash,否则暂停调试会跳到 Disassembly 里面,整个程序卡住 虽然Flash 在每次烧写的时候是自动擦除的。不知道第二个版本到底有什么问题,而我必须使用第二个版本。。。

liuqian 发表于 2017-11-17 06:21:19

本帖最后由 liuqian 于 2017-11-17 06:29 编辑

跳到 Disassembly 里面,是在异常里面吗?如果是,通常是因为指针的问题,C和C++常见的错误
需要手动在 tools-> Device Programming-> Memories 里面去擦除 Flash,否则暂停调试会跳到 Disassembly 里面
这是现象,不是原因

用jtag调试和直接烧写的debug运行情况一样吗?
jtag调试不要开优化,开优化后代码就和C源码就不一一对应了,调试时原程序是乱的,运行的指针对不上源码,很多地方不能设断点。
另外debug和release的编译选项你可以仔细看看有什么不同

另外,如果有机会说服老大,赶紧换平台,AVR32很少有人用了,在avrfreak上帖子都很少了,出了问题都找不到人问,特别是被microchip收购后,除了arm的M3,M7平台,还有microchip自己的32位机,产品线重合,avr32被砍的可能性很大

avr77 发表于 2017-11-17 21:50:30

本帖最后由 avr77 于 2017-11-17 23:29 编辑

liuqian 发表于 2017-11-17 06:21
跳到 Disassembly 里面,是在异常里面吗?如果是,通常是因为指针的问题,C和C++常见的错误
需要手动在 too ...

直接烧写和debug运行情况是一样的。并且现在直接烧写完不debug,程序正常运行,只要重新上电就不行了。所以是不是复位后地址有问题,导致根本不能从正确的地址开始读取指令。我现在在看boot loader的资料,希望能弄明白复位后到底是什么情况,以及在哪里可以设置这个地址。

另外:我看了手册,说复位后从0x8000 0000开始执行。然后上电后可运行版本生成的hex文件,地址是从0x0000开始,应用程序从0x4000开始,应该是bootloader占了16k。而不可运行版本hex文件是从0x8000开始,给bootloader留了32k的空间,这个我可以从 avr32elf_uc3c0512c.lds 里面看到,但是从0000到8000之间的那段就没有了,不知道是不是因为没有这一段,重新上电后不运行,如果是,哪里可以改设置呢?当然,我关于hex文件的理解可能完全跑偏。希望能给一些关于hex文件的基础知识。。。 谢谢!

liuqian 发表于 2017-11-18 20:07:58

可以选是否用bootloader,如果不用,就没有那段代码,跳转至你自己的,好像有个什么trampoline的玩意,忘了,如果选择用但没有加载代码,运行肯定就不对了

avr77 发表于 2017-11-20 22:02:25

本帖最后由 avr77 于 2017-11-20 22:04 编辑

liuqian 发表于 2017-11-18 20:07
可以选是否用bootloader,如果不用,就没有那段代码,跳转至你自己的,好像有个什么trampoline的玩意,忘了 ...

没错,在这个项目里还有一个CAN Bootloader,一开始我用JTAG调试一切正常,就以为不用管它了。但是实际上JTAG每次会把Flash全部清空,包括bootloader里面的内容,这样我再次往里面烧程序的时候,因为没有管bootloader,就只写了应用程序那一段,所以板子在重新上电后根本不工作,之后把bootloader那段加上去了就好了。就是因为自己的想当然,卡了好几天{:sweat:} 但是我还是不明白为什么JTAG在线调试的时候,没有bootloader也可以跑。

再次感谢您的回复,帮助很大~
页: [1]
查看完整版本: AT32UC3 程序已下载 但在重新上电后不能自动执行