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

[STM32] Komunikacja z modułem Bluetooth po USART2

Pawel_1985 31 Maj 2018 11:58 483 8
  • #1 31 Maj 2018 11:58
    Pawel_1985
    Poziom 6  

    Witam!

    Zaczynam przygodę z STM, na płytce mam polutowany układ STM32L052C6T6 z podłączonym do USART2 modułem Bluetooth o oznaczeniu RN4871.

    Moduł wydaję mi się, że działa. Na telefonie w aplikacji BLE Smart Discover moduł jest widoczny.

    Póki co korzystam z pomocy bibliotek Hal, przy czym nie jestem pewny w jaki sposób przy pomocy tej biblioteki wysyłać komendy do modułu za pomocą usart.

    Główny problem wydaje mi się, że mam z przesłaniem znakiem końca linii. W przypadku AVR radziłem sobie w taki sposób:

    Kod: c
    Zaloguj się, aby zobaczyć kod


    W obecnym programie (piszę w Keil uVision5 - jest darmowy dla mojego uP) mam do wyboru funkcje HAL_UART_Transmit_IT lub po porstu HAL_UART_Transmit.

    Pytanie bardziej, jak wysłać za pomocą tych funkcji dane oraz znak powrotu karetki. Na przykład chciałbym wykonać prostą transmisję tak jak w przykładzie ze strony Microchipa:

    http://microchipdeveloper.com/ble:rn4870-app-example-smartphone-basic-demo

    Poniżej fragmenty programu z konfiguracją USART2:

    Kod: c
    Zaloguj się, aby zobaczyć kod


    Pozdrawiam!

    0 8
  • Mitronik
  • #2 31 Maj 2018 12:21
    Samuraj
    Poziom 35  

    Spróbuj tak:

    Kod: c
    Zaloguj się, aby zobaczyć kod

    0
  • Mitronik
  • #3 31 Maj 2018 21:11
    Pawel_1985
    Poziom 6  

    Witam!

    Napisałem taki oto kod... w teorii powinien zmieniać nazwę urządzenie BT, ale nie zmienia ;)

    Komendę kończę zwrotem "\r" ponieważ tak jest napisane na stronie Microchipa:

    "A variety of universal asynchronous receiver/transmitter (UART) commands are used to control and configure the RN4870 module. All commands contain one, two or three case-insensitive characters and end with a carriage return ('\r', \x0d)."

    Co do samego programu, to kompilator zwracał ostrzeżenie przy operacji "strlen". Treść ostrzeżenia brzmi: warning: passing 'uint8_t' to parameter of type 'const char' converts between pointers to integer with different sign.

    Zmieniłem więc deklaracje uint8_t buffer na const char buffer.

    Czy tak napisany kod jest okej?

    Kod: c
    Zaloguj się, aby zobaczyć kod

    0
  • #4 01 Cze 2018 19:44
    3149400
    Użytkownik usunął konto  
  • #5 03 Cze 2018 21:41
    Pawel_1985
    Poziom 6  

    Droga, którą obrałem to wpierw HAL, ze względu na bardzo przyjazną graficzną możliwość konfiguracji, a potem wraz z przeglądaniem dokumentacji powolne przechodzenie na rejestry. Po prostu po kolei np. obsługę portów (wejścia/ wyjścia) stosuję już bezpośrednio na rejestrach. I tak krok po korku ;)

    Co do wcześniej opisanego problemu, to moduł BT sterowany bezpośrednio z PC działa prawidłowo, wiec teraz próbuje zmusić uP do tego, aby wysyłał to samo co komputer.

    Pierwsze pytanie mam co do ustawień zegara. Z przyzwyczajenia zrobiłem to tak jak w AVR czyli zegar ustawiłem 8 MHz. Nie korzystam z zewnętrznego kwarca.

    Dodatkowo, aby sprawdzić czy zegar jest ustawiony dobrze, ustawiłem zegar na 1 sekundowe przerwanie (preskaler 8, a licznik zlicza do 1000). Dioda mruga co 1 sekundę, więc uP ma ustawiony wewnętrzny oscylator na 8 Mhz. Prędkość transmisji 115200 b/s.

    Czy takie podejście jest prawidłowe? Czy konieczny jest kwarc zewnętrzny?

    Poniżej przesyłam program. Mikrokontroler podłączony jest przez przejściówkę do komputera. Plan był taki, aby co sekundę na terminal wyświetlał się napis.

    Prośba, czy nie widzicie jakiś błędów w poniższym programie.

    Kod: c
    Zaloguj się, aby zobaczyć kod

    0
  • #6 03 Cze 2018 22:04
    3171327
    Użytkownik usunął konto  
  • #7 03 Cze 2018 22:27
    3149400
    Użytkownik usunął konto  
  • #8 04 Cze 2018 08:12
    BlueDraco
    Specjalista - Mikrokontrolery

    A w jaki sposób skonfigurowałeś zegar w L0 na 8 MHz? Myślę, że to tu jest błąd.

    0
  • #9 07 Cze 2018 12:12
    Pawel_1985
    Poziom 6  

    Po krótkiej przerwię, postanowiłem na podstawie RM0376 napisać po kolei mriganie diody LED, a potem transmisję po Uarcie.

    Obecnie siedzę, nad tym pierwszym... prostę załączenie diody LED RGB, ale niestety nie działa. Dioda połaczona jest plusem do zasilania i minusem do wejść uP. Sprzętowo na pewno działa, ponieważ na programie z biblioteką HAL jest okej, więc gdzieś błąd tkwi w tym programiku.

    Kod: c
    Zaloguj się, aby zobaczyć kod


    Dodano po 3 [godziny]:

    Działa ;)

    Resjestr MODER po resecie ma wartość 0xFFFF FFFF (dla portu B), stąd aby uzyskać MODE01 należy takie coś napisać.

    Teraz czas na uart;)

    GPIOB->MODER &= ~(GPIO_MODER_MODE0_1); //GPIOB->MODER |= 0x000000002;
    GPIOB->MODER &= ~(GPIO_MODER_MODE1_1); //GPIOB->MODER |= 0x000000008;
    GPIOB->MODER &= ~(GPIO_MODER_MODE2_1); //GPIOB->MODER |= 0x000000020;

    0