Skocz do zawartości

[stm32]Problem Komunikacia UART z PC Przerwania


Qpa

Pomocna odpowiedź

Cześć,
Nie dawno zacząłem przygodę z STM32. I mam duży problem nad którym siedzę już parę dni. Chciałem stworzyć prostą komunikację z komputerem gdzie przez terminal odpowiednimi komendami będzie można gasić i zapalać diody i w drugą stronę przesyłać które diody są zapalone.

nie wiem gdzie jest tu błąd więc

Ustawienie GIPO

void GPIO_Conf(void)

{

GPIO_InitTypeDef GPIO_InitStructure;

// Konfiguracja PB

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_11 | GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_Init(GPIOB, &GPIO_InitStructure);

// Konfiguracja PA0

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_Init(GPIOA, &GPIO_InitStructure);

// Konfiguracja PA9 jako Tx

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);

GPIO_ResetBits(GPIOB, GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_11 | GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15);

GPIO_SetBits(GPIOB, GPIO_Pin_8| GPIO_Pin_10);

}

Konfiguracja NIVC

void NVIC_Conf(void)

{

NVIC_InitTypeDef NVIC_InitStructure;

#ifdef VECT_TAB_RAM

// Jezeli tablica wektorow w RAM, to ustaw jej adres na 0x20000000

NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0);

#else // VECT_TAB_FLASH

// W przeciwnym wypadku ustaw na 0x08000000

NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);

#endif

// Wybranie grupy priorytetów

NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);

// Wlacz przerwanie od USART1

NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;

NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;

NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;

NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;

NVIC_Init(&NVIC_InitStructure);

}

#ifdef DEBUG

void assert_failed(uint8_t* file, uint32_t line)

{

while (1);

}

#endif

Konfiguracja UART

USART_InitStructure.USART_BaudRate = 9600;

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_TXE, DISABLE);

USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);

USART_Cmd(USART1, ENABLE);

Obsługa przerwan

extern uint8_t odebrano_polecenie, RxBuf[], TxBuf[], RxIndex , TxIndex;

void USART1_IRQHandler(void)

{

if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)

{

RxBuf[RxIndex++] = USART_ReceiveData(USART1);

if(RxBuf[RxIndex-1] == 0x0D)

{

odebrano_polecenie = 1;

RxIndex = 0;

}

USART_ClearITPendingBit(USART1, USART_IT_RXNE);

}

if(USART_GetITStatus(USART1, USART_IT_TXE) != RESET)

{

USART_SendData(USART1, TxBuf[TxIndex++]);

USART_ClearITPendingBit(USART1, USART_IT_TXE);

if(TxBuf[TxIndex-1] == 0x0D)

{

USART_ITConfig(USART1, USART_IT_TXE, DISABLE);

TxIndex = 0;

}

USART_ClearITPendingBit(USART1, USART_IT_TXE);

}

}

Jeszcze dodam że używam zestawu startowego ZL27ARM z STM32F103VBT6 sklep Kamami

A program jest w większości z listingu z ksiązki STM32 w Praktyce Pana Paprockiego lecz niestety program nie działał (nawet diody miał gdzie indziej)

Jeśli macie działający program UART na przerwaniach to bardzo proszę o podzielenie się nim e-mail cool_kuba@tlen.pl

Link do komentarza
Share on other sites

Nie dałeś całego kodu.

Włączyłeś zegar do UART?

Nie używałem go jeszcze, ale powinno to być coś w stylu

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOC | RCC_APB2Periph_AFIO, ENABLE);

(kod z przykładu książkowego)

Co do książki to niestety jest fatalnie napisana. Bardziej zagmatwać tego autor nie mógł. Podaje kod i gdzieś na początku jest wywołanie funkcji konfiguracyjnej zegary, ale tej już w książce nie znajdziesz.

Polecam ściągnąć pełne listingu programów z http://www.btc.pl/pliki/stm32wp.zip

Link do komentarza
Share on other sites

tak zegary są włączone. A właśnie z tą pełną wersją się męczę bo niby te programy są napisane na ten zestaw który ja posiadam i przetestowane ale to nie może być prawdą ponieważ ktoś kto to pisał pomylił nawet port z diodami^^ i to nie jest jedyny błąd... bo jak to naprawiłem to nadal nie działa później doszłem jeszcze do tego że ktoś nie dodał

USART_ClearITPendingBit(USART1, USART_IT_RXNE);

A nie wiecie czasem gdzie mozna znaleść opis tej całej biblioteki tylko troche dokładniejszy czyli w pomocy mogę znaleść że

GPIO_Mode_Out_PP = 0x10,
a ja chciał bym wiedzieć co to znaczy czyli jak ustawiam wyjście jeśli teraz chciał bym to zrobić to muszę zaglądnąć do dokumentacji i sprawdzić co oznacza 5 bit któregoś tam rejstru a to droga trochę na około

no ale dzięki za odpowiedź jak by ktoś miał program wykorzystujący przerwania do komunikacji UART to bardzo prosze o podzielenie się lub o maila może sam znajdę problem A program to

stm32f10x_it.h

stm32f10x_it.c

stm32f10x_conf.h

main.c

Link do komentarza
Share on other sites

Całą bibliotekę wraz z dokumentację znajdziesz na stronie producenta STM32F10x_StdPeriph_Lib. ST daje też sporo przykładów. Osobiście z nich głównie jechałem jak pisałem obsługę peryferii. Podstawą jest również dokumentacja i errata do układu.

Co do kodu, to większego błędu nie znalazłem. Wygląda, że zegary, USART i GPIO konfigurowane są poprawnie. U siebie mam tak samo i działa, tylko że ja gadam nie z kompem, tylko z innym układem przez USART.

Nie sprawdzałem natomiast, czy zgadzają się używane przez ciebie piny ze schematami.

Spróbuj zrobić sobie echo na procku. Jak odbierzesz znak, od razu wysyłaj go z powrotem. Wtedy będziesz wiedział, czy masz jakąkolwiek komunikację.

Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

To nawet nie jest opis tylko przykłady. Ta biblioteka to jakaś porażka. Pisanie z tą biblioteką jak dla mnie komplikuje pisanie na stm32. Program przepisywałeś ręcznie czy skopiowałeś z przykładów? Nawet wysyłanie do komputera nie działa?

Link do komentarza
Share on other sites

To nawet nie jest opis tylko przykłady. Ta biblioteka to jakaś porażka. Pisanie z tą biblioteką jak dla mnie komplikuje pisanie na stm32. Program przepisywałeś ręcznie czy skopiowałeś z przykładów? Nawet wysyłanie do komputera nie działa?

Jest to program z książki STM32 w Praktyce lecz niestety przykład był zawalony zupełnie i ja starałem się go doprowadzić do działania lecz mi się nie udało.

...

Co do kodu, to większego błędu nie znalazłem. Wygląda, że zegary, USART i GPIO konfigurowane są poprawnie. U siebie mam tak samo i działa, tylko że ja gadam nie z kompem, tylko z innym układem przez USART.

Nie sprawdzałem natomiast, czy zgadzają się używane przez ciebie piny ze schematami.

Spróbuj zrobić sobie echo na procku. Jak odbierzesz znak, od razu wysyłaj go z powrotem. Wtedy będziesz wiedział, czy masz jakąkolwiek komunikację.

Czy mógł byś mi wysłać swój program. Lub przynajmniej fragmenty interesuje mnie konfiguracja NVIC Konfiguracja USART oraz obsługa przerwań jeśli nie jest to problem to bardzo proszę

Dzięki za odpowiedzi pozdro!

Link do komentarza
Share on other sites

@marcelix: zgodzę się, że te biblioteki są trochę niedopracowane, ale w większości przypadków nie miałem problemu z ich stosowaniem. Dokumentacja biblioteki nie wyczerpuje całego tematu, bo musiałaby w sobie zawierać całą dokumentację do STM32. Tylko w takiej formie możliwe byłoby poznanie co jest dokładnie do czego. Dlatego napisałem, że podstawą jest dokumentacja układu.

@Qpa: podeśle ci odpowiednie fragmenty kodu, niestety dopiero jutro wieczorem. Chociaż nie widziałem znaczących różnic pomiędzy moim, a tym co ty napisałeś. Przede wszystkim, spróbuj najpierw ustalić, czy cokolwiek odbierasz od kompa. Dopiero potem zabierz się za przetwarzanie odebranych znaków.

  • Pomogłeś! 1
Link do komentarza
Share on other sites

@Qpa: podeśle ci odpowiednie fragmenty kodu, niestety dopiero jutro wieczorem. Chociaż nie widziałem znaczących różnic pomiędzy moim, a tym co ty napisałeś. Przede wszystkim, spróbuj najpierw ustalić, czy cokolwiek odbierasz od kompa. Dopiero potem zabierz się za przetwarzanie odebranych znaków.

Super dzięki wielkie. A tak odbieranie i nadawanie działa ale gdy robię to nie na przerwaniach a ja właśnie chciałem to spróbować zrobić na przerwaniach ale rzeczywiście może warto spróbować.

P.S. Na razie nie otrzymałem maila.; )

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.