Skocz do zawartości

Pierwsze kroki z stm32, po GPIO czas na USART


Pomocna odpowiedź

Napisano

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?

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.

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