STM32F401 - jaki bootloader?

Cześć.

Chciałbym programować STM32F401 przez USB, bez podpinania STLinka.

Mam płytkę BlackPill (WeAct), ale pytanie jest bardziej generyczne, bo ocelowo to będzie siedziało na moim PCB.

Jaki bootoader, obecnie, do tego typu CPU jest polecany?

Widzę np. STM32duino-bootloader, ale opis w readme powoduje u mnie wywracanie kiszek (winny złej kompilacji jest za nowy gcc i iluminaci).

formatting link
Widzę też STM32 HID Bootloader

formatting link
ale nie mam pewności co to jakości, używanie HID z resztą to jakiś workaround.

A dlaczego rozglądam się za jakimś bootoladerem?

Fabryczny jest niestabilny. Zgłasza się w 1 na 4 resety. W pozostałych 3 przypadkach nie akceptuje adresu USB. Sprawdziłem to na mojej płytce i jeszcze na innej i mam podobne efekty.

Jest jescze coś, co powinienem obejrzeć?

Reply to
heby
Loading thread data ...

niedziela, 15 października 2023 o 22:30:28 UTC+2 heby napisał(a):

Brzmi jak ponury żart w ten piękny wieczór (a jutro wstaję o 6 :( ).

A czym ci podpadł st-link?

Reply to
Dawid Rutkowski

Niczym. Używam. Ale w tym konkretnym wypadku wygodniej mi będzie dać komuś urządzenie z ganizdem USB niż z prośbą o dokupienie STLinka.

Chciałbym mieć wygodne upgrade firmware w wersji finalnej.

Projekt będzie OpenSource, więc taki bootloader jest ok.

Reply to
heby

Jaki ten usenet jest wspaniały. Ledwie wysłałem posta, przypadkiem trafiłem na:

formatting link
"[...]Solution: Tying A10 to GND successfully makes it enter DFU bootloader mode 100% of the time[...]".

Sprawdziłem. Potwierdzam.

Reply to
heby

Nie znam się na bootloaderach (brat to robi) ale dwa skojarzenia z tym co napisałeś:

Jak projektowałem (ponad rok temu - więc szczegóły w pamięci już trochę zatarte) płytkę z EFM32HG309F64G-C-QFN24 to:

- któraś noga z jakiegoś booloaderowatego powodu miała być podwieszona,

- brat narzekał, że jakieś ich (Silabsa) narzędzie gadające z ich własnym bootloaderem w procku po USB potrafiło powiesić cały komputer.

Jak potem robił swoją obsługę USB (bazując na ich bibliotece) to mi coś opowiadał o problemie 64 bajtów. Na tyle na ile to zapamiętałem to jak USB (nie znam się aby określić jakiego trybu to się tyczy) rozbija dłuższe transmisje na bloki po 64 bajty to jak cała transmisja jest wielokrotnością 64 to tam był jakiś problem z ostatnią ramką. Tego, że był problem z ostatnią ramką to jestem pewien, ale jaki to już nie. Możliwe, że dosyłana jest na koniec ramka pusta a ich hardware głupiał jak rozmiar był 0 a ich biblioteka nie miała obejścia tego problemu. A może odwrotnie - czekał na kolejną ramkę, której już nie było. Jeśli ta sama biblioteka była użyta w tym ich bootloaderze (co jest przecież prawdopodobne) to by wyjaśniało możliwe problemy. P.G.

Reply to
Piotr Gałka

Tutaj problem polega na tym, że fabryczny booloader stara się w pierwszej kolejności stwierdzić, czy programowanie będzie na UART czy USB. Ponieważ niepodwieszona noga RX UARTu powoduje szum, traktowane jest to jako komunikacja po UART i bootloader nie odpala USB.

Rozwiązaniem było by uruchomienie wewnętrznego pullupa przed testem komunikacji. Dorobienie tego pullupa ręcznie rozwiązuje problem, RX nie szumi, bootoader przechodzi do obsługi USB.

Reply to
heby

W dniu 2023-10-16 o 16:41, heby pisze:

To pewnie też był powód podwieszenia u nas bo chyba bootloader też mógł komunikować się i po UART i po USB. Pisałeś, że do GND, u nas było (według jakiegoś opisu i tak zrobiłem na płytce) do VCC (co dla UARTa wydaje się logiczniejsze). P.G.

Reply to
Piotr Gałka

Wystarczy podpiąc do bylegdzie, bo wygląda na to, że detekcja ruchu na UART polega na szukaniu zboczy, nie stanów.

Reply to
heby

Zbieg okoliczności :)

Gdy ja coś w tym wątku napisałem brat akurat wrócił do tych płytek sprzed roku. Rok temu w czasie uruchamiania softu (nasze pierwsze podejście do 32 bitowego procka - ever) było tak, że raz zaprogramowana płytka już jest odkładana na bok - nie mieliśmy opanowanego kasowania wszystkiego do zera i wgrywania ich bootloadera i nie mieliśmy czasu się tym zajmować bo to było ratunkowe robienie produktu zastępującego inny na prockach, które stały się niedostępne - czyli robota była 'na wczoraj'. W ten sposób kilkanaście płytek (kolejne wersje naszego softu) wylądowało w poczekalni, że kiedyś się je odzyska. Wtedy w ogóle obowiązywała jeszcze koncepcja, że (tak jak z AtXmega) sami będziemy z prockami gadać po DEBUG, ale ileś tam rzeczy nam działało, ale nie wszystkie, a te ich programatory wysyłają jakieś setki rozkazów bez ładu i składu - postanowiliśmy sobie odpuścić, szczególnie, że od jakiegoś czasu mamy 2-etapową produkcję, i pierwszy wsad nie wymaga wstawiania kluczy, które mój program generuje na bieżąco w czasie produkcji urządzeń.

Na płytce robimy normalnie 3 pinowe (raster 1,27) złącze DEBUG i dla innych Silabsów to wystarcza. Ich programator (Silabsa płytka uruchomieniowa) potrafi wykasować procesor. Nie wiem dlaczego wersja programu na PC, którą na produkcji programują te procesory nie potrafi ich wykasować. Podobno dopiero programator, który jest w całym środowisku uruchomieniowym potrafi. Dlatego ostatnio przysłali nam ileś płytek do wyczyszczenia. Brat je wszystkie (późniejsze projekty z innym prockami Silabsa - bez USB) wyczyścił i dotarł do tych z USB i program twierdzi, że wyczyścił, a potem nie potrafi się z prockiem dogadać. Stąd godzinę temu konsultacja ze mną - czy mi się coś nie kojarzy. A mi się kojarzyło, że z jakiegoś powodu na tej płytce wyprowadzałem też pin reset.

Brat, do normalnego kabelka dodał jeden przewód, aby dało się go w ten reset wetknąć i dosłownie przed sekundą dał znać, że sukces - te płytki też dało się przywrócić do stanu początkowego :) P.G.

Reply to
Piotr Gałka

To pomaga na fabryczny czy na stm32duino?

Reply to
Dawid Rutkowski

To pomaga na goły STM32F401. Czy jakieś płytki mają ten RX podpięty, podciągniety czy cokolwiek, nie wiem. Mój nie ma (Black Pill).

Reply to
heby

I dobrze że nie ma. Nie oglądałem - miejsce na kabelek jest? Ciekawe czy jest o tym w jakimś manualu.

Reply to
Dawid Rutkowski

Pin jest. To taka płytka z goldpinami.

Ponoć wspominają, ale kto by tam czytał datashit-y mające po 1k+ stron.

Reply to
heby

W dniu 2023-10-16 o 22:08, heby pisze:

Mi się wydaje, że czasem trzeba.

Dziś/jutro będę próbował się doczytać czy RTC, które podobno jest w EFM32PG23... to da się użyć, czy muszę dać scalak RTC na zewnątrz. Główna wątpliwość - z tego co na razie wiem to nie ma żadnej nogi, która byłaby przeznaczona do podłączenia baterii/supercapa do podtrzymania RTC. P.G.

Reply to
Piotr Gałka

RTC może oznaczać różne rzeczy. Dla Ciebie to zegar podtrzymywany baterią (tym jest 'RTC' w PC i tym są 'moduły RTC' które można kupić do jakiegoś Arduino), ale jako element mikrokontrolera to po prostu jeden z zegarów, ten który zawsze liczy sekundy/godziny, a nie jakieś inne cykle i może np. obudzić maszynę o zadanej porze ze stanu uśpienia, ale bez normalnego zasilania nie działa.

Jacek

Reply to
Jacek Konieczny

Jacek Konieczny snipped-for-privacy@jajcus.net napisał(a):

Otóż można się zdziwić. W NRF52 jest RTC, ale skrót rozwija się jako Real Time Counter i jest pojedynczym licznikiem, bez rejestrów godzin czy minut. I nie liczy sekund, tylko właśnie te "inne cykle".

Reply to
Grzegorz Niemirowski

Bo właściwym sposobem liczenia czasu jest liczyć sekundy względem umownego początku w UTC, a potem tylko wyświetlać użytkownikowi zgodnie z lokalnymi zwyczajami - strefy czasowe, letni/zimowy (niestety nadal, już niedługo) itp. Chociaż w końcu po 50 latach postanowiono skasować sekundy przestępne...

Reply to
M M

M M snipped-for-privacy@gmail.com napisał(a):

Tak się tam właśnie robi, tylko są potrzebne pewne kombinacje. Ten licznik ma tylko 12-bitowy preskaler, więc przy kwarcu zegarkowym największe okresy jakie odmierza to 1/8 sekundy. Trzeba więc jego wartość dzielić przez 8. Dodatkowo licznik też ma mało bitów, więc tym wspomnianym początkiem nie może być rok 1970. W praktyce można liczyć od zera, tylko w momencie inicjalizacji zapamiętać jaki był aktualny czas i potem dodawać przy zwracaniu wartości.

time_t rtc::getCurrentTime(void) { return rtc_inst.p_reg->COUNTER / 8 + timeDiff; }

void rtc::setCurrentTime(time_t time) { timeDiff = time; nrfx_rtc_counter_clear(&rtc_inst); }

Reply to
Grzegorz Niemirowski

W dniu 17.10.2023 o 13:21, Grzegorz Niemirowski pisze:

A co to za różnica?

Reply to
io

W dniu 17.10.2023 o 16:15, M M pisze:

Gdzie tak postanowiono?

Reply to
io

ElectronDepot website is not affiliated with any of the manufacturers or service providers discussed here. All logos and trade names are the property of their respective owners.