无法让引导加载程序在使用 AT32UC3L 的自定义 PCB 上工作

电器工程 爱特梅尔 引导加载程序 avr32
2022-01-23 16:55:08

我最近为客户设计了一个 PCB,硬件和软件一切都很好(应用程序按预期工作)。现在我们需要更新微控制器内部的程序,但由于这些 PCB 安装在世界各地的不同地方,安装引导加载程序并使用与应用程序相同的 UART 将是完美的。

板子描述

  • AT32UC3L032
  • 一个 UART 已用于板子和 PC 之间的通信
  • 应用程序的几个 I/O
  • 几个状态 LED

相关PIN和配置

PA01 # Used for entering ISP with high level

PA20 # Used for application and ISP UART
PA21 # Used for application and ISP UART

#define COM_USART               (&AVR32_USART2)
#define COM_USART_RX_PIN        AVR32_USART2_RXD_0_0_PIN
#define COM_USART_RX_FUNCTION   AVR32_USART2_RXD_0_0_FUNCTION
#define COM_USART_TX_PIN        AVR32_USART2_TXD_0_0_PIN
#define COM_USART_TX_FUNCTION   AVR32_USART2_TXD_0_0_FUNCTION
#define COM_USART_IRQ           AVR32_USART2_IRQ
#define COM_USART_BAUDRATE      115200

使用的工具

  • 视窗
  • 爱特梅尔工作室 6.1
  • AVRONE 程序员

经过数小时的搜索,我找到了 ASF 3.14.0.834 中提供的 Atmel Software Framework DFU。这看起来很有希望,我能够使用提供的工具将它安装在我的板上:

  • AVR32Studio 2.6.0
  • program_at32uc3l-uart-isp-1.0.1.cmd(提供带有 ASF 的脚本)
  • 翻转 3.4.7(批处理)

起初,我使用.bin.dat提供了 ASF,使用脚本安装。现在尝试使用 batchisp 命令上传应用程序:

batchisp.exe -device at32uc3l032 -hardware RS232 -port COM1 -baudrate 115200 -operation erase f memory flash blankcheck loadbuffer myapp.hex program verify

但总是得到:

Device selection.................... PASS
Hardware selection.................. PASS
Opening port........................ PASS
Synchronzing target................. FAIL    Timeout error.

我已经用 UART 的示波器 RX 和 TX 进行了测试,数据正在发送,但 PC 正在接收 27kHz 方波(不能是来自 UART 的数据,因为没有停止位或任何东西,频率也可能不一样115200bps)。

经过更多研究,我已经配置Word1Word2在文件at32uc3l-uart-isp_cfg-1.0.1.dat中获取这些值:

  • 字 1:0xE11E0024
  • 字 2:0x494F81AA

使用 pinPA01作为进入 ISP 的选项。

此外,在 Atmel Studio 6.1 中加载了 DFU 的源代码,发现它们没有使用相同的串行端口配置,因此更改为与我的应用程序相同。还在 DFU 的主体内添加了一些 LED 切换。

更新板上的引导加载程序后,没有 LED 变化,相同的超时,相同的方波。

我错过了什么吗?


2个回答

如果可能的话,也许可以尝试使用 AVR 程序员和 Arduino IDE。我知道它适用于 AT 系列微控制器。

在没有适当的蹦床代码的情况下使用 JTAG 将覆盖 ATMEL 提供的 BOOTLOADER。因此,在第一次使用 JTAG 编程后,您很可能会永久擦除 BOOTLOADER。

此外,必须设置熔断器以允许引导加载程序工作,而 JTAG 编程器的默认设置通常会搞砸。

为了修复这个问题,您需要通过 JTAG 将 BOOTLOADER(取自尚未编程的芯片)重新编程到芯片中并正确设置保险丝。

我很久以前就停止使用 JTAG,因为 BOOTLOADER+FLIP 更舒适、更快捷。确保您使用的是十六进制而不是 bin/elf,并且在复位条件结束后 BOOTLOADER 条件仍然为真。

这就是我在 RS232 上使用 FLIP 的方式:

avr32-objcopy -O ihex AT32UC3L064.elf AT32UC3L064.hex
Batchisp -device AT32UC3L064 -hardware RS232 -port COM1 -baudrate 115200 -operation onfail abort memory flash erase f blankcheck loadbuffer AT32UC3L064.hex program start reset 0

哪里avr32-objcopy来自 AVRStudio bin 文件夹,Batchisp来自 FLIP。您只需更改文件名和 AVR 芯片 ID 和 COM 以匹配您的项目。

如果您需要它,您还可以使用 USB:

avr32-objcopy -O ihex cpp_trampoline.elf AT32UC3A3256.hex
Batchisp -device AT32UC3A3256 -hardware USB -operation onfail abort memory flash erase f blankcheck loadbuffer AT32UC3A3256.hex program start reset 0

必须在链接器(项目属性)中启用蹦床,这就是我的配置的样子:

linker: -nostartfiles -Wl,--gc-sections -Wl,-e,_trampoline -mpart=uc3l032 -Wl,--gc-sections --direct-data --rodata-writable

我仍在使用AVR32 Studio 2.7.0,因为较新的版本是马屎,所以在它们中配置可能会有所不同。

[Edit1] 附加信息

对于UC3L0AVR32_PIN_PA20一些RC通用时钟(应该是 32KHz,但它在芯片之间变化很大,无需使用预分频器进行校准),直到其用途更改为GPIO或其他任何东西,因此 ~27KHz 时钟与USART顺便说一句,时钟由 3.3V 供电,即使芯片 1.98V 内核被炸得很好也能产生....

引导加载程序条件AVR32_PIN_PA11在重置发布之前已设置为零(除非您在固件中实现自己的DFU条件/命令)因此一种可能性是制作一个您消散为 LOW 状态的 RC,并在它重新充电之前重置......或使用一些 FLIP/FLOP 门或跳线...