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

STM32F0DISCOVERY - Bluetooth HC05

06 Mar 2016 00:09 1245 20
  • Poziom 11  
    Witajcie

    uczę się programować ARMy i właśnie nastał moment gdy komunikaty pokazywane przez diody mnie już nie wystarczają. Ponieważ mam pod ręką Bluetooth HC05 (często w ATmega wykorzystywałem wiec podłączenie mam dobre) to właśnie na niego padł wybór. Niestety gdy staram się odpalić program, który odbierze mi znak i go odeśle wszystko się sypie i np. zamiast znaku "q" otrzymuję "}". Będę bardzo wdzięczny za pomoc, ponieważ to bardzo ułatwi mi naukę.

    Kod:
    Kod: c
    Zaloguj się, aby zobaczyć kod


    Od niedawna uczę się ARMów więc jeszcze gubię się w tak ogromnej ilości rejestrów. Niemniej jednak nadal staram się iść do przodu :D
  • Computer Controls
  • Pomocny post
    Specjalista - Mikrokontrolery
    matti0010 napisał:
    USART1->ISR &= ~USART_ISR_RXNE;

    To jest po pierwsze zbędne - flaga jest czyszczona automatycznie jeśli coś odczytasz - a po drugie błędne - do czyszczenia flag słłuży rejestr ICR, a nie ISR (który jest tylko do odczytu).

    Na pinie RX warto albo ustawić wewnętrzne podciąganie, albo zrobić podciąganie zewnętrzne.
  • Poziom 11  
    Freddie Chopin napisał:
    matti0010 napisał:
    USART1->ISR &= ~USART_ISR_RXNE;

    To jest po pierwsze zbędne - flaga jest czyszczona automatycznie jeśli coś odczytasz - a po drugie błędne - do czyszczenia flag słłuży rejestr ICR, a nie ISR (który jest tylko do odczytu).

    Na pinie RX warto albo ustawić wewnętrzne podciąganie, albo zrobić podciąganie zewnętrzne.


    Zakomentowałem tamtą linijkę. Co do podciągnięć, dałem zewnętrzne na obu liniach danych. To było pierwsze co zrobiłem jak coś nie działało.

    Nadal pokazuje mi głupoty :cry:
  • Pomocny post
    Poziom 25  
    Jak masz skonfigurowany zegar systemowy? Na pewno jest to 8MHz a nie 48MHz ?
  • Computer Controls
  • Pomocny post
    Poziom 25  
    matti0010 napisał:
    wiec mam 8MHz tak jak fabrycznie dostalem stm32f0discovery.

    Napewno?
    "Fabrycznie" jest kwarc 8MHz natomiast MCU ma mnożnik PLL który można ustawić.
    Jakiego środowiska używasz? W "moim" eclipse standardowy szablon dla STM32F0DISCOVERY wygląda tak:
    Kod: c
    Zaloguj się, aby zobaczyć kod

    /nazwa_projektu/system/src/cmsis/system_stm32f0xx.c

    Ale równie dobrze może być inaczej.

    matti0010 napisał:
    Na pewno mam 8MHz. SysTick'iem sie upewnilem.

    Pokaż kod.
  • Poziom 28  
    el2010tmp napisał:
    Pokaż kod.

    Przecież cały kod jest w pierwszym poście i nie ma tam ani ustawiania zegarów, ani wywołania funkcji której dotyczą te parametry (SystemInit).
  • Specjalista - Mikrokontrolery
    Zwykle funkcja SystemInit jest wywoływana przez moduł startowy przed wywołaniem main().
  • Poziom 11  
    Kod:

    Kod: c
    Zaloguj się, aby zobaczyć kod


    Zmieniłem na:
    Kod: c
    Zaloguj się, aby zobaczyć kod
    i faktycznie działa. W życiu bym nie wpadł, że skoro nie macam nic od ustawiania zegarów to mimo wszystko mam inną wartość na rdzeniu. Przeanalizuję sobie ten plik, który @el2010tmp wskazał. Czyli jak dobrze rozumie, rdzeń pędzi z prędkością 48MHz? Czy z taką prędkością wszystko się wykonuje? Jeszcze nie doszedłem do tych zagadnień podczas nauki :cry:
  • Poziom 25  
    Chodziło mi o kod za pomocą którego sprawdziłeś timerem SysTick że jest 8MHz :)

    matti0010 napisał:
    Czyli jak dobrze rozumie, rdzeń pędzi z prędkością 48MHz? Czy z taką prędkością wszystko się wykonuje?

    Kwestia zegarów w ARM jest "nieco" bardziej złożona. Rdzeń, magistrale i peryferia ustawia się oddzielnie.
  • Poziom 11  
    el2010tmp napisał:
    Chodziło mi o kod za pomocą którego sprawdziłeś timerem SysTick że jest 8MHz :)

    matti0010 napisał:
    Czyli jak dobrze rozumie, rdzeń pędzi z prędkością 48MHz? Czy z taką prędkością wszystko się wykonuje?

    Kwestia zegarów w ARM jest "nieco" bardziej złożona. Rdzeń, magistrale i peryferia ustawia się oddzielnie.

    Wieczorwm wrzuce kod :D
    Skoro to bardziej złożona kwestia, to doczytam już we własnym zakresie
  • Poziom 11  
    Użyj CubeMX do konfiguracji procka i wykorzystaj biblioteki HALa. Nie będziesz miał problemu.
  • Poziom 11  
    SimKom napisał:
    Użyj CubeMX do konfiguracji procka i wykorzystaj biblioteki HALa. Nie będziesz miał problemu.

    Jestem elektronikiem, nie informatykiem. Znajomość gotowych bibliotek mi nie wystarcza, chcę zrozumieć jak działa mikrokontroler od środka. Ktoś powie, że to masochizm, lecz dzięki temu będę mógł lepiej wykorzystać jego potencjał. Nie twierdzę, że gotowe biblioteki to coś złego. Są one świetną sprawą, lecz chciałbym bardzo dokładnie wiedzieć czemu tak a nie inaczej działają i jak ewentualnie je mogę zmodyfikować od środka (bądź z czasem napisać własne).

    SysTick'iem machałem sobie tak:
    Kod: c
    Zaloguj się, aby zobaczyć kod


    Sądziłem, że skoro SysTick jest od rdzenia to ma takie samo taktowanie jak np. USART itd. Wiem, że jest tam parę zbędnych rzeczy, to była jedna z pierwszych rzeczy jakich się nauczyłem. Z czasem będę lepiej pisał kody, ponieważ będę lepiej czuł ten mikrokontroler (a przynajmniej mam taką nadzieję :D ). Spróbuję dojść do tego, jak to jest w rzeczywistości. Nie od razu Rzym zbudowano :D
  • Specjalista - Mikrokontrolery
    SysTick_Config() to przykład całkowicie bzdurnej funkcji, która "za Twoimi plecami" ustawia na sztywno że SysTick będzie taktowany z zegara rdzenia podzielonego przez 8. Tak wiec dla Twojego mikrokontrolera taktowanego zegarem 48MHz, SysTick był taktowany zegarem 6MHz.
  • Poziom 33  
    Poniższe linie nic nie robią:

    Kod: c
    Zaloguj się, aby zobaczyć kod


    __attribute__((interrupt)) jest zbędne.
  • Poziom 11  
    Freddie Chopin napisał:
    SysTick_Config() to przykład całkowicie bzdurnej funkcji, która "za Twoimi plecami" ustawia na sztywno że SysTick będzie taktowany z zegara rdzenia podzielonego przez 8. Tak wiec dla Twojego mikrokontrolera taktowanego zegarem 48MHz, SysTick był taktowany zegarem 6MHz.

    Właśnie potwierdziłeś co pisałem wcześniej, nie znam tej funkcji aż tak dogłębnie i jaki tego efekt? Taki jak napisałeś. Dziękuję za zwrócenie uwagi, będę na to uważał...
    W sumie to by wyjaśniało czemu miałem wrażenie że minimalnie inaczej mruga dioda a wskazówka sekundnika na zegarku. Uznałem jednak że to wina mojego oka, które po prostu przy przeskakiwaniu między diodą a zegarkiem pokazywało mi złudzenie różnicy.

    @GrzegorzKostka, jak pisałem, wiem że tak niektóre linie nic nie robię ;) ale dopiero się uczę więc jeszcze takie błędy popełniam.
  • Użytkownik usunął konto  
  • Specjalista - Mikrokontrolery
    Piotrus_999 napisał:
    Ładuje standardowo do CTRL | CLKSOURCE jedynke czyli processor clock.

    Wydaje mi się, że kiedyś przypisanie do SysTick->CTRL było właśnie bez SysTick_CTRL_CLKSOURCE_Msk, ale to mogło być dawno temu. Tak czy siak funkcja ta ma zastosowanie tylko w 50% przypadków, bo nie pozwala na skonfigurowanie czy owe CLKSOURCE ma być włączone czy nie. Nie mówię już nawet o przypisywaniu priorytetu bez proszenia...
  • Użytkownik usunął konto  
  • Specjalista - Mikrokontrolery
    Piotrus_999 napisał:
    prirytet na maks

    Nie wiem czy zwróciłeś uwagę, ale ta funkcja ustawia MINIMALNY priorytet.
  • Użytkownik usunął konto