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
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
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:
Al principio, usé .bin
y .dat
proporcioné 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é Word1
y Word2
en el archivo at32uc3l-uart-isp_cfg-1.0.1.dat
para obtener estos valores:
Utilizar pin PA01
como 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?
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-objcopy
es de la carpeta bin de AVRStudio y Batchisp
es 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_PA11
establecido 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 ...
Alejandro Lavoie
tom l
Alejandro Lavoie
tom l
Alejandro Lavoie
tom l
Alejandro Lavoie
tom l
Alejandro Lavoie
tom l
Alejandro Lavoie
Alejandro Lavoie
SamB
usuario59089
Alejandro Lavoie
espectro