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

stm32 uart nie odbiera drugiego bajtu

20 Maj 2011 23:44 1923 6
  • Poziom 23  
    Witam!
    Mam kłopot z uartem w stm32. Wysyła ok, wchodzi w przerwanie od rx uarta i odczytuje jego DR zapisując do tablicy i zwiększając wskaźnik do tablicy żeby był gotowy na następne przerwanie ale ono właśnie nie wystepuje pomimo, że następny bajt przychodzi uartem.
    Systick co 100ms inicjuje wysłanie zapytania do zewnętrznego urządzenia i urządzenie odpowiada dwoma bajtami. I jak wyżej jeden jest odbierany a na drugi układ nie reaguje. Gdzie kopać?
  • Poziom 23  
    Witam!
    Fragmenty kodu:
    Code:

    USART_InitStructure.USART_BaudRate = 57600;
         USART_InitStructure.USART_WordLength = USART_WordLength_8b;
         USART_InitStructure.USART_StopBits = USART_StopBits_1;
         USART_InitStructure.USART_Parity = USART_Parity_No;
         USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
         USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;   
       
       USART_Init(USART1, &USART_InitStructure);

       USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
       USART_Cmd(USART1, ENABLE);

        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

         GPIO_Init(GPIOA, &GPIO_InitStructure);

         // Konfiguracja PA010 jako Rx
         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
         GPIO_Init(GPIOA, &GPIO_InitStructure);
       
       
       NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
         NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
         NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
         NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
         NVIC_Init(&NVIC_InitStructure);   
       





    Code:


      void USART1_IRQHandler(void)
    {
         if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
         {
           RxBuf[Sm.BUF] = (uint8_t)(USART1->DR & 0x01FF);       
          USART1->SR=0x80;   
          Sm.BUF=1;

        Liczas++ ;
       
         }


    Liczas to pomocnicza zmienna informująca o wykonaniu obsługi przerwania. Jako, że cała procedura jest uruchamiana co 100ms po szybkości inkrementacji widać czy przerwanie wykonuje się raz czy wiecej na te 100ms.
    Wyglądać ma tak:
    systick> wysłanie bajtu>Sm.BUF=0>odbiór 1 bajtu>Sm.BUF=1>odbiór 2 bajtu.
    a chodzi tak:
    systick> wysłanie bajtu>Sm.BUF=0>odbiór 1 bajtu>Sm.BUF=1

    nie wchodzi w drugie przerwanie.
  • Poziom 15  
    Czy ten zapis jest koniecznie potrzebny: USART1->SR=0x80;. Powinno działać bez ingerencji w rejestr SR w przerwaniu.
  • Poziom 23  
    mario06 napisał:
    Czy ten zapis jest koniecznie potrzebny: USART1->SR=0x80;. Powinno działać bez ingerencji w rejestr SR w przerwaniu.


    Witam!
    Pewnie masz rację bo z nim i bez niego tak samo nie działa dobrze.
    Nie jestem pewien, czy debugger mnie nie oszukuje odnośnie zawartości rejestrów, ale odczyt rejestru danych nie powoduje jego wyczyszczenia, jak chyba być powinno? Dopiero wysłanie bajtu "czyści" usarta i odbiera on jeden bajt.
  • Użytkownik usunął konto  
  • Poziom 23  
    Witam i dziękuję za zinteresowanie.
    Temat ogarnięty. Gdzieś tam bruździło "echo" przerwania od tx. Inaczej zrobione wysyłanie pomogło.