Skocz do zawartości

[stm32]Problem Komunikacia UART z PC Przerwania


Pomocna odpowiedź

Napisano

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 [email protected]

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

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

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

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?

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!

@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

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

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