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.

Podmienianie funkcji z biblioteki stm

szefkozak 06 Cze 2012 09:57 1823 18
  • #1 06 Cze 2012 09:57
    szefkozak
    Poziom 11  

    Witam. Mam dziwny problem z funkcjami standardowymi STM. Próbuje zaimplementować stos tcp/ip (LwIP). Bazuję na przykładach które korzystają z funkcji z biblioteki STM, ale docelowo w moim projekcie nie korzystam z tych funkcji(świadomie). Jednak kiedy zastępuję fragmenty kody przykładu swoimi fragmentami, Przykład przestaje działać. Konkretnie dzieje się tak gdy podmieniam funkcje ustawiające porty gpio.

    Oryginalny kod

    Code:
      GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
    
      GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
      GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
      GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
      GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL ; 
      GPIO_Init(GPIOA, &GPIO_InitStructure);


    Mój kod:
    Code:
    /*------------------------ Configure MCO (PA8) ---------------------------------*/
    
       GPIOA->MODER &= (uint32_t)~(3 << 16);                  //GPIOA pin8 as alternate function
       GPIOA->MODER |= (uint32_t)(2 << 16);                  //
       GPIOA->OSPEEDR |= (uint32_t)(3 << 16);               //GPIOA pin8 speed 100 MHz
       GPIOA->OTYPER &= (uint32_t)~(1 << 8);                  //GPIOA pin8 output type push-pull
       GPIOA->PUPDR &= (uint32_t)~(3 << 16);                  //GPIOA pin8 No pull-up, pull-down


    Generalnie powinno to działać tak samo a gdy podmieniam kod na mój, przykład przestaje działać. Czy ktokolwiek miał do czynienia z taka sytuacją?
    Lub czy ktokolwiek widzi błąd w tym co zrobiłem. Bardzo proszę o pomoc.

    0 18
  • #2 06 Cze 2012 10:07
    94075
    Użytkownik usunął konto  
  • #3 06 Cze 2012 10:12
    Freddie Chopin
    Specjalista - Mikrokontrolery

    Jeśli podmieniasz TYLKO to co powyżej to przestaje działać, czy jeśli podmieniasz 10 innych podobnych fragmentów?

    Ja bym zaczął od usunięcia rzutowania, bo ono nie jest tu potrzebne. Potem zajrzyj do funkcji GPIO_Init() i zobacz co ona jeszcze robi czego nie robisz Ty.

    4\/3!!

    0
  • #4 06 Cze 2012 10:52
    szefkozak
    Poziom 11  

    albertb napisał:

    Ja widzę w tym czego nie zrobiłeś.
    Albert


    Jeżeli chodzi Ci o włączenie taktowania to to jest zrobione.

    @Freddie Przykład przestaje działać po podmienieniu konkretnie tego kawałka kodu. Patrzyłem co robi funkcja GPIO_Init(), ale ona jedynie wpisuje odpowiednie wartości do tych samych rejestrów co ja.

    Usunięcie rzutowania nic nie zmienia.

    0
  • #5 06 Cze 2012 11:11
    Freddie Chopin
    Specjalista - Mikrokontrolery

    To zobacz jakie wartości mają wszystkie rejestry GPIOA po wywołaniu funkcji z biblioteki i potem sprawdź to samo dla swojego kodu - zobaczysz gdzie jest różnica.

    4\/3!!

    0
  • #6 06 Cze 2012 11:18
    szefkozak
    Poziom 11  

    Robiłem to, nie ma żadnej różnicy. Właśnie dlatego udaję się z tym na forum, bo w tej sytuacji moja logika się kończy...

    0
  • #7 06 Cze 2012 11:27
    Freddie Chopin
    Specjalista - Mikrokontrolery

    A jesteś w stanie stwierdzić czy na tym pinie masz wyprowadzony zegar czy może jest stale 0, stale 1 lub coś zupełnie innego niż potrzeba?

    4\/3!!

    0
  • #8 06 Cze 2012 12:21
    Jado_one
    Poziom 22  

    szefkozak napisał:

    Generalnie powinno to działać tak samo a gdy podmieniam kod na mój, przykład przestaje działać. Czy ktokolwiek miał do czynienia z taka sytuacją?
    Lub czy ktokolwiek widzi błąd w tym co zrobiłem. Bardzo proszę o pomoc.


    Ustawiasz w porcie Alternate Function, ale nie ustawiasz jej numeru.

    0
  • #9 06 Cze 2012 13:52
    szefkozak
    Poziom 11  

    @Freddie: Na tym pinie wyprowadzony jest sygnał zegarowy dla PHY ethernetu.
    @Jado_one: funkcja która mnie interesuje ma wartość 0 wiec nic nie trzeba ustawiać.

    Zanim ktokolwiek spyta czy mam jeszcze coś innego ustawione odpowiadam:

    Jedyną moją ingerencją w działający przykładowy program była podmiana zamieszczonych na początku fragmentów kodu czego efektem jest brak działania przykładowego programu.

    0
  • #10 06 Cze 2012 14:42
    Freddie Chopin
    Specjalista - Mikrokontrolery

    szefkozak napisał:
    @Freddie: Na tym pinie wyprowadzony jest sygnał zegarowy dla PHY ethernetu.

    Pytam o to, czy ten pin faktycznie NIE DZIAŁA jak oczekujesz po zmianie kodu, bo może jakimś sposobem coś innego przestaje działać, a sygnał zegarowy może sobie być dobry. Więc sprawdź to - jeśli masz jak.

    4\/3!!

    0
  • #11 06 Cze 2012 14:59
    Jado_one
    Poziom 22  

    szefkozak napisał:

    @Jado_one: funkcja która mnie interesuje ma wartość 0 wiec nic nie trzeba ustawiać.

    Może masz, ale dobrą zasadą jest nie pozostawianie niczego tzw. "defaultowym wartościom", tylko jawne ustawianie takich wartości jakie się założyło i powinny być.
    Gdyby jakiś fragment kodu wcześniej zmienił coś w tych bajtach, to wartości "po resecie" idą w las.... (zwłaszcza że do końca nie wiadomo co robią biblioteki SPL ;-) )
    To tylko taka moja mała uwaga i rada na przyszłość...

    0
  • #12 06 Cze 2012 15:10
    szefkozak
    Poziom 11  

    Sprawdziłem na oscyloskopie. Sygnał na tym pinie jest identyczny w obu przypadkach...

    0
  • #13 06 Cze 2012 15:36
    Freddie Chopin
    Specjalista - Mikrokontrolery

    No to może spróbuj robić tak jak funkcja - każde bity zerować przed ustawieniem? Innymi słowy - dorzuć zerowanie OSPEEDR przed jego ustawieniem. Jeśli to nie to, to problem masz w innym miejscu, w jakichś zależnościach czasowych albo program się sypie (masz JTAGa?).

    4\/3!!

    0
  • #14 06 Cze 2012 16:04
    Jado_one
    Poziom 22  

    Spróbuj dać oba kody jednocześnie tzn. najpierw kod z bibliotek, a zaraz potem swój fragment kodu.
    Jeżeli program zadziała, tzn. że czegoś w swoim kodzie nie ustawiasz, o czymś zapominasz, jeśli nie zadziała, tzn. że twój kod "coś psuje".

    0
  • #15 06 Cze 2012 20:44
    szefkozak
    Poziom 11  

    Jado_one, wychodziłoby na to, że faktycznie czegoś nie robię bo wstawiając obydwa kawałki kodu przykład działa. Naprawde nie wiem co mógłbym opuścić bo starałem sie robić wszystko nawet w tej samej kolejności, czyściłem najpierw OSPEEDR itp. Próbowałem nawet wstawiac opóźnienia czasowe i nic..
    Próbowałem podmieniać inne fragmenty kodu na swoje i sypało sie tylko wtedy, gdy podmieniałem funkcje GPIO_Init(), reszta przechodziła bez problemów. Podczas debugowania program zawiesza się na sprawdzaniu flagi w funkcji:

    Code:

    FlagStatus ETH_GetSoftwareResetStatus(void)
    {
      FlagStatus bitstatus = RESET;
      if((ETH->DMABMR & ETH_DMABMR_SR) != (uint32_t)RESET)
      {
        bitstatus = SET;
      }
      else
      {
        bitstatus = RESET;
      }
      return bitstatus;
    }


    Nie mam pojęcia w jaki sposób to może być ze sobą powiązane

    0
  • #16 06 Cze 2012 21:08
    Freddie Chopin
    Specjalista - Mikrokontrolery

    A jakbyś np skorzystał z funkcji konfiguracji pinów z mojego przykładu dla STM32F4 - http://www.freddiechopin.info/pl/download/category/6-przyklady ? To wtedy będzie działać czy też nie? <:

    Może w erracie jakąś ciekawostkę znajdziesz?

    4\/3!!

    0
  • #17 06 Cze 2012 23:29
    Jado_one
    Poziom 22  

    Ta funkcja generalnie wygląda tak:

    Kod: c
    Zaloguj się, aby zobaczyć kod


    Może trzeba przeanalizować i poszukać różnic.....
    To co ja widzę, to wszystkie rejestry są ustawiane kombinacją najpierw &=, a potem |=

    0
  • #18 06 Cze 2012 23:47
    stanleysts
    Poziom 27  

    no ale kolega robi dokladnie to samo, tylko ze nie zeruje najpierw odpowiednich bitow rejestrow , ktore i tak ustawia od razu na zero, wychodzi na to samo w zasadzie, ja to sprawdzilem i sie roznic nie doszukalem, ale jestem kiepski wiec moze :D

    0
  • #19 07 Cze 2012 15:21
    szefkozak
    Poziom 11  

    Niestety nic nie działa, nawet twoje funkcje Freddie... Nie wiem co sie dzieje, czuję się tak jak gdybym cofnął się w rozwoju do zera..
    Poniżej zamieszczam linka do tego felernego przykładu, może moja obecność psuje ten kod i u kogoś innego zadziała. Podmieniany fragment jest wykomentowany i znajduje się w funkcji ETH_GPIO_Config() w pliku stm32f4x7_eth_bsp.c

    Tak czy siak dzieki wszystkim za rady.

    0
  Szukaj w 5mln produktów