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

STM32 ustawienia portów GPIO na rejestrach

madiz08 15 Wrz 2017 22:19 870 13
  • #1 15 Wrz 2017 22:19
    madiz08
    Poziom 14  

    Witam
    Niedawno przyszła do mnie płytka NUCLEO F103RB. Chciałbym nauczyć sie programowania na STM32 na rejestrach, dlatego tez zacząłem przeglądać reference manual dla STM32
    STM32 ustawienia portów GPIO na rejestrach
    Dowiedziałem sie, że w przeciwieństwie do Atmeg, tutaj najpierw należy doprowadzić zegar do portów aby je uaktywnić.
    dlatego też wstawiłem poniższą linikj ustawiając bity 2,3,4,5

    Kod: c
    Zaloguj się, aby zobaczyć kod

    Nastepnie doczytałem na temat CRL i CRH
    STM32 ustawienia portów GPIO na rejestrach
    Na początek chciałbym aby stan portuB jako wejściowego z podciągnietym pullup był wyświetlany na porcieA, który ustawie jako wyjsciowy
    STM32 ustawienia portów GPIO na rejestrach
    Korzystając z powyższego obrazka napisałem poniższy kod:
    Kod: c
    Zaloguj się, aby zobaczyć kod


    Pod portA mam podłączone przez rezystory 8 diód led od A0 do A7. Niestety, licząc że 8 diód mi sie zaświeci, zauważyłem, że diody A2 i A3 sie nie świecą :( . Sprawdziłem na woltomierzu i na pinie PB3 mam 0V, nie wiedzieć dlaczego, na PB2 ma 3,3V i też nie wiem, dlaczego na PA2 jest 0V.
    Czy ktoś może wie w czym tkwi błąd?

    0 13
  • #2 15 Wrz 2017 23:08
    2675900
    Użytkownik usunął konto  
  • #3 16 Wrz 2017 08:28
    madiz08
    Poziom 14  

    Nie, nie, nic z tych rzeczy odnośnie oszczedzania klawiatury. Po prostu na atmedze jak znałem dany rejestr to mogłem ustawić w nim poszczególne bity. Jeżeli bity 2,3,4,5 rejestru APB2ENR są odpowiedzialne za podłączenie portów A,B,C,D do zegara (jako enable) to niestety poniższy zapis jest traktowany jako błąd.

    Kod: c
    Zaloguj się, aby zobaczyć kod

    dlatego wygląda to jak poniżej:
    STM32 ustawienia portów GPIO na rejestrach
    Odnośnie drugiego pytania to ma to być na zasadzie
    Kod: c
    Zaloguj się, aby zobaczyć kod
    . Jeżeli cały PORTB jest ustawiony jako wejścia z podciągnietym PULLUP to chyba cały PORTA do którego mam podłączone ledy powinien być również w stanie wysokim, a piny A2 i A3 są w stanie niskim. Tak samo PB3 jako wejście z podciągnietym PULLUP powinno być w stanie wysokim a nie jest, jest na nim 0V i też si zastanawiam dlaczego. Użyłem dzisiaj gotowych bibliotek:
    Kod: c
    Zaloguj się, aby zobaczyć kod


    ustawiając pierwsze 8 pinów portuB jako wejscia z podciagnietym pullup i też tylko na PB3 ma 0V, a na pozostałych 3,3V. Dlaczego tak sie dzieje? Czy ten pin jest jakoś zarezerwowany? A może PA2 i PA3 były w stanie 0V przez cały czas bo są pinami RX i TX?

    0
  • Pomocny post
    #4 16 Wrz 2017 10:29
    Sareph
    Poziom 19  

    madiz08 napisał:
    Kod: c
    Zaloguj się, aby zobaczyć kod


    Kod: c
    Zaloguj się, aby zobaczyć kod


    Włącz też AFIO i wyłącz w nim (AFIO->MAPR) - SWD i JTAG inaczej piny PB3, PB4, PA13-15 będą zarezerwowane i nieużywalne do niczego poza debugiem. Oraz zweryfikuj czy faktycznie PORTx->CRx zawierają to co powinny.

    1
  • Pomocny post
    #5 16 Wrz 2017 10:51
    2675900
    Użytkownik usunął konto  
  • Pomocny post
    #6 16 Wrz 2017 10:55
    Freddie Chopin
    Specjalista - Mikrokontrolery

    Sareph napisał:
    Włącz też AFIO i wyłącz w nim (AFIO->MAPR) - SWD i JTAG

    Dobry pomysł, szczególnie jak ktoś lubi mieć potem problem z ponownym zaprogramowaniem układu (;

    Osobiście proponuję tego _NIE_ robić.

    1
  • #7 16 Wrz 2017 10:58
    Sareph
    Poziom 19  

    Freddie Chopin napisał:
    Dobry pomysł, szczególnie jak ktoś lubi mieć potem problem z ponownym zaprogramowaniem układu (;
    Bo to jest faktycznie wielki problem. BOOT0 podciągnąć do VCC i zrobić reset. Ale ok, niech bedzie:

    "Wyłącz JTAG, zostaw SWD", lepiej? ;)

    0
  • Pomocny post
    #8 16 Wrz 2017 11:01
    Freddie Chopin
    Specjalista - Mikrokontrolery

    Sareph napisał:
    Bo to jest faktycznie wielki problem. BOOT0 podciągnąć do VCC i zrobić reset.

    Ty to wiesz, ja to wiem, ale czy na pewno autor tematu też to wie?

    Sareph napisał:
    "Wyłącz JTAG, zostaw SWD", lepiej?

    Skąd pewność, że autor tematu używa SWD a nie JTAG?

    0
  • Pomocny post
    #9 16 Wrz 2017 11:03
    Sareph
    Poziom 19  

    Freddie Chopin napisał:
    Skąd pewność, że autor tematu używa SWD a nie JTAG?
    Bo marudzi, ze ma problem ze stanem pinów PB3 i PB4? Czyli je do czegoś podłączył i nie jest to JTAG. ;)

    A swoją droga, bo właśnie sprawdziłem, jest jeszcze jedna metoda na zaprogramowanie z wyłączonym debugiem, przycisnąć reset i:

    Code:
    stlink -HardRst -c SWD -Halt -P build/firmware.bin 0x8000000 -Rst


    Zwolnić reset po tym jak stlink zakomunikuje, ze wykonuje reset (będzie czekał na zwolnienie linii). Zaprogramuje układ normalnie.

    0
  • Pomocny post
    #10 16 Wrz 2017 11:59
    2675900
    Użytkownik usunął konto  
  • Pomocny post
    #11 16 Wrz 2017 12:08
    Sareph
    Poziom 19  

    Piotrus_999 napisał:
    A nie prościej i bezpieczniej po prostu przełożyć diody do innego portu :)
    Może prościej i bezpieczniej, ale się dziwi co nie tak z tymi pinami jest to mu dałem odpowiedź co zrobić aby przestały się "dziwnie zachowywać". Co z tą wiedzą zrobi to już... swój mózg ma. Układu w każdym razie nie zepsuje. :) Poza tym może zechce kiedyś skorzystać ze SPI1 remapowanego na te piny i się zdziwi czemu nie działa? To już będzie miał odpowiedź. ;)

    0
  • #12 16 Wrz 2017 15:27
    madiz08
    Poziom 14  

    Dzieki Panowie, udało mi sie uzyskać zamierzony efekt kierując sie zaleceniami kolegi Sareph, dobrze wiedzieć jak sie ustawia poszczególne bity rejestrów, jednak mam pytanko:
    STM32 ustawienia portów GPIO na rejestrach
    właśnie zrobiłem to w taki sposób jak powyżej, bo nie wiem jak ustawić bit25 jeżeli pod nazwą SWJ_CFG[2:0] kryją sie trzy bity (24, 25, 26) i nie wiem jak mam ustawić nr24

    Kod: c
    Zaloguj się, aby zobaczyć kod

    Powyższy zapis chyba nie bedzie prawidłowy? Kolega Piotrus_999 napisał, żeby zapoznać sie z poradnikiem, ale jakim? Mógłbym poprosić jakiś link?
    Mocno zaciekawił mnie STM32, chociażby dlatego, że przesyła 32bity na raz a nie 8, czestotliwość zegara jest też dużo wieksza, może sie łączyć po ethernecie itd. Może polecilibyście jakąś książke o STM32 do nauki programowania w oparciu o rejestry. Na Atmedze nauczyłem sie programować głównie z http://mikrokontrolery.blogspot.com i książki Tomasza Francuza, chociaż żaden ze mnie programista, znam troche podstaw, ale STM32 chciałbym poznać włąśnie nie na gotowych bibliotekach tylko na rejestrach, żeby wiedzieć co za co odpowiada i w jaki sposób. Na razie "Wyłącz JTAG, zostaw SWD" za dużo mi nie mówi. Jeszcze raz dzieki.

    0
  • #13 16 Wrz 2017 15:56
    Sareph
    Poziom 19  

    madiz08 napisał:
    Dzieki Panowie, udało mi sie uzyskać zamierzony efekt kierując sie zaleceniami kolegi Sareph, dobrze wiedzieć jak sie ustawia poszczególne bity rejestrów, jednak mam pytanko:
    STM32 ustawienia portów GPIO na rejestrach

    Kod: c
    Zaloguj się, aby zobaczyć kod


    madiz08 napisał:
    Kolega Piotrus_999 napisał, żeby zapoznać sie z poradnikiem, ale jakim? Mógłbym poprosić jakiś link?


    https://www.elektroda.pl/rtvforum/topic3111562.html

    madiz08 napisał:
    Na razie "Wyłącz JTAG, zostaw SWD" za dużo mi nie mówi. Jeszcze raz dzieki.


    Konfiguracja: 010: JTAG-DP Disabled and SW-DP Enabled
    Uwolni PB3, PB4 i PA15, a nie będzie przeszkadzało w programowaniu STLinkiem (PA14 i PA13 zostają zarezerwowane).

    0