Elektroda.pl
Elektroda.pl
X
CControls
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

[STM32][C] FreeRTOS i przerwania od USART

arekg_ 08 Lip 2012 20:11 3708 14
  • #1 08 Lip 2012 20:11
    arekg_
    Poziom 8  

    Hej,
    nie mogę znaleźć na forum podobnego problemu. Otóż pracuję z mikrokontrolerem STM32F100RB (płytka stm32vldiscovery) i chciałbym wykorzystać przerwanie od USART podczas pracy z FreeRTOS. Problem polega na tym, że nie wiem, w którym miejscu zdefiniować przerwanie. Uruchamiam je funkcją USART_ITConfig(USART2, USART_IT_TXE, ENABLE) i niestety program nie skacze w obsługę przerwania. Jego definicję chciałem zawrzeć w pliku port.c należącym do plików FreeRTOS (adekwatnie do np. SVCHandler), czyli

    Kod: C
    Zaloguj się, aby zobaczyć kod


    Niestety ciągle program nie jest w stanie owego przerwania obsłużyć. Może jakieś sugestie?

    0 14
  • CControls
  • #2 08 Lip 2012 21:57
    Freddie Chopin
    Specjalista - Mikrokontrolery

    arekg_ napisał:
    Jego definicję chciałem zawrzeć w pliku port.c należącym do plików FreeRTOS (adekwatnie do np. SVCHandler)

    W pliku port.c są komponenty systemu, a przecież przerwanie UARTu nie jest składnikiem systemu... Wrzuć tą funkcje gdziekolwiek chcesz i daruj sobie te fantastyczne xPortPrivSecretpvulPrefixy, bo po co Ci to? Lokalizacja tej funkcji nie ma znaczenia, byle nazywała się tak jak w tablicy wektorów i byle plik został skompilowany.

    arekg_ napisał:
    Niestety ciągle program nie jest w stanie owego przerwania obsłużyć.

    A wpada w HardFaulta czy w ogóle nie?

    arekg_ napisał:
    Może jakieś sugestie?

    Skąd pewność, że skonfigurowałeś prawidłowo UART? Włączenie przerwania nie wystarczy żeby coś się stało...

    4\/3!!

    0
  • CControls
  • #3 09 Lip 2012 01:51
    arekg_
    Poziom 8  

    Trudno mi nie przyznać racji - faktycznie te przerwania nie są składnikiem systemu. Jednakże nie wierzę, że mogę to wrzucić gdziekolwiek. Skąd procek będzie wiedział, że to jest to konkretne przerwanie?

    0
  • #4 09 Lip 2012 08:11
    Freddie Chopin
    Specjalista - Mikrokontrolery

    arekg_ napisał:
    Jednakże nie wierzę, że mogę to wrzucić gdziekolwiek. Skąd procek będzie wiedział, że to jest to konkretne przerwanie?

    No cóż, nie jestem specjalistą ds. wiary, niemniej jednak nie masz racji. "Procek" (a raczej linker) będzie wiedział co z tą funkcją zrobić, bo wpis do tablicy wektorów i ta funkcja ma TAKĄ SAMĄ NAZWĘ.

    Pomyśl o tym tak - w jakim pliku masz funkcję main()? Dlaczego w takim? Skąd procek będzie wiedział co z tą funkcją zrobić? Jak zmienisz nazwę tego pliku to przestanie działać?

    4\/3!!

    0
  • #5 09 Lip 2012 10:26
    arekg_
    Poziom 8  

    Freddie, to wiadomo. Zastanawiam się właśnie na tablicą wektorów przerwań. Myślałem, że do FreeRTOS muszę mieć to inaczej rozwiązane niż dla programu bez systemu. Rozumiem, że wystarczy mi plik z tablicą wektorów.

    0
  • Pomocny post
    #6 09 Lip 2012 10:51
    Freddie Chopin
    Specjalista - Mikrokontrolery

    W tablicy wektorów zupełnie nic nie zmieniasz (jak zwykle) - system masz połączony ze sprzętem poprzez te 3 definicje:

    #define vPortSVCHandler SVC_Handler
    #define xPortPendSVHandler PendSV_Handler
    #define xPortSysTickHandler SysTick_Handler

    Mam nadzieje że masz je w jakimś pliku dołączonym do port.c, np FreeRTOSConfig.h

    4\/3!!

    0
  • #7 09 Lip 2012 11:07
    arekg_
    Poziom 8  

    Czyli przez moje patrzenie od złej strony dochodzę do banalnego wniosku, że nie mam tablicy wektorów. Do pliku port.c mam dołączony plik stm32f10x_it.h, w którym to mamy definicje:

    void NMI_Handler(void);
    void HardFault_Handler(void);
    void MemManage_Handler(void);
    void BusFault_Handler(void);
    void UsageFault_Handler(void);
    void SVC_Handler(void);
    void DebugMon_Handler(void);
    void PendSV_Handler(void);
    void SysTick_Handler(void);

    0
  • Pomocny post
    #8 09 Lip 2012 11:30
    Freddie Chopin
    Specjalista - Mikrokontrolery

    Ściągnij z mojej strony przykład dla STM32 (którykolwiek), to zobaczysz jak to jest zrobione i jak powinno być zrobione...

    http://www.freddiechopin.info/pl/download/category/6-przyklady

    4\/3!!

    0
  • #9 09 Lip 2012 11:31
    arekg_
    Poziom 8  

    Oczywiście nie mam racji;). Tablica wektorów jest zdefiniowana w pliku startup_stm32f10x_md_vl.S. Teraz wystarczy, że nawet w main.c dodam sobie void USART2_IRQHandler( void ) i powinno mi to zadziałać. Gdyby coś było nie tak, to będę kontynuował temat. Dzięki za wskazówki!

    0
  • #10 09 Lip 2012 21:24
    arekg_
    Poziom 8  

    W tym momencie wypłynęło mi coś zupełnie innego. Sprawa dotyka USART i modułu BTM222 (kamodBTM222). Nie mam pojęcia, dlaczego nie mogę wykonać tak prostej czynności, jak zmiana nazwy komendą ATN. Korzystam z przykładu zamieszczonego na http://www.mikrokontroler.pl/content/bluetoothowy-modu%C5%82-btm222-i-stm32..

    W tym momencie zrezygnowałem z przerwań i komendę AT (ATN=BT Led\r) wysyłam w ten sposób:

    Kod: C
    Zaloguj się, aby zobaczyć kod


    Niestety moduł nie zmienia nazwy (co widzę chociażby w smartfonie z bluetoothem).

    Konfiguracja USART i GPIO oraz zegarów poniżej:

    Kod: C
    Zaloguj się, aby zobaczyć kod

    0
  • #11 09 Lip 2012 22:33
    Freddie Chopin
    Specjalista - Mikrokontrolery

    Ja nie wiem jak ten Twój kod ma działać, ale wg mnie nie ma prawa działać...

    4\/3!!

    0
  • #12 09 Lip 2012 22:57
    arekg_
    Poziom 8  

    A mógłbyś przybliżyć, któremu fragmentowi mam się przyjrzeć?

    0
  • Pomocny post
    #13 09 Lip 2012 23:14
    Freddie Chopin
    Specjalista - Mikrokontrolery

    No ale jaki jest w ogóle sens tego kodu?

    1. Najpierw czekasz na zmienną którą ustawiasz w tej samej funkcji i ponoć nie masz przerwań (choć w komentarzach coś niby o nich piszesz), to po co czekać? (nie mówiąc już o tym, że się nigdy nie doczekasz poza pierwszym razem [może], gdyż nigdzie tej zmiennej nie zerujesz przy braku problemów)
    2. Potem kopiujesz do bufora, żeby zaraz z niego wysłać - po co?
    3. Następnie zerujesz tą cześć bufora w której nic nie ma - po co?
    4. Teraz najlepsze - sprawdzasz zmienną TxCounter, której nigdy nie zerujesz (chyba że gdzieś indziej, ale niby gdzie i niby czemu?)
    5. Potem wysyłasz po jednym znaku bez żadnego oczekiwania (dokładnie tak! - fantastyczna funkcja z biblioteki SPL nie robi zupełnie nic ponad wpisanie twojego znaku do rejestru nadawczego - nie ważne czy trwa jakaś transmisja czy nie - pamiętaj o tym używając "ułatwiających wszystko i niezastąpionych" bibliotek).

    Konfiguracji się zbytnio nie przyglądałem, poza jednym. Przyjrzyj się BARDZO DOKŁADNIE i znajdź błąd:

    RCC_APB1PeriphClockCmd(
    RCC_APB2Periph_USART1
    , ENABLE);

    Swoją drogą korzystając z bitbandingu nie da się popełnić takiego błędu [;

    No i po co konfigurujesz CTS skoro nie korzystasz z kontroli przepływu?

    4\/3!!

    0
  • #14 09 Lip 2012 23:20
    arekg_
    Poziom 8  

    Dzięki wielkie za trafne uwagi. Pracowałem nad tym w dużym chaosie i wyszedł niezły burdel. Jutro wniosę poprawki i jeśli będę wrzucał kolejne zapytania, to po dłuższym przemyśleniu kodu.

    0
  • #15 12 Lip 2012 02:19
    arekg_
    Poziom 8  

    Zrobiłem to bez przerwań. Program może nie działa idealnie (mam problemy z odbiorem znaków - jutro na tym się skupię), ale udaje mi się wysyłać at komendy do modułu (np. zmienić nazwę modułu, czy pin) oraz przesyłać stringi przez bluetooth na laptopa.
    Poniżej funkcja wysyłająca i odbierająca pojedynczy znak (w tym wypadku zrezygnowałem z bibliotek ST i skorzystałem bezpośrednio z reference manuala:

    Kod: C
    Zaloguj się, aby zobaczyć kod




    Łącze się z laptopem i wysyłam string funkcją SendDataToBTM222("Freddie Chopin ",15);, który odbieram w terminalu

    [STM32][C] FreeRTOS i przerwania od USART

    0