Hejto.pl
Dodaj post

Wpisz coś do wyszukania (minimum 2 znaki)

#stm32

Gruba ryba

w ELEKTRONIKA

16piorunów

Jakbyście używali STM32L010, to uwaga na piny programujące przez USART2. Według DS12325 bootloader dostępny jest na pinach PA2 i PA3. Według AN2606 jest również na PA9 i PA10.
Mnie wygodniej było użyć PA9 i PA10, co okupiłem debugowaniem i kynarowaniem. W końcu jednak działa!

Tytan2piorunów

Czy to błąd ST czy twój w analizie dokumentacji?

Gruba ryba1piorunów

@kkdawid ja nie umiem czytać 😉
Ale jak widzę, że jest napisane x, to x raczej powinno działać.

Tytan1piorunów

@macgajster oki, rozumiem :) też bym tak założył

Pokaż więcej komentarzy (4)

Gruba ryba

w Programowanie

26piorunów

Chciałem nauczyć się freeRTOS na STM32. Znalazłem na udemy kurs. Po obejrzeniu kilku filmów zorientowałem się, że to plagiat filmów od STmicroelectronics z youtube. Podmienili logo, przycięli czołówkę, podkręcili dźwięk żeby z automatu nie wyłapało.
Zgłosiłem to do udemy, dostałem nawet pełen zwrot, choć według zasad się nie należał. Kradziony kurs jednak wciąż wisi do kupienia, tym razem dużo drożej :confused:

https://www.udemy.com/course/free-rtos-on-stm32

Osobistość2piorunów

@macgajster Trochę offtopic, ale co Cię skłoniło żeby uczyć FreeRTOSa? To przecież egzotyczna nisza!

Gruba ryba2piorunów

@groman43 długo nie siedzę już w branży, jaki RTOS się teraz używa w embedded?

Osobistość2piorunów

@lurker_z_internetu Nie mam zielonego pojęcia. Szczerze - nigdy nie używałem żadnego open source RTOSa. Tylko proprietary.

Gruba ryba4piorunów

@groman43 @lurker_z_internetu freeRTOS jest zintegrowany ze środowiskiem STM. Dlatego jest popularny na tę platformę.
Jest często wymagany w ogłoszeniach embedded, a ponieważ w hw jest bardzo mało pracy, to chcę pójść w fw. Tym bardziej, że liznąłem fw i to od podstaw-podstaw: pisanie plików linkera, pisanie makefile od zera, grzebanie w elfach. Później zacząłem robić w STM32CubeIDE i w sumie jest to spoko środowisko.

Inne znane mi z ofert pracy RTOS to zephyr.

Specjalista1piorunów

@macgajster imo zephyr to przyszłość i warto się go uczyć. Swoją drogą to Nordic na swojej stronie ma 2 darmowe i bardzo dobre kursy zephyra. Kupujesz płytkę za kilkadziesiąt złotych i masz wszystko co potrzebne do kursu.
Warto też dodać że Nordic zrobił wtyczki do VSC więc integracja jest bezproblemowa i wg mnie dużo lepsza niż ociężały kombajn Stm32CubeIDE, ale to już moja subiektywna opinia 😉

Fenomen1piorunów

@groman43 "The two operating systems that were most popularly used in 2024 for embedded systems were Embedded Linux and FreeRTOS. At this time, an equal percentage of developers (44% each) had utilized both options"

Fanatyk4piorunów

@lurker_z_internetu FreeRTOS jest bardzo popularnym RTOSem i przystępnym według mnie. Do tego gotowy projekt można szybko przeportować na Safe RTOS i uzyskać tym certyfikaty bezpieczeństwa.
Poza tym że jest świetnie zintegrowany z STM32 to jeszcze ESP32 go używa.

A Zephyra to jebać maczetami, znakomita idea, a wykonanie takie, że można się popłakać. Może za 10 lat coś z niego będzie xd

Gruba ryba2piorunów

@octavian jestem w tak ciasnej dupce, że muszę uczyć się tego co najczęściej pada w ogłoszeniach. A pada FreeRTOS.
Do tego dołożę C++ po przejściu z samounauczonego C, ale bez znajomości jakichś większych pojęć i mam nadzieję, że wystarczy. Wachlarz wymaganych umiejętności jest bardzo szeroki, a pracuję obecnie poza programowaniem z powodu siły wyższej. Po pracy mam mało czasu, więc nauka dwóch RTOS, jakkolwiek brzmi jak taran w drzwiach, jest zbyt zasobożerna :confused:

Fanatyk2piorunów

@macgajster w przypadku C++ i z tego co obserwuję wśród ludzi, którzy znając C uczyli się C++ mogę doradzić: nie traktuj tego języka jak C z klasami. To, że można stosować podejście jak w C nie oznacza, że się powinno. Tak naprawdę to jest inny język niż C

Gruba ryba2piorunów

@macgajster
Ucz się freeRTOS.
Zdecydowanie rządzi w świecie mikrokontrolerów i zwykle producenci uczestniczą w rozwoju sterowników więc baza urządzeń i konfiguracji sprzętowych możliwych do zaspokojenia FreeRTOSem jest ogromna.
Rozmaite RTOSy z reguły mają dość ograniczony żywot - niegdyś popularny ecos zdechł jeszcze około 2013 r. Na projekty z VxWorksem ciężko już trafić, w automotive trzyma się jeszcze QNX.
Zresztą najważniejsze jest zrozumienie ogólnej problematyki RTOSów i czym się to zwykle różni od systemu ogólnego przeznaczenia jakim jest Linux.

Gruba ryba1piorunów

@pierdonauta_kosmolony największym moim problemem jest znalezienie czasu :confused: Mam płytkę nucleo z F411RE, ale na razie nie bardzo mam pomysł co bym mógł na tym sklecić.
Teoretycznie na czymś słabszym puściłem tempomat, ale nie wiem czy tam freeRTOS podejdzie. Na pewno byłoby fajnie i przyjemne z pożytecznym - zarządzanie dość krytycznym w tej aplikacji czasem i do tego nauka.

Może znasz jakiś dobry kurs, który by ładnie opisywał wszystko? Ten z youtube już znam, ale nie podszedł mi zbyt dobrze. Może obejrzę go drugi raz i teraz będzie lepiej.

Gruba ryba1piorunów

@macgajster
Chryste, próbowałem cokolwiek napisać i wyszły bzdury i tylko udało mi się wkleić link.
Być może warto zacząć od jakichś symulatorów lub emulatorów?

Fanatyk1piorunów

@macgajster a spróbuj zapytać chata gpt. Napisz mu co masz (jaki uC, jakie komponenty do niego etc) i poproś o projekt.

Specjalista1piorunów

@ZohanTSW btw co jest nie tak z zephyrem? Pytam bo jestem ciekawy. Używałem go ok 6 msc i byłem zachwycony jak to działa. Próg wejścia wyższy niż freertos, ale jak zrozumie się device tree i konfigurację to idzie z górki.

Fanatyk3piorunów

@octavian zupełnie nie można ufać tym driverom, są pobugowane i nie wiesz czy to zadziała, czy nie i zbyt często trzeba pisać patche. Trzeba je pisać również dlatego, że driver nie spełnia akurat twoich potrzeb, więc trzeba dopisać. Jeśli zajdzie potrzeba robienia upgrade'u to jest to ekstremalnie trudne, bo ekipa stwierdziła że zmieni nazwy komponentów np przez zamianę członów miejscami (z FOO_BAR na BAR_FOO).
Trafiłem do projektu który był na ukończeniu, poprawić kilka problemów i fajrant. Jednym z problemów było że modem GSM losowo gubił połączenie z internetem i po tym nie potrafił się podnieść. Po wykluczeniu problemu ze sprzętem, z budynkiem, BTSem i wszystkim wokół zacząłem sprawdzać kod. Wszystko wyglądało dobrze, kod wykorzystywał zephyrowy driver PPP do gadania z modemem ale postawiłem że jednak błąd musi być w wykorzystaniu tego drivera. No nie, nic nie poprawiało stanu rzeczy. Debug trwał 3 miesiące, trzeba było dodawać dupa printy, ustawić 6 urządzeń żeby robiły to samo i zbierać logi z każdego z nich czekając aż się w końcu coś wywali. 3 miesiące. Udało się dojść po nitce do kłębka, co wskazywało na jakiś dziwny błąd w driverze. Google skierowało na githuba lub jakieś zephyrowe forum (nie pamiętam teraz), gdzie ktoś zgłosił ten błąd 3 lata wcześniej i sobie to czekało na fixa. To był jakiś błąd w stosie sieciowym. Wystarczyłoby ten stos zresetować w przypadku problemu i w tym wypadku to by wystarczyło.

Ale Zephyr nie zezwalał na wyzerowanie tego stosu. Chyba że przez reboot, a to nie wchodziło w grę.

Skończyło się wypruciem zephyrowych driverów, przejście na protokół AT i pisanie w zasadzie wszystkiego od zera.

I teraz rzecz, której nie jestem pewien - czy Zephyr ma taki duży footprint, czy to po prostu beztalencie ludzi, którzy to pisali wcześniej: udało się uzyskać tę samą funkcjonalność co wcześniej i jednocześnie ważyło to mniej niż połowę flasha i zużywało połowę ramu. Tylko z zephyra został sam scheduler i reszta to ręcznej pisane drivery.

To był absolutny koszmar i najgorszy etap mojej kariery.

Specjalista1piorunów

@ZohanTSW dzięki za wyjaśnienie. Miałem tyle szczęścia, że projekt nad którym pracowałem robiłem od zera więc nie miałem takich problemów. Oczywiście kilka napotkałem po drodze, ale udało się to rozwiązać pisząc własne poprawki.
Z tego co piszesz to raczej mieliście pecha do drivera, a nie całego systemu.

Podoba mi się w zephyrze że bardzo łatwo jest portować kod na inne procki przez zmiane device tree w zależności od rewizji urządzenia.

Mimo problemów jakie napotkałes to w mojej opinii jest to przyszłość embedded. Rok temu byłem na rozmowie o pytano mnie o podstawy działania 😉

Fanatyk1piorunów

@octavian zgodzę się, że idea jest znakomita i w ten sposób powinno się robić embedded w przyszłości, jednak przed zephyrem jeszcze długa droga. Wysoki poziom wejścia też tego nie ułatwia. Samo to device tree... No niby spoko pomysł zrobić to jak w linuksie, a raczej fajnie że jest próba odwołania się do czegoś co powinno być szerzej znane, ale to według mnie wymaga uproszczenia. Może zrobić coś jak Cube MX w STM32, które będzie generować odpowiedni device tree? Może niech menuconfig to generuje? A może AI bo jest modne teraz? Bo jak na ten moment to zephyr pomaga omijać jedne kłody, rzucając ci inną kłodę prosto na twarz. Jeśli chodzi o samą przenoszalność kodu na inne procki to aktualnie piszę coś w tym rodzaju co moim zdaniem będzie łatwiejsze od zephyra bo w założeniu ma ograniczyć się do poprawnego wskazania źródeł w cmake jakiegoś domyślnego projektu (oraz ewentualne nastawy kompilatora), a tymi źródłami może być jakiś prosty hello world - byle ten hello world zawołał odpowiednią funkcję (będącą punktem wejściowym do aplikacji "biznesowej"). A ten Cmake można napisać w oparciu o exampla. Tylko to wyjdzie za X czasu bo nie mam kiedy do tego siąść, chyba musiałbym wziąć urlop na to xD a wydaje mi się możliwe, bo robiłem już coś takiego kilka razy, tylko kwestia to rozszerzyć i poznać szerszą pulę mikrokontrolerów.

Jeszcze co do tych poprawek - no na moje oko projekty oparte o zephyra mają średnio 20 patchy xD i mam mieszane uczucia co do tego. Słyszałem też że kontrybicja do repozytorium zephyra to rak, bo np robisz pull requesta z brakującą funkcjonalnością drivera, a oni ją odrzucają, bo uznają że to jest zbędne xD

Pokaż więcej komentarzy (20)

Gruba ryba

w Programowanie

4piorunów

Uruchamiam STM32F103C8, a konkretnie EXTI na liniach PA0 ... PA4. Siedzą na tych pinach zwykłe przełączniki typu pushbutton. Rozwikłałem reference manual na tyle, że jedno przerwanie działa, ale inne mimo takiej samej składni przy każdym pinie już nie chcą.

GPIO ustawiam:
>GPIOA->CRL &= ~GPIO_CRL_CNF0_0; // floating input to pull-down
>GPIOA->CRL |= GPIO_CRL_CNF0_1;
Puszczam zegar do EXTI (w tym procku AFIO):
>RCC->APB2ENR |= RCC_APB2ENR_AFIOEN;
Zdejmuję maskę z interesujących pinów:
>EXTI->IMR |= EXTI_IMR_MR0 | EXTI_IMR_MR1 | EXTI_IMR_MR2 | EXTI_IMR_MR3 | EXTI_IMR_MR4;
Ustawiam reakcję na zbocze narastające:
>EXTI->RTSR |= EXTI_RTSR_TR0 | EXTI_RTSR_TR1 | EXTI_RTSR_TR2 | EXTI_RTSR_TR3 | EXTI_RTSR_TR4;
Dodaję priorytety przerwania i uruchamiam przerwania (tu tylko po jednym żeby nie mnożyć):
>NVIC_SetPriority(EXTI0_IRQn, 1);
>NVIC_EnableIRQ(EXTI0_IRQn);
Przykładowe przerwanie:
>__attribute__((section(".after_vectors"))) void EXTI0_IRQHandler()
>{
>   printf("++ \\r\\n");
>   EXTI->PR |= EXTI_PR_PR0;
>}

Co bym nie robił tak działa tylko jedno przerwanie i to z PA2. Wiązać pinów z EXTI niby nie muszę (po resecie akurat się zgrywają), ale robię to dla pewności, nie widzę już gdzie szukać. W komentarzu dla czytelności wrzucam cały kod okrojony do obsługi EXTI.
Co mogę robić źle albo gdzie szukać? Do debugowania mam UART i LEDa ( ͡° ͜ʖ ͡°)

 

Gruba ryba0piorunów

>static void gpio_init(void)
>{
>   RCC->APB2ENR |= RCC_APB2ENR_IOPAEN | RCC_APB2ENR_IOPBEN;
>   RCC->APB1ENR |= RCC_APB1ENR_TIM3EN;
>
>   // BUT_CANC (PA0)
>   GPIOA->CRL &= ~GPIO_CRL_CNF0_0; // floating input to pull-down
>   GPIOA->CRL |= GPIO_CRL_CNF0_1;
>
>   // (PA1)
>   GPIOA->CRL &= ~GPIO_CRL_CNF1_0; // floating input to pull-down
>   GPIOA->CRL |= GPIO_CRL_CNF1_1;
>
>   // (PA2)
>   GPIOA->CRL &= ~GPIO_CRL_CNF2_0; // floating input to pull-down
>   GPIOA->CRL |= GPIO_CRL_CNF2_1;
>
>   // (PA3)
>   GPIOA->CRL &= ~GPIO_CRL_CNF3_0; // floating input to pull-down
>   GPIOA->CRL |= GPIO_CRL_CNF3_1;
>
>   // (PA4)
>   GPIOA->CRL &= ~GPIO_CRL_CNF4_0; // floating input to pull-down
>   GPIOA->CRL |= GPIO_CRL_CNF4_1;
>}
>
>static void exti_init(void)
>{
>   RCC->APB2ENR |= RCC_APB2ENR_AFIOEN;
>   EXTI->IMR |= EXTI_IMR_MR0 | EXTI_IMR_MR1 | EXTI_IMR_MR2 | EXTI_IMR_MR3 | EXTI_IMR_MR4;
>   EXTI->RTSR |= EXTI_RTSR_TR0 | EXTI_RTSR_TR1 | EXTI_RTSR_TR2 | EXTI_RTSR_TR3 | EXTI_RTSR_TR4;
>
>   // connect pin to interrupt
>   AFIO->EXTICR[0] |= AFIO_EXTICR1_EXTI0_PA;
>   AFIO->EXTICR[1] |= AFIO_EXTICR1_EXTI1_PA;
>   AFIO->EXTICR[2] |= AFIO_EXTICR1_EXTI2_PA;
>   AFIO->EXTICR[3] |= AFIO_EXTICR1_EXTI3_PA;
>   AFIO->EXTICR[0] |= AFIO_EXTICR2_EXTI4_PA;
>
>   NVIC_SetPriority(EXTI0_IRQn, 1);
>   NVIC_SetPriority(EXTI1_IRQn, 2);
>   NVIC_SetPriority(EXTI2_IRQn, 2);
>   NVIC_SetPriority(EXTI3_IRQn, 1);
>   NVIC_SetPriority(EXTI4_IRQn, 1);
>   NVIC_EnableIRQ(EXTI0_IRQn);
>   NVIC_EnableIRQ(EXTI1_IRQn);
>   NVIC_EnableIRQ(EXTI2_IRQn);
>   NVIC_EnableIRQ(EXTI3_IRQn);
>   NVIC_EnableIRQ(EXTI4_IRQn);
>}
>
>__attribute__((section(".after_vectors"))) void EXTI0_IRQHandler()
>{
>   EXTI->PR |= EXTI_PR_PR0;
>}
>
>__attribute__((section(".after_vectors"))) void EXTI1_IRQHandler()
>{
>   EXTI->PR |= EXTI_PR_PR1;
>}
>
>__attribute__((section(".after_vectors"))) void EXTI2_IRQHandler()
>{
>   EXTI->PR |= EXTI_PR_PR2;
>}
>
>__attribute__((section(".after_vectors"))) void EXTI3_IRQHandler()
>{
>   EXTI->PR |= EXTI_PR_PR3;
>}
>
>__attribute__((section(".after_vectors"))) void EXTI4_IRQHandler()
>{
>   EXTI->PR |= EXTI_PR_PR4;
>}
Mam nadzieję, że formatowanie przetrwa.

Tytan2piorunów

Nie zeby to cos zmienilo (bo to wszystko sa zera) ale EXTI0...3 sa w AFIO->EXTICR[0] a EXTI4 w AFIO->EXTICR[1].

W ramach debugowania sprobuj wywolac przerwanie programowe ustawiajac bity w rejestrze EXTI->SWIER. To pomoze Ci znalezc czy problem jest po stronie EXTI / NVIC / CPU czy konfiguracji GPIO. Sprawdz tez, prosta petla, czy czytanie pinu GPIO i pokazywanie go na LEDzie dziala dla wszystkich pieciu. Najgorzej jest spedzic wieczor debugujac program jak problem jest sprzetowy.

Gruba ryba0piorunów

@Skylark dzięki. Jutrzejsze popołudnie zapowiada się zatem pod znakiem debugu, oby skutecznego.
EXTICR[0] i EXTICR[1] próbowałem wcześniej, ale też nie chodziło. Nie zapuściłem żadnego SVN, to tak zostało : )
Jak na razie spędziłem kilka dobrych posiedzeń nad szukaniem przyczyny całkowitego niedziałania nawet zwykłego blinky, a wyszło że to był jakiś pokopany CMSIS, choć wprost pobrany ze źródła.

Gruba ryba0piorunów

@Skylark przerwania programowanie wywołują się. Problem polega na tym, że na dwóch pinach zamiast 3V3 z pullupa rezystorem 10k pojawia mi się jedynie 0,7 V. Poprawiałem na nich diody, a że są w obudowie SOD323, to może jedną - dwie odwrotnie wlutowałem. Napięcie pasuje ładnie do złącza p-n.
No albo coś w kodzie, ale przy ctrl+c/v to raczej nie powinno tak się stać.

Pokaż więcej komentarzy (9)