Skocz do zawartości

Pierwsze kroki z stm32, po GPIO czas na USART


qwee

Pomocna odpowiedź

Ciąg dalszy poznawania STMa. Po udanym ogarnięciu SysTick i GPIO przyszedł czas na USART. Jako że to ustrojstwo operuje na napięciu 3,3V nie mam za bardzo jak przesyłać danych do konsoli - może max3232 rozwiąże problem, ale to już nie dziś, wymyśliłem sobie, że po prostu połączę piny Rx i Tx i to co wyślę natychmiast odbiorę i wyśietle sobie na LCD. Jak pomyślałem tak zrobiłem i jak zawsze nie działa. Na początku chciałbym bez wydziwnień z przerwaniami zrobić taki manewr. Może niedziała dlatego, że jest to niedopuszczalne a może dlatego, że coś źle ustawiam, więc zanim zacznę kombinować inne odbiorniki chciałbym aby ktoś sprawdził czy dobrze konfiguruję USART.

#include <stm32f4xx_rcc.h>
#include <stm32f4xx_gpio.h>
#include <stm32f4xx_usart.h>
#include <misc.h>
#include "system_stm32f4xx.h"
#include "hd44780.h"
#include <stdio.h>


int main(void)
{
SystemInit();
unsigned int a ;
SystemCoreClockUpdate();
a = SystemCoreClock;
 if (SysTick_Config(SystemCoreClock/100 ))
	   {
	      while (1){};
	   }
 SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK);

 LCD_Initialize();


 RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE);
 GPIO_InitTypeDef GPIO_InitStructure;
 GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF;
 GPIO_InitStructure.GPIO_OType=GPIO_OType_PP;
 GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
 GPIO_InitStructure.GPIO_Pin=GPIO_Pin_9;
 GPIO_Init(GPIOA,&GPIO_InitStructure);



 GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN;
 GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_NOPULL;
 GPIO_InitStructure.GPIO_Pin=GPIO_Pin_10;
 GPIO_Init(GPIOA,&GPIO_InitStructure);

 GPIO_PinAFConfig(GPIOA,GPIO_PinSource10,GPIO_AF_USART1);
 GPIO_PinAFConfig(GPIOA,GPIO_PinSource9,GPIO_AF_USART1);

 RCC_AHB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);
 USART_InitTypeDef USART_InitStructure;

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

 USART_Cmd(USART1,ENABLE);

while(1)
{
LCD_WriteText("              ");
USART_SendData(USART1,1);
int c=USART_ReceiveData(USART1);
char tekst[10];
sprintf(tekst,"%d",c);

	LCD_GoTo(0,0);

	LCD_WriteText(tekst);


}
}

czy taka konfiguracja USART jest wystarczająca?

Link do komentarza
Share on other sites

Witaj,

moje spostrzeżenia/uwagi:

1. Jeżeli chcesz na prawdę zrozumieć działanie procka to najbardziej profesjonalnie będzie zrezygnować z użycia biblioteki StdPeripth i spróbować oprzeć się na samym reference manual'u. Oczywiście jest to bardziej czasochłonne, ale daje kontrolę nad wszystkim co robi procesor, no i programy są bardziej wydajne.

2. Jeżeli wolałbyś zostać przy wykorzsytaniu biblioteki, to może warto przyjrzeć się przykładom zapewnianym przez ST? TUTAJ masz do ściągnięcia całą bibliotekę, gdzie w katalogu Project/STM32F4xx_StdPeriph_Examples masz sporo przykładów, w jaki sposób skonfigurować dane peryferia w określony sposób.

3. Moim zdaniem, Twoja pętla while jest nieprawidłowa z kilku względów.

A) Po pierwsze: warto dodać jakiś delay po zakończeniu sekwencji (ludzkie oko ma pewną bezwładność i zupełnie wystarczająca jest ilość 25 klatek/wyświetleń na sekundę, więc możesz robić całą procedurę co 40ms).

B) Następnie, popatrz, że zapisujesz do wysłania liczbę 1, co oznacza, że HD44780 będzie chciał wyświetlić znak z tablicy ASCII o numerze 1 -- w ogóle nie zostanie to wyświetlone. Spróbuj wysłać liczbę na przykład 49 (czyli ta Twoja jedynka w tablicy ASCII).

C) Popatrz, że zapisujesz do wysłania jakąś daną. Ona zostaje wpisana w rejestr DR i zanim zostanie wysłana minie troszkę czasu (a dokładnie 1s / 9600 ≈ 1ms), a Twój program nie daje możliwości poczekania na odebranie tej danej: od razu przechodzi do komendy odbioru. Spróbuj tutaj również dać delay (na przykład 2ms dla pewności). A najlepszym pomysłem jest w ogóle obsłużenie tego za pomocą przerwań tak jak jest to pokazane w egzamplach biblioteki.

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

×
×
  • 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.