Skocz do zawartości

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


juras

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;
}
}
}
}
Link do komentarza
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.

Link do komentarza
Share on other sites

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.