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 - Wystawienie stanu wysokiego na pin

kornik280 13 Kwi 2014 14:11 1242 15
  • #1 13 Kwi 2014 14:11
    kornik280
    Poziom 17  

    Mam mikrokontroler stm32f103rb.
    Chciałbym wystawić stan wysoki na pin PA10.
    Oto kod:

    Kod: cpp
    Zaloguj się, aby zobaczyć kod

    Niestety na pinie jest ~0,9V Gdy wypnę programator
    Co robie nie tak?

    0 15
  • #2 13 Kwi 2014 14:17
    Marek_Skalski
    Moderator Projektowanie

    kornik280 napisał:
    GPIO_InitStruct.GPIO_Pin =GPIO_Pin_10; //ustawiamy w stan wysoki

    Komentarz jest nieprawidłowy. W tej linii ustawiasz tylko maskę dla pinów, które będą konfigurowane 3 linie niżej.
    Tak to jest jak się korzysta z SPL'a.
    GPIO_Init(....) konfiguruje tylko i wyłącznie tryb pracy portów, ale nie konfiguruje stanów wyjściowych. To trzeba zrobić samodzielnie zapisując do rejestrów BSRR odpowiednią wartość,
    np. BSRRL = (1<<GPIO_Pin_10);

    0
  • #3 13 Kwi 2014 14:30
    kornik280
    Poziom 17  

    Dodałem do kodu:

    Kod: cpp
    Zaloguj się, aby zobaczyć kod


    I dalej jest ok 1V na pinie

    0
  • #4 13 Kwi 2014 15:35
    Marek_Skalski
    Moderator Projektowanie

    Co jeszcze jest podłączone do tego pinu? To jakaś płytka z serii Discovery?
    Napięcie spada po odłączeniu programatora czy stale jest 1V?

    0
  • #6 13 Kwi 2014 18:38
    Marek_Skalski
    Moderator Projektowanie

    Czy układ jest zasilany usb albo innego zasilacza podłączonego do gniazda?
    Dioda D1 świeci?
    Układ programuje się prawidłowo?
    Możesz śledzić wykonanie programu debugerem?

    0
  • #7 13 Kwi 2014 19:23
    kornik280
    Poziom 17  

    1.Układ jest zasilany zewnętrznym zasilacze 12VDC
    2.TAK
    3.TAK
    4.TAK

    0
  • #8 13 Kwi 2014 20:20
    Marek_Skalski
    Moderator Projektowanie

    Jeżeli nic wcześniej nie podłączałeś do tego wyprowadzenia, to sprawdź czy układ/pin reaguje na ręczną zmianę stanu w rejestrze ODR. Przy okazji możesz sprawdzić stan pozostałych bitów odpowiedzialnych za konfigurację. Możesz wstawić zrzut ekranu.
    Ale jeżeli wszystko jest ok w rejestrach, a pin się nie odzywa, to jest trwale niezdolny do posługi i pożytku już z niego nie będzie.
    Może jednak wcześniej coś testowałeś i potraktowałeś go niestosownym prądem?
    Sprawdź inny pin czy zachowuje się prawidłowo i będziesz miał szybką odpowiedź, ponieważ AF dla PA10 to tylko USART1_RX i TIM1_CH3.

    0
  • #9 13 Kwi 2014 20:31
    kornik280
    Poziom 17  

    Niestety nie wiem jak ręcznie zmienić wartość rejestru ODR?
    Po prawej stronie mam rejestry Core: od R0 do R15 oraz xPSR System Internal gdzie mogę odszukać odr?

    EDIT: Keil

    0
  • #10 13 Kwi 2014 20:50
    Marek_Skalski
    Moderator Projektowanie

    Nie wiem w jakim środowisku pracujesz. Pewnie w zakładce Peripherials czy jakoś tak.
    Szukasz wtedy GPIOA, a po jego rozwinięciu rejestru ODR.

    0
  • #11 13 Kwi 2014 21:06
    kornik280
    Poziom 17  

    Mam odr 10 jest checkbox i jest zachaczony

    0
  • #12 13 Kwi 2014 21:11
    Marek_Skalski
    Moderator Projektowanie

    Pewnie tak.
    Wartość zapisana do portu daje pełne wyobrażenie o jego zawartości. Haczyki do mnie nie przemawiają ;)
    Ogólnie w ODR powinna być wartość 0xX400 lub 0xXC00, gdzie 0x oznacza liczbę w kodzie hex, a X to dowolna wartość.
    Nie zmieniaj bitów 13. i 14. Stracisz połączenie przez SWD.

    0
  • #13 13 Kwi 2014 21:14
    kornik280
    Poziom 17  

    Wartość rejestru odr to 0x00000400, rejestr bsrr=0
    Jest pewien sukces gdy puszczam debagowanie pojawia się stan wysoki jak wyłaczam debug to dalej jest stan wysoki, pomimo że przed debagowaniem był niski
    Dlaczego tak jest?
    Jak wymuszę dojście do linijki GPIO_SetBits(GPIOA, GPIO_Pin_10); mam stan wysoki
    Czyli program w normalnym trybie tam nie dochodzi?
    Może mnie coś blokuje w clock_init?

    0
  • #14 13 Kwi 2014 21:49
    el2010tmp
    Poziom 25  

    kornik280 napisał:
    Może mnie coś blokuje w clock_init?

    To zakomentuj funkcje clock_init(); STM bez ustawionego zegara chodzi na wewnętrznym generatorze RC.

    0
  • #15 13 Kwi 2014 21:56
    kornik280
    Poziom 17  

    Dalej stan 0,6V :( Puszczam debug dochodze do linijki GPIO_SetBits(GPIOA, GPIO_Pin_10); I mam stan wysoki 3,3V

    0
  • #16 13 Kwi 2014 22:11
    el2010tmp
    Poziom 25  

    Sprawdź czy działa bez SPL tzn.:
    zamiast GPIO_SetBits(GPIOA, GPIO_Pin_10); daj np.:
    GPIOA->ODR |= GPIO_Pin_10;
    Ja kiedyś miałem problem z poprawnym działaniem funkcji SPL (przez błędne ustawienie zegara :))

    0