Nie można uruchomić programu ładującego na niestandardowej płytce drukowanej z AT32UC3L

12

Niedawno zaprojektowałem płytkę drukowaną dla klienta, wszystko jest w porządku ze sprzętem i oprogramowaniem (aplikacja działa tak, jak powinna). Teraz stajemy przed koniecznością aktualizacji programu wewnątrz mikrokontrolera, ale ponieważ te płytki drukowane są instalowane w różnych miejscach na całym świecie, idealnie byłoby zainstalować program ładujący i używać tego samego UART, którego używa aplikacja.

Opis tablicy

  • AT32UC3L032
  • Jeden UART już służy do komunikacji między kartą a komputerem
  • Kilka I / O dla aplikacji
  • Kilka diod LED stanu

Odpowiednie kody PIN i konfiguracja

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

Narzędzia użyte

  • Windows XP
  • Atmel Studio 6.1
  • Programator AVRONE

Po wielu godzinach poszukiwań znalazłem DFU Software Framework Atmel, udostępniony w ASF 3.14.0.834. Wyglądało to obiecująco, udało mi się zainstalować go na mojej płycie za pomocą dostarczonych narzędzi:

  • AVR32Studio 2.6.0
  • program_at32uc3l-uart-isp-1.0.1.cmd (dostarczony skrypt z ASF)
  • Odwróć 3.4.7 (batchisp)

Na początku użyłem .bini .datwyposażony ASF, zainstalowany przy użyciu skryptu. Teraz próbuję załadować aplikację za pomocą polecenia batchisp:

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

Ale zawsze dostaje:

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

Testowałem z oscyloskopem RX i TX z UART, dane idą na płytkę, ale komputer odbiera falę prostokątną 27 kHz (nie może to być dane z UART, ponieważ nie ma bitu stop ani nic, również częstotliwość prawdopodobnie nie jest taka sama dla 115200bps).

Po dalszych badaniach skonfigurowałem Word1i Word2w pliku, at32uc3l-uart-isp_cfg-1.0.1.databy uzyskać te wartości:

  • Słowo 1: 0xE11E0024
  • Word2: 0x494F81AA

Aby użyć numeru PIN PA01jako opcji, aby wprowadzić w ISP.

Ponadto załadowałem źródło DFU do Atmel Studio 6.1 i zauważyłem, że nie używają tej samej konfiguracji portu szeregowego, więc zmieniono na tę samą co moja aplikacja. Dodano także niektóre diody LED przełączające się w głównej części DFU.

Po aktualizacji bootloadera na płycie, diody LED się nie zmieniają, ten sam limit czasu, ta sama fala prostokątna.

Czy coś brakuje?


Alexandre Lavoie
źródło
1
Wysłany jako bilet do Atmel, zobaczy, kto naprawdę może mi pomóc: D
Alexandre Lavoie
Których pinów używasz (PAxx / PBxx). Nie pamiętam dokładnie, ale aby wejść do bootloadera, powinieneś pociągnąć szpilkę wysoko lub nisko (w zależności od dwóch słów konfiguracji). Czy możesz potwierdzić, że naciskasz przycisk lub podobny przycisk?
Tom L.
@TomL., Używając PA01 (dodano w pytaniu). Próbowałem zarówno z wysokim / niskim ... takim samym wynikiem. Nawet jeśli ten pin jest używany z JTAG, nie powinien powodować problemów.
Alexandre Lavoie
A których pinów używasz do UART?
Tom L.
1
Hm ok, więc nic niezwykłego tutaj. Czy możesz sprawdzić kod trampoliny i czy aplikacja jest poprawnie połączona z adresem początkowym Flash (powinieneś to zobaczyć w pliku .map linkera). Czy możesz opublikować swoje argumenty linkera?
Tom L.

Odpowiedzi:

1

Być może spróbuj użyć programatora AVR i Arduino IDE, jeśli jest to możliwe. Wiem, że działa dobrze z mikrokontrolerami serii AT.

skrzypce elektryczne
źródło
0

Użycie JTAG bez odpowiedniego kodu trampoliny spowoduje zastąpienie BOOTLOADERA dostarczonego przez ATMEL. Więc po pierwszym programowaniu w JTAG najprawdopodobniej na dobre usunąłeś BOOTLOADER.

Należy także ustawić bezpieczniki, aby bootloader działał, które domyślne ustawienia programisty JTAG zwykle psują się.

Aby to naprawić, musisz ponownie zaprogramować BOOTLOADER (pobrany z nieprogramowanego jeszcze układu) do układu przez JTAG i poprawnie ustawić bezpieczniki.

Dawno przestałem używać JTAG, ponieważ BOOTLOADER + FLIP jest znacznie wygodniejszy i szybszy. Upewnij się, że używasz hexa zamiast bin / elfa, a warunek BOOTLOADER nadal jest spełniony po zakończeniu warunku resetowania.

Oto jak używam FLIP na 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

Skąd avr32-objcopypochodzi z folderu bin AVRStudio, a Batchisppochodzi z FLIP. Musisz tylko zmienić nazwy plików oraz ID chipa AVR i COM, aby pasowały do ​​twojego projektu.

W razie potrzeby możesz także użyć 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

Trampolina musi być włączona w linkerze (właściwości projektu), tak wygląda moja konfiguracja:

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

Nadal używam AVR32 Studio 2.7.0, ponieważ nowsze wersje to gówno dla koni, więc konfiguracja może być inna.

[Edytuj1] dodatkowe informacje

dla UC3L0AVR32_PIN_PA20 pewne RC generic zegar (powinny być 32KHz ale to zależy od układu do układu sporo bez kalibracji z prescalers) z chipem, aż jego celem jest zmieniany na GPIO lub cokolwiek innego, więc ~ zegar 27KHz nie ma nic wspólnego z USART . Przy okazji ten zegar jest zasilany napięciem 3,3 V i generuje nawet, jeśli rdzeń układu 1,98 V jest smażony na dobre ....

Warunek Bootloadera AVR32_PIN_PA11ustawia się na zero przed wydaniem Resetu (chyba że zaimplementujesz własne warunki / polecenia DFU w oprogramowaniu). Jedną z możliwości jest stworzenie RC, który rozproszysz do stanu NISKIEGO, i zresetujesz, zanim się naładuje ... lub użyj bramki lub zworki FLIP / FLOP ...

Spektre
źródło