logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

STM32 UART odbiera tylko jeden bajt z dwóch przychodzących

Bruum 20 Maj 2011 23:44 2178 6
REKLAMA
  • #1 9528440
    Bruum
    Poziom 23  
    Posty: 818
    Pomógł: 29
    Ocena: 54
    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ć?
  • REKLAMA
  • REKLAMA
  • #3 9529511
    Bruum
    Poziom 23  
    Posty: 818
    Pomógł: 29
    Ocena: 54
    Witam!
    Fragmenty kodu:
    
    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);	
    	
    





    
    
      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.
  • REKLAMA
  • #4 9529848
    mario06
    Poziom 15  
    Posty: 97
    Pomógł: 15
    Ocena: 50
    Czy ten zapis jest koniecznie potrzebny: USART1->SR=0x80;. Powinno działać bez ingerencji w rejestr SR w przerwaniu.
  • REKLAMA
  • #5 9529868
    Bruum
    Poziom 23  
    Posty: 818
    Pomógł: 29
    Ocena: 54
    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.
  • #6 9538340
    Konto nie istnieje
    Konto nie istnieje  
  • #7 9538381
    Bruum
    Poziom 23  
    Posty: 818
    Pomógł: 29
    Ocena: 54
    Witam i dziękuję za zinteresowanie.
    Temat ogarnięty. Gdzieś tam bruździło "echo" przerwania od tx. Inaczej zrobione wysyłanie pomogło.

Podsumowanie tematu

✨ Użytkownik zgłosił problem z odbiorem danych przez UART w mikrokontrolerze STM32, gdzie tylko jeden bajt jest poprawnie odbierany z dwóch wysyłanych przez zewnętrzne urządzenie. Po analizie kodu i konfiguracji USART, zasugerowano sprawdzenie obsługi przerwań oraz ewentualnych błędów transmisji. Użytkownik odkrył, że problem był spowodowany nieprawidłowym zarządzaniem przerwaniami od TX, co zostało naprawione poprzez zmianę sposobu wysyłania danych.
Podsumowanie wygenerowane przez AI na podstawie treści dyskusji.
REKLAMA