Skocz do zawartości

Sipeed Tang Nano 4k - jak zaprogramować Cortex-m3?


Elvis

Pomocna odpowiedź

Od jakiegoś czasu moduły "Sipeed Tang Nano 4k" pojawiają się podczas dyskusji na forum, postanowiłem więc spróbować pobawić się wspominanym układem.

FPGA działa bardzo fajnie, pod Windowsem wszystko działa w domyślnych ustawieniach, natomiast pod Linux-em jest problem z programowaniem. Na szczęście zamiast narzędzi dostarczanych przez Gowinsemi można użyć: https://github.com/trabucayre/openFPGALoader

Niestety nie udało mi się jak na razie połączyć z MCU, czyli rdzeniem Cortex-M3. W narzędziach producenta można przełączyć tryb działania układu na "MCU JTAG", ale dalej jest problem. Na płytce znajdziemy klon FTDI, coś w rodzaju FT2232H, tylko jak tego użyć jako JTAG-a?

Może komuś na forum udało się zaprogramować MCU w "Sipeed Tang Nano 4K"?

  • Lubię! 2
Link do komentarza
Share on other sites

Cześć @FlyingDutch , dzięki za podpowiedź.

Niestety użycie "dedykowanej" wersji programatora niewiele zmieniło 😞 Konfiguracja FPGA działa bez problemu, ale z MCU nadal nie mogę się połączyć.

W programatorze zmieniam tryb na MCU jak poniżej:

tang_mcu.thumb.png.4024e6520614806b46190ca31cad8671.png

Już na tym etapie jest coś dziwnego - po przełączeniu w tryb MCU nie można już łączyć się z poziomu programatora. Wcześniej mogłem bez problemu konfigurować FPGA, odczytywać identyfikator układu it. Przełączenie na MCU działa raz, a później już są błędy "Error: Devices not found".

Próba wgrania przykładowego kodu z poziomu Eclipse / GMD kończy się też błędem:

tang_jtag.thumb.png.7ff39def5e82e66dffea8281915304d6.png

W sumie to nie powinno nawet dziwić. Manager urządzeń nie widzi J-Linka, więc byłoby zaskakujące gdyby GMD widział. Ciekawe jak ten układ ma działać z oryginalnym softem od SEGGERA.... ale chińskie układy wiele pewnie potrafią.

Niestety nadal nie mam pomysłu jak dobrać się do tego Cortex-M3 😞 Szkoda, bo FPGA + rdzeń mikrokontrolera daje duże możliwości. O ile działa oczywiście 🙂

  • Lubię! 1
Link do komentarza
Share on other sites

Cześć @Elvis,

a jak próbujesz uruchomić polecenie Debug (F11) z  "Gowin MCU Designer", to co się dzieje? Masz zdefiniowany parametry dla "Debug configuration" z menu Eclipse'a? Niestety jeszcze nie próbowałem uruchamiać CPU z "Tang Nano 4K", więc nie za bardzo mogę pomóc.

Pozdrawiam

 

 

Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

Hej @Elvis,

powtórzyłem dokładnie czynności tak, jak Ty próbowałeś (z oryginalnym programatorem Gowin) i u mnie połączenie z MCU (JTAG) działa poprawnie - patrz zrzut ekranu:

Tang4K_MCU_JTAG_.thumb.png.9b448a96773100ea8d462d02777a02dc.png

"Gowin Programmer" był uruchomiony z menu "Tools" w "Gowin EDA" (z projektem z ustawionym FPGA device). Wiec może być błędne:

1) Software "Gowin EDA"/"Gowin MCU designer"/"Programmer" w jakiejś konkretnej wersji (także dla konkretny ) ma błąd

2) Coś jest nie tak z kablem "USB C"

3) Coś jest nie tak z portem/hubem USB na twoim kompie

4) Twoja płytka "Sipeed tang Nano 4K" jest uszkodzona

BTW: samo urządzenie FPGA (device) masz ustawione poprawnie na: GW1NSR-LV4CQN48PC7/16 - patrz obrazek:

device_.thumb.png.90053d7a06d6c15efd454936741c7317.png

Pozdrawiam

Edytowano przez FlyingDutch
update
Link do komentarza
Share on other sites

@FlyingDutch A możesz spróbować jeszcze raz? Bo u mnie za pierwszym razem też działa. Ale już kolejne użycie "Program/Configure" zwraca błędy.

Natomiast wgrywanie wsadu do FPGA działa poprawnie, więc nie sądzę, żeby to był problem USB/płytka. Chociaż mogę na innej sprawdzić.

Link do komentarza
Share on other sites

4 minuty temu, Elvis napisał:

@FlyingDutch A możesz spróbować jeszcze raz? Bo u mnie za pierwszym razem też działa. Ale już kolejne użycie "Program/Configure" zwraca błędy.

Natomiast wgrywanie wsadu do FPGA działa poprawnie, więc nie sądzę, żeby to był problem USB/płytka. Chociaż mogę na innej sprawdzić.

Za drugim razem już nie działa, ale mam inny kod błędu niż u Ciebie - patrz zrzut ekranu:

ProgError.thumb.png.22c2d5d8da5ea80ffca0429b810b9008.png

Pozdrawiam

Link do komentarza
Share on other sites

Ja właśnie testuję na drugiej płytce Tang oraz kablu USB i efekt jest identyczny. W każdym razie jedno przełączenie w tryb MCU niby działa i to powinno wystarczyć.

Ale system nie widzi J-Linka więc wgrywanie programu przez JTAG nie zadziała 😞

Link do komentarza
Share on other sites

Cześć @Elvis

znalazłem tutorial jak zaprogramować ARM Cortex-M3 na tej płytce (Tang Nano 4K) - podaję link:

https://github.com/magicjellybeanfpga/MiniStar/tree/main/projects/Tutorials/GW1NSR Demo

Jak kończy się tutorial migania diodą LED w FPGA, zaczyna się ten dotyczący programowania Cortex-M3 z płytki Tang Nano 4K. Dzisaj już nie zdążę tego przetestować, ale w najbliższych dniach na pewo to zrobie.

Pozdrawiam

  • Pomogłeś! 1
Link do komentarza
Share on other sites

@FlyingDutch Testowałem coś podobnego, czyli tworzenie pliku z konfiguracją FPGA oraz kodu dla Cortex-M3 i wgrywanie wszystkiego do GW1NSR. To działa całkiem fajnie, ale pisanie programu jest bardzo męczące - nie ma debuggera, a po każdej zmianie programu trzeba generować cały plik z wsadem dla FPGA i całość od nowa programować. Niby tak się da, ale moim zdaniem to trochę bez sensu. Teoretycznie można wgrać wsad dla FPGA, a później programować i debugować GW1NSR jak zwykły mikrokontroler - tylko chyba płytki Sipeed tego nie obsługują 😞 co niestety bardzo obniża ich użyteczność.

  • Pomogłeś! 2
Link do komentarza
Share on other sites

(edytowany)

Cześć,

dzisiaj spróbowałem zaprogramować ARM Cortex-M3 z zestawu FPGA SoC "Sipeed Tang nano 4K". Postępowałem zgodnie z tym tutorialem:

https://github.com/magicjellybeanfpga/MiniStar/tree/main/projects/Tutorials/GW1NSR Demo

Jedyna różnica jest taka, że w IPCore "Hard-Core-MCU" nie aktywowałem SPI (aktywowałem tylko UART0 i GPIO) ponieważ nie zamierzałem testować SPI.

Tutaj projekt FPGA IP Core "Hard_Core_MCU, który normalnie syntezujemy (uruchamiamy syntezę a potem implementację) w "Gowin EDA" powstanie wtedy plik konfiguracyjny dla układu FPGA z rozszerzeniem .fs .

GowinEDA1.thumb.png.eeec7a48fcdb49f2e2d3e674c09c3b15.png

Potem zgodnie z tutorialem pobieramy ze strony WWW firmy Gowin - "MCU SDK for Gowin EMPU(CW1NS-4C)" :

WWW_Gowin_.thumb.png.e74f18103e79a7aa3ad7e154287c7744.png

Pobrane archiwum zip rozpakowujemy :

FileExplorer.thumb.png.4adaa4e54518b8f14d2a6dd6844534e1.png

W  podkatalogu D:\_CurrentProjGowin_EMPU(GW1NS-4C)_V1.1.3\Gowin_EMPU(GW1NS-4C)_V1.1.3\ref_design\MCU_RefDesign\GMD_RefDesign

Będziemy mieli wiele projektów dla ARM Cortrex-M3 z płytki Tanb Nano 4K, które możemy importować i otwierać w "Gowin MCU Designer"(jest on oparty na Eclipse i jest duża szansa, że jesteś już zaznajomiony z tym IDE).

Otwieramy projekt w GMD (to skrótowa nazwa IDE o którym była mowa wyżej) - patrz zrzut ekranu:

GowinMCUDesigner_.thumb.png.4a0d5ef422f2dc2d2852365251e143db.png

Nastepnie wybieramy z menu opcje: "project"-> "Build Project" - projekt powinien się zbudować bez błędów. Po zbudowaniu projektu powstanie plik bin (poza oczywiście plikiem elf), którym możemy zaprogramować MCU ARM Cortex-M3. Programowanie jest trochę bardziej skomplikowane bo jednym programem programujemy zarówno układ FPGA jak i MCU. Uruchamiamy "Gowin Programmer" (można go wywołać z "Gowin EDA" "GDM" jak i jako osobny program. Gdy "Gowin Programmer" się otworzy - patrz zrzut ekranu:

Programmer.thumb.png.98baabddaf05b610e70afc0a93954307.png

Zmieniamy opcje "SRAM Program" na "MCU mode" -> "Firmware Erase, Program, Verify" , tak jak widać na zrzucie ekranu programu.

W miejscu okienka z nazwą pierwszego pliku wybieramy plik .fs który powstał po implementacji w "Gowin EDA", a wdrugim okienku (drugi plik) wybiaramy plik .bin ,który powstał w GDM po zbudowaniu projektu dla MCU ARM.

Następnie klikamy na ikonie z zielonym trójkątem i zaczyna się proces programowania - patrz zrzut ekranu

ProgrammerVer_.thumb.png.5836b74f2ca858129206da5dd8787c56.png

Proces programowania i weryfikacji trwa dość długo. Gdy się skończy możemy uruchomić nasz program w układzie FPGA.

Opis pinów dla układu bierzemy z pliku "Tang4K_CortexM3_01.cst" z pojektu FPGA - tutaj ten plik:

//Copyright (C)2014-2022 Gowin Semiconductor Corporation.
//All rights reserved. 
//File Title: Physical Constraints file
//GOWIN Version: 1.9.8.03
//Part Number: GW1NSR-LV4CQN48PC7/I6
//Device: GW1NSR-4C
//Created Time: Tue 05 03 07:24:17 2022

//Main clock
IO_LOC "sys_clk" 45;
IO_PORT "sys_clk" IO_TYPE=LVCMOS33 PULL_MODE=UP;

IO_LOC "reset_n" 14;
IO_PORT "reset_n" IO_TYPE=LVCMOS33 PULL_MODE=UP;

//UART interface
IO_LOC "uart0_txd" 44;
IO_PORT "uart0_txd" IO_TYPE=LVCMOS33 PULL_MODE=NONE DRIVE=8;
IO_LOC "uart0_rxd" 46;
IO_PORT "uart0_rxd" IO_TYPE=LVCMOS33 PULL_MODE=UP;

//SPI interface
//IO_LOC "nss" 31;
//IO_PORT "nss" IO_TYPE=LVCMOS33 PULL_MODE=NONE DRIVE=8;
//IO_LOC "sclk" 43;
//IO_PORT "sclk" IO_TYPE=LVCMOS33 PULL_MODE=NONE DRIVE=8;
//IO_LOC "mosi" 32;
//IO_PORT "mosi" IO_TYPE=LVCMOS33 PULL_MODE=NONE DRIVE=8;
//IO_LOC "miso" 34;
//IO_PORT "miso" IO_TYPE=LVCMOS33 PULL_MODE=UP;

//GPIOs

IO_LOC "gpio[15]" 29;
IO_PORT "gpio[15]" IO_TYPE=LVCMOS33 PULL_MODE=UP DRIVE=8;
IO_LOC "gpio[14]" 28;
IO_PORT "gpio[14]" IO_TYPE=LVCMOS33 PULL_MODE=UP DRIVE=8;
IO_LOC "gpio[13]" 27;
IO_PORT "gpio[13]" IO_TYPE=LVCMOS33 PULL_MODE=UP DRIVE=8;
IO_LOC "gpio[12]" 23;
IO_PORT "gpio[12]" IO_TYPE=LVCMOS33 PULL_MODE=UP DRIVE=8;
IO_LOC "gpio[11]" 22;
IO_PORT "gpio[11]" IO_TYPE=LVCMOS33 PULL_MODE=UP DRIVE=8;
IO_LOC "gpio[10]" 21;
IO_PORT "gpio[10]" IO_TYPE=LVCMOS33 PULL_MODE=UP DRIVE=8;
IO_LOC "gpio[9]" 20;
IO_PORT "gpio[9]"  IO_TYPE=LVCMOS33 PULL_MODE=UP DRIVE=8;
IO_LOC "gpio[8]" 19;
IO_PORT "gpio[8]" IO_TYPE=LVCMOS33 PULL_MODE=UP DRIVE=8;
IO_LOC "gpio[7]" 18;
IO_PORT "gpio[7]" IO_TYPE=LVCMOS33 PULL_MODE=UP DRIVE=8;
IO_LOC "gpio[6]" 17;
IO_PORT "gpio[6]" IO_TYPE=LVCMOS33 PULL_MODE=UP DRIVE=8;
IO_LOC "gpio[5]" 13;
IO_PORT "gpio[5]" IO_TYPE=LVCMOS33 PULL_MODE=UP DRIVE=8;
IO_LOC "gpio[4]" 16;
IO_PORT "gpio[4]" IO_TYPE=LVCMOS33 PULL_MODE=UP DRIVE=8;
IO_LOC "gpio[3]" 39;
IO_PORT "gpio[3]" IO_TYPE=LVCMOS33 PULL_MODE=UP DRIVE=8;
IO_LOC "gpio[2]" 8;
IO_PORT "gpio[2]" IO_TYPE=LVCMOS33 PULL_MODE=UP DRIVE=8;
IO_LOC "gpio[1]" 33;
IO_PORT "gpio[1]" IO_TYPE=LVCMOS33 PULL_MODE=UP DRIVE=8;
IO_LOC "gpio[0]" 35;
IO_PORT "gpio[0]" IO_TYPE=LVCMOS33 PULL_MODE=UP DRIVE=8;

Zamieszczam w poście oba projekty:

1. dla FPGA "Gowin EDA"

2. dla MCU z GDM

Tang4K_CortexM3_01.zip

gowin_empu_gw1ns4c.zip

 Oraz spakowane jako jedno archiwum zip:

1. plik z konfiguracją FPGA

2. Plik bin z programem dla MCU

gowin_empu_gw1ns4c.zip

Wnioski z uruchomienia:

1) Zasilanie płytki "Sipeedd Tang Nano 4K" przez kabel USB-C (przynajmniej w moim przypadku - slot w komputerze PC) dostarcza płytce mocy na styk. Podłączenie przejściówki USB-UART, czy po prostu podłączenie kilku pinów I/O do napięcia 3,3 V z płytki FPGA powoduje, że układu nie da się zaprogramować.

2) Wczytany program dla ARM Cortex-M3 jakoś działał, ale:

a) częstotliwość zmiany stanów LED była dużo za mała (powinny zmieniać się co jedną sekundę). Z komentarza w kodzie "main.c" wynika, że była zakładana częstotliwość 25 MHz a Płytka FPGA ma 27 Mhz, czyli nieduża róznica. Wygląda na to, że zegar w układzie MCU ARM został źle zainicjowany

b) UART0 cyklicznie wyrzuca komunikaty, ale nie daje się ich odczytać - wyświetla krzaki (próbowałem z różnymi prędkościami od 9600 do bodów do 115200). Wygląda na ten sam błąd co z zegarem dla GPIO - zła inicjacja zegara.

Ogólnie jestem dość rozczarowany po tej pierwszej próbie, bo MCU pracuje niepoprawnie. Może dalsze próby pozwolą ustalić co jest źle.

Już ustaliłem co się nie zgadzało: w pliku projektu w C dla MCU (GDM) o nazwie "system_gw1ns4c.C" jest definicja zegara dla MCU:

/*----------------------------------------------------------------------------
  Define clocks
 *----------------------------------------------------------------------------*/
#define __XTAL            (160000000UL)    /* Oscillator frequency */

#define __SYSTEM_CLOCK    (__XTAL / 2)	   /* 80MHz */

/**
  * @}
  */

/** @addtogroup GW1NS4C_System_Private_Variables
  * @{
  */

/*----------------------------------------------------------------------------
  Clock Variable definitions
 *----------------------------------------------------------------------------*/
uint32_t SystemCoreClock = __SYSTEM_CLOCK;/*!< System Clock Frequency (Core Clock)*/
uint32_t PCLK1 = __SYSTEM_CLOCK;          /*!< APB1 Clock Frequency */
uint32_t PCLK2 = __SYSTEM_CLOCK;          /*!< APB2 Clock Frequency */
uint32_t HCLK = __SYSTEM_CLOCK;           /*!< AHB Clock Frequency */

Z tego wynika, że zakładana częstotliwość głównego zegara miała wynosić 80 MHz (a rzeczywista była 27 Mhz). Dlatego didy migały z zadługim okresem i nie zgadzała się baudrate dla układu UART. Trzeba po prostu w projekcie FPGA dodać pętlę PLL z zegarem 80 MHz i powinno być OK.

BTW: do debugowania MCU ARM Cortex-M3 z płytki "Tang Nano 4K" potrzebny jest programator/debugger "Segger J-link" (oryginalny kosztuje około 2,5 K PLN) i na taki mnie nie stać, ale planuję zakup klona z Aliexpress.com:

https://pl.aliexpress.com/item/4000182310208.html?spm=a2g0o.productlist.0.0.63af593b0Ga0B4&algo_pvid=8fb8045a-dbb6-4c09-b999-35ed8872937a&algo_exp_id=8fb8045a-dbb6-4c09-b999-35ed8872937a-3&pdp_ext_f={"sku_id"%3A"10000000666299718"}&pdp_npi=1%40dis|PLN||81.18|||||%402100bddd16515831109761534e8335|10000000666299718|sea

Za 81 PLN.

Pozdrawiam

gowin_empu_gw1ns4c.zip

Edytowano przez FlyingDutch
  • Lubię! 1
  • Pomogłeś! 1
Link do komentarza
Share on other sites

Dnia 1.05.2022 o 18:45, Elvis napisał:

@FlyingDutch Testowałem coś podobnego, czyli tworzenie pliku z konfiguracją FPGA oraz kodu dla Cortex-M3 i wgrywanie wszystkiego do GW1NSR. To działa całkiem fajnie, ale pisanie programu jest bardzo męczące - nie ma debuggera, a po każdej zmianie programu trzeba generować cały plik z wsadem dla FPGA i całość od nowa programować. Niby tak się da, ale moim zdaniem to trochę bez sensu. Teoretycznie można wgrać wsad dla FPGA, a później programować i debugować GW1NSR jak zwykły mikrokontroler - tylko chyba płytki Sipeed tego nie obsługują 😞 co niestety bardzo obniża ich użyteczność.

Cześć @Elvis,

na pinout'cie dla "Tang Nano 4K" są zaznaczone piny JTAG, czy nie można do nich podłączyć zewnętrznego debuggera JTAG i nim debugować program?

Patrz ten link:

Czy próbowałeś do tych pinów podłączyć zewnętrzny debuger JTAG?

Pozdrawiam

Link do komentarza
Share on other sites

Nie próbowałem, bo te piny na płytce Sipeed są już podłączone... i nie miałem odwagi podłączać 2 programatorów jednocześnie.

Gdzieś w sieci widziałem dokumentację, gdzie im to działało jako J-Link... dziwne trochę, ale gdyby nie licencja to pewnie miałoby szansę zadziałać, w końcu FT232H w zupełności wystarcza jako JTAG.

Udało mi się zaprogramować ten układ tak jak opisałeś - tworząc plik z wsadu dla FPGA oraz programu i wgrywając wszystko do pamięci flash. Niestety zajmuje to sporo czasu, więc pisanie programu byłoby mega męczące.

Teraz nie mogę odszukać tej dokumentacji, powinno być możliwe używanie Gowin tak samo jak stm32, czyli z "normalnym" debuggerem i szybkim wgrywaniem zmian w programie. Tylko obawiam się, że płytki sipeed tego nie obsługują 😞

  • Lubię! 1
Link do komentarza
Share on other sites

1 godzinę temu, Elvis napisał:

Nie próbowałem, bo te piny na płytce Sipeed są już podłączone... i nie miałem odwagi podłączać 2 programatorów jednocześnie.

Gdzieś w sieci widziałem dokumentację, gdzie im to działało jako J-Link... dziwne trochę, ale gdyby nie licencja to pewnie miałoby szansę zadziałać, w końcu FT232H w zupełności wystarcza jako JTAG.

Muszę obejrzeć schemat dla tej płytki, bo jeszcze tego nie robiłem.

Pozdrawiam

Link do komentarza
Share on other sites

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.