Skocz do zawartości
Zaloguj się, aby obserwować  
juras

[STM32] STM32 - NUCLEO F411RE - problem z odbiorem danych przez USART

Pomocna odpowiedź

Witam,
próbowałem przećwiczyć moduł USART na zestawie NUCLEO F411RE. O ile wysyłanie ciągu bitów przebiegało bezproblemowo, napotkałem problem z odbieraniem czegokolwiek z terminala. Napisałem prosty program bazując na kursie STM z Forbota do wysyłania i odbierania danych i podczas próby wysłania odpowiednich znaków ("a","b",lub "c") nie otrzymuję oczekiwanej odpowiedzi. Sprawdziłem w karcie katalogowej czy skonfigurowałem odpowiedni bity do odbioru i to się zgadza. Czy ktoś móglby podpowiedzieć mi, lub naprowadzić mnie w czym może znajdować się problem? W załączniku zamieszczam kod programu i link do karty katalogowej z której korzystałęm. Dodam jeszcze, że korzytam z System Workbench for STM32. Z góry dziękuję za odpowiedź i pozdrawiam.

datasheet

#include "stm32f4xx.h"


int main(void)
{
void wyslij_znak(char c)
{
while (USART_GetFlagStatus(USART2,USART_FLAG_TXE)== RESET);
USART_SendData(USART2, c);
	}
void wyslij_ciag(const char* s)
{
	while(*s)
		wyslij_znak(*s++);
}

RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA|RCC_AHB1Periph_GPIOC, ENABLE);
USART_InitTypeDef uart;
GPIO_InitTypeDef gpio;
    GPIO_PinAFConfig(GPIOA, GPIO_PinSource2, GPIO_AF_USART2);

     GPIO_StructInit(&gpio);
     gpio.GPIO_Pin = GPIO_Pin_2;
     gpio.GPIO_Mode = GPIO_Mode_AF;
     GPIO_Init(GPIOA, &gpio);

     gpio.GPIO_Pin = GPIO_Pin_3;
     gpio.GPIO_Mode = GPIO_Mode_AF;
     GPIO_Init(GPIOA, &gpio);

     gpio.GPIO_Pin = GPIO_Pin_13;
     gpio.GPIO_Mode = GPIO_Mode_IN;
     GPIO_Init(GPIOC, &gpio);

     USART_StructInit(&uart);
     uart.USART_BaudRate = 9600;
     USART_Init(USART2, &uart);
     USART_Cmd(USART2, ENABLE);

while(1)
{
if (GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_13) == 0)
{
wyslij_ciag("znaki\r\n");
}
if (USART_GetFlagStatus(USART2, USART_FLAG_RXNE)){
	char c = USART_ReceiveData(USART2);
switch (c)
{
case 'a':
	wyslij_ciag("komunikat1");
	break;
case 'b':
	wyslij_ciag("komunikat2");
	break;
case 'c':
	wyslij_ciag("komunikat3");
	break;
}
}
}
}

Udostępnij ten post


Link to post
Share on other sites

Nie jestem ekspertem ale może w funkcji switch daj na końcu jeszcze "default" i wyslij_ciag© to zobaczysz czy w ogóle coś odbierasz i ewentualnie co.

Udostępnij ten post


Link to post
Share on other sites

Niestety nic to nie dało. Próbowałem też z odsyłaniem pojedynczego znaku z pomocą funkcji "wyslij_znak", również bez rezultatu.

Edit:

W wolnym czasie poszukałem trochę na necie i dzięki znalezionym informacjom znalazłem rozwiązanie. Dodałem komendy:

	     GPIO_PinAFConfig(GPIOA, GPIO_PinSource2, GPIO_AF_USART2);
     GPIO_PinAFConfig(GPIOA, GPIO_PinSource3, GPIO_AF_USART2);

Temat do zamknięcia.

Udostępnij ten post


Link to post
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

Zaloguj się, aby obserwować  

×
×
  • Utwórz nowe...