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

12

Recientemente diseñé un PCB para un cliente, todo está bien con el hardware y el software (la aplicación funciona como se supone que debe hacerlo). 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 gestor de arranque y usar el mismo UART utilizado por la aplicación.

Descripción del tablero

  • AT32UC3L032
  • Un UART ya se usaba para comunicarse entre la placa y la PC
  • 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
  • Atmel Studio 6.1
  • Programador AVRONE

Después de muchas horas de búsqueda, encontré el DFU Atmel Software Framework, provisto en ASF 3.14.0.834. Eso parecía prometedor, pude instalarlo en mi tablero usando las herramientas proporcionadas:

  • AVR32Studio 2.6.0
  • program_at32uc3l-uart-isp-1.0.1.cmd (script proporcionado con ASF)
  • Voltear 3.4.7 (batchisp)

Al principio, usé .biny .datproporcioné ASF, instalado usando el script. Ahora intenta cargar la aplicación con 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.

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

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

  • Word1: 0xE11E0024
  • Word2: 0x494F81AA

Usar el pin PA01como opción para ingresar al ISP.

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

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

¿Me estoy perdiendo de algo?


Alexandre Lavoie
fuente
1
Publicado como un boleto a Atmel, verá quién realmente puede ayudarme: D
Alexandre Lavoie
¿Qué pines estás usando (PAxx / PBxx)? No recuerdo exactamente, pero para ingresar al gestor de arranque se supone que debes tirar un pin alto o bajo (dependiendo de las dos palabras de configuración). ¿Puedes confirmar que estás presionando un botón o similar?
Tom L.
@TomL., Usando PA01 (agregado en la pregunta). Intentado con ambos alto / bajo ... mismo resultado. Incluso si este pin se usa con JTAG, no debería causar problemas.
Alexandre Lavoie
¿Y qué pines estás usando para el UART?
Tom L.
1
Hm ok, entonces 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 flash (debería ver esto en el archivo .map del enlazador)? ¿Puedes publicar tus argumentos de enlazador?
Tom L.

Respuestas:

1

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

electricviolin
fuente
0

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 estar configurados para permitir que funcione el gestor de arranque, que las configuraciones predeterminadas del programador JTAG suelen estropear.

Para reparar esto, necesita programar el BOOTLOADER nuevamente (tomado de un chip aún no programado) en el chip por JTAG y configurar los fusibles correctamente.

Dejé de usar JTAG hace mucho tiempo ya que BOOTLOADER + FLIP es mucho más cómodo y rápido. Asegúrese de estar usando hexadecimal en lugar de bin / elf y la condición BOOTLOADER sigue siendo cierta después de que finalice 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

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

En caso de que lo necesite, también puede 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 de la mina:

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 UC3L0 el AVR32_PIN_PA20es un poco de RC reloj genérica (debe ser de 32 KHz pero varía de un chip a otro mucho sin calibración con predivisores) desde el chip hasta que su propósito se cambia a GPIO o cualquier otra cosa por lo que el ~ reloj de 27KHz no tiene nada que ver con USART . Por cierto, ese reloj funciona con 3.3V y se genera incluso si el núcleo del chip 1.98V se fríe para siempre ...

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

Spektre
fuente