No se puede hacer que el gestor de arranque funcione en una PCB personalizada con AT32UC3L

Recientemente diseñé una PCB para un cliente, todo está bien con el hardware y el software (la aplicación funciona como se supone). Ahora nos enfrentamos a la necesidad de actualizar el programa dentro del microcontrolador, pero dado que estos PCB están instalados en diferentes lugares del mundo, sería perfecto instalar un cargador de arranque y usar el mismo UART que usa la aplicación.

Descripción del tablero

  • AT32UC3L032
  • Un UART ya utilizado para comunicarse entre la placa y la PC
  • Un par de E/S para la aplicación
  • Par de LED de estado

PIN y configuración relevantes

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

Herramientas utilizadas

  • Windows XP
  • Estudio Atmel 6.1
  • programador avron

Después de muchas horas de búsqueda, encontré Atmel Software Framework DFU, proporcionado en ASF 3.14.0.834. Parecía prometedor, pude instalarlo en mi placa usando las herramientas provistas:

  • AVR32Studio 2.6.0
  • program_at32uc3l-uart-isp-1.0.1.cmd (script provisto con ASF)
  • Voltear 3.4.7 (por lotes)

Al principio, usé .biny .datproporcioné ASF, instalado usando el script. Ahora intento cargar la aplicación usando el comando batchisp:

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

Pero siempre obteniendo:

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

Probé con el osciloscopio RX y TX de UART, los datos van a subir pero la PC está recibiendo una onda cuadrada de 27 kHz (no pueden ser datos de UART ya que no hay bit de parada ni nada, también la frecuencia probablemente no sea la misma para 115200bps).

Después de más investigación, configuré Word1y Word2en el archivo at32uc3l-uart-isp_cfg-1.0.1.datpara obtener estos valores:

  • Palabra1: 0xE11E0024
  • Palabra2: 0x494F81AA

Utilizar pin PA01como opción para entrar en el ISP.

Además, cargué la fuente de DFU en Atmel Studio 6.1 y noté que no estaban usando la misma configuración de puerto serie, así que cambié por lo mismo que mi aplicación. También se agregaron algunos LED para alternar dentro de la principal de la DFU.

Después de actualizar el gestor de arranque en la placa, no hay cambios en los LED, el mismo tiempo de espera, la misma onda cuadrada.

¿Me estoy perdiendo de algo?


Publicado como un boleto para Atmel, veré quién realmente me puede ayudar: D
¿Qué pines está utilizando (PAxx/PBxx). No recuerdo exactamente, pero para ingresar al cargador de arranque se supone que debes tirar de un pin alto o bajo (dependiendo de las dos palabras de configuración). ¿Puedes confirmar que estás presionando un botón o similar?
@TomL., usando PA01 (agregado en pregunta). Intenté con alto / bajo ... mismo resultado. Incluso si este pin se usa con JTAG, no debería causar problemas.
¿Y qué pines estás usando para el UART?
@TomL. PA20 y PA21 para UART (AVR32_USART2) que funciona en una aplicación normal (sin gestor de arranque).
Hm ok, así que nada inusual aquí. ¿Puede verificar el código del trampolín y si la aplicación está correctamente vinculada a la dirección de inicio de flash (debería ver esto en el archivo .map del enlazador). ¿Puedes publicar tus argumentos del enlazador?
@TomL. Se agregaron dos archivos al final, probablemente el mapa no sea relevante ya que en el script por lotes, el cargador de arranque se coloca en una dirección específica. Estoy convirtiendo ELF a BIN antes de eso.
El manual dice: "Conexiones Si el JTAG está habilitado, el JTAG tomará el control sobre una cantidad de pines, independientemente de la configuración del controlador de E/S". ¿Te importa probar con un pin diferente?
Dame unos 5-10 minutos, lo intentaré...
(Solo una suposición salvaje) :-(
Bueno, el mismo resultado, también noté que 0x494F81AA estaba mal, debería ser 0x494F0123 para PA01. Probado PA01 y PB00 sin éxito.
... ¿no tendría que haber implementado soporte para actualizaciones de firmware antes de enviar la placa?
Pregunta tonta pero, ¿tienes el pin reset conectado al programador? Suponiendo que sea necesario...
@tim, si está conectado, puedo cargar mi propio programa sin ningún problema (usando el programador).
@AlexandreLavoie Agregué información nueva al final de mi respuesta.

Respuestas (2)

Tal vez intente usar un programador AVR y el IDE de Arduino si es posible. Sé que funciona bien con los microcontroladores de la serie AT.

El uso de JTAG sin el código de trampolín adecuado sobrescribirá el BOOTLOADER enviado por ATMEL. Entonces, después de la primera programación con JTAG, lo más probable es que haya borrado el BOOTLOADER para siempre.

Además, los fusibles deben configurarse para permitir que el cargador de arranque funcione, cuya configuración predeterminada del programador JTAG generalmente falla.

Para reparar esto, debe volver a programar el BOOTLOADER (tomado del chip aún sin programar) en el chip por JTAG y configurar los fusibles correctamente.

Dejé de usar JTAG hace mucho tiempo porque BOOTLOADER+FLIP es mucho más cómodo y rápido. Asegúrese de que está utilizando hexadecimal en lugar de bin/elf y que la condición BOOTLOADER sigue siendo verdadera después de que finaliza la condición de reinicio.

Así es como uso FLIP en RS232:

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

Donde avr32-objcopyes de la carpeta bin de AVRStudio y Batchispes de FLIP. Solo necesita cambiar los nombres de archivo y la identificación del chip AVR y COM para que coincida con su proyecto.

En caso de que lo necesites también puedes usar 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

El trampolín debe estar habilitado en el enlazador (propiedades del proyecto), así es como se ve la configuración mía:

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

Todavía estoy usando AVR32 Studio 2.7.0 ya que las versiones más nuevas son una mierda, por lo que en ellas la configuración puede ser diferente.

[Editar1] información adicional

para UC3L0AVR32_PIN_PA20 , hay un reloj genérico RC (debe ser de 32 KHz, pero varía bastante de un chip a otro sin calibración con preescaladores) desde el chip hasta que su propósito cambia a GPIO o cualquier otra cosa, por lo que el reloj de ~ 27 KHz no tiene nada que ver con USART . Por cierto, ese reloj funciona con 3,3 V y genera incluso si el núcleo del chip de 1,98 V se fríe para siempre....

La condición del cargador de arranque se ha AVR32_PIN_PA11establecido en cero antes del lanzamiento del reinicio (a menos que implemente sus propias condiciones/comandos de DFU en su firmware), por lo que una posibilidad es hacer un RC que se disipe al estado BAJO y reinicie antes de que se cargue de nuevo... o use alguna puerta FLIP / FLOP o puente ...