Mam dziwny problem z UART na F103

Tu możesz pisać o swoich problemach z pisaniem programów w języku C/C++ dla STM.
Awatar użytkownika
squeez
User
User
Posty: 211
Rejestracja: czwartek 04 lut 2016, 10:13

Mam dziwny problem z UART na F103

Postautor: squeez » sobota 11 lut 2017, 10:50

Płytka Nucle F103.
prosty kod do wysyłania\odbierania pojedynczych znaków,

Kod: Zaznacz cały

#include "stm32f103xb.h"
#include "uart.h"

char UsartRX[3];

void USART_init(void)
{
   RCC->APB2ENR |= RCC_APB2ENR_USART1EN;
   GPIOA->CRH |= GPIO_CRH_CNF9_1 | GPIO_CRH_CNF10_0 | GPIO_CRH_MODE9_1;
   GPIOA->CRH &= ~(GPIO_CRH_CNF9_0 | GPIO_CRH_MODE9_0 | GPIO_CRH_CNF10_1);

   USART1->BRR = 8000000/9600;
   USART1->CR1 = USART_CR1_UE | USART_CR1_RXNEIE | USART_CR1_TE | USART_CR1_RE;

   NVIC_EnableIRQ( USART1_IRQn );
}

void USART_send( char c )
{
   USART1->DR = c;
}

void USART1_IRQHandler(void)
{
   // Odebrane dane w buforze
   if( USART1->SR & USART_SR_RXNE )
   {
         UsartRX[1] = USART1->DR;
         GPIOA->ODR ^= GPIO_ODR_ODR5;
   }
}


Wysyłanie działa poprawnie wysyła jak trzeba, problem jest z odbiorem ciągle dostaję krzaki, próbowałem 3 przejściówek RS232/USB, na każdej to samo.
Wczoraj w nocy przesiedziałem nad tym kilka godzin (głównie z mojego gapstwa, bo odpalałem to na UART2 na początku a ten na nucle jest połączony ze zintegrowaną przejściówką i niewiedzieć czemu na wyprowadzeniach nie miałem sygnałów (żadnych).

Ale potem doszedłem do tego i odpaliłem zarówno na UART1 jaki i UART2 ale w czym problem. Jak wspomniałem wysyłka z F103 działa poprawnie, krzaki są na RX.
W końcu odpaliłem debuger żeby podejrzeć rejestry i zmienne. I co się okazuje przy obieraniu zawsze jest ustawiony ostatni bit w rejestrze czyli np. wysyłam bat w postaci 0b00110110 a w rejestrze odbiorczym jest 0b10110110, jak dodam w przerwaniu gdzie mam przypisanie wartości z rejestru do zmiennej maskowanie tego bitu wówczas jest OK

Kod: Zaznacz cały

UsartRX[1] = USART1->DR & 0x7F;


Tylko kurka dlaczego tak jest. Z ustawianiem terminala przy wysłaniu już kombinowałem na różne sposoby VT100, ASCII, ramka jest ustawiona 8N1 czyli poprawnie, zresztą jak było by błędnie to wysyłanie z F103 też by źle działało a jest poprawnie.
Próbowałem też różnych terminali minicom, picocom, putty zawsze to samo.

A wyjaśnienie odbierany znak wpada do 2 elementu tablicy bo w pierwszym wstawiam to co wysyłam, żeby mieć porównanie wartości.

Awatar użytkownika
Antystatyczny
Geek
Geek
Posty: 1168
Rejestracja: czwartek 03 wrz 2015, 22:02

Re: Mam dziwny problem z UART na F103

Postautor: Antystatyczny » sobota 11 lut 2017, 11:27

Przejrzałem swoje bazgroły dotyczące usartów w STM32 i nie zauważyłem w nich, bym musiał maskować MSB danej pobranej z rejestru DR. Na bit ten może wpływać ustawienie parzystości, choć u Ciebie widzę, że parzystość jest wyłączona. Sprawdź, proszę, czy Twój kompilator traktuje char jako unsigned, ewentualnie korzystaj z uint8_t. Sprawdź również, czy masz włączony pull up na liniach RX i TX. Wiem, że bez tego działy mi się jakieś cuda.

Przede wszystkim jednak zmieniłbym typ UsartRX na unsigned char lub uint8_t. Nie daje mi to spokoju.
"The true sign of intelligence is not knowledge but imagination" Albert Einstein.

Awatar użytkownika
squeez
User
User
Posty: 211
Rejestracja: czwartek 04 lut 2016, 10:13

Re: Mam dziwny problem z UART na F103

Postautor: squeez » sobota 11 lut 2017, 11:49

Wejście mam jako float (bez podciągania, tak chyba było w RM), ze zmienną już kombinowałem dawałem unsigned char ale to samo tzn reprezantacja się zmieniła (zakres 0-255) ale MSB nadal był ustawiony.

Sprawdzę z pullupem jak będzie.

-- EDIT --
Sprawdziłem przy wymuszeni polaryzacji lini nic sie nie dzieje, tzn nic nie odbiera.
Zmiana typu zmiennej na uint8_t nic nie daje, w akcie desperacji dodałem nawet volatile, też bez skutku :(

Awatar użytkownika
squeez
User
User
Posty: 211
Rejestracja: czwartek 04 lut 2016, 10:13

Re: Mam dziwny problem z UART na F103

Postautor: squeez » sobota 11 lut 2017, 12:21

W debugerze sprawdzałem rejestry i wyglądają OK
debuger.png
Nie masz wymaganych uprawnień, aby zobaczyć pliki załączone do tego posta.

Awatar użytkownika
foreste
User
User
Posty: 113
Rejestracja: niedziela 06 wrz 2015, 19:53
Kontaktowanie:

Re: Mam dziwny problem z UART na F103

Postautor: foreste » sobota 11 lut 2017, 13:16

A zobacz czy masz kompilatorze ustawione newlibs support float i scanf umnie przy float print nie pokazywał jak miałem newlib bez supportu dla float i scanf,sprawdż na danych typu int czy to samo masz wtedy moja rada miała sens.
♫,♫.¨♫

Awatar użytkownika
squeez
User
User
Posty: 211
Rejestracja: czwartek 04 lut 2016, 10:13

Re: Mam dziwny problem z UART na F103

Postautor: squeez » sobota 11 lut 2017, 13:23

Hmm jeżeli chodzi o ustawienia linkera:

Kod: Zaznacz cały

-T STM32F1_ROM.ld -nostartfiles -Xlinker --gc-sections -L"../linker" -Wl,-Map,"F103.map" --specs=nano.specs


Ostatni marametr w opise "Use newlib-nano", u_printf_float i u_scanf_float mam niezaznaczone.

Awatar użytkownika
foreste
User
User
Posty: 113
Rejestracja: niedziela 06 wrz 2015, 19:53
Kontaktowanie:

Re: Mam dziwny problem z UART na F103

Postautor: foreste » sobota 11 lut 2017, 13:30

To ustaw jako aktywny bo dane printf(%f, zmienna float) nie będzie wyświetlana .
♫,♫.¨♫

Awatar użytkownika
squeez
User
User
Posty: 211
Rejestracja: czwartek 04 lut 2016, 10:13

Re: Mam dziwny problem z UART na F103

Postautor: squeez » sobota 11 lut 2017, 13:33

a tak z ciekawości to jakie ma to znaczenie jak nie używam funkcji printf i scanf?

PS. jak zanaczę te opcje to dostaję błąd:

Kod: Zaznacz cały

collect2: error: ld returned 1 exit status
make: *** [F103.elf] Błąd 1
makefile:42: polecenia dla obiektu 'F103.elf' nie powiodły się
Ostatnio zmieniony sobota 11 lut 2017, 13:34 przez squeez, łącznie zmieniany 1 raz.

Awatar użytkownika
Antystatyczny
Geek
Geek
Posty: 1168
Rejestracja: czwartek 03 wrz 2015, 22:02

Re: Mam dziwny problem z UART na F103

Postautor: Antystatyczny » sobota 11 lut 2017, 13:34

Żadnego. problem widać już w rejestrze.
"The true sign of intelligence is not knowledge but imagination" Albert Einstein.

Awatar użytkownika
squeez
User
User
Posty: 211
Rejestracja: czwartek 04 lut 2016, 10:13

Re: Mam dziwny problem z UART na F103

Postautor: squeez » sobota 11 lut 2017, 13:35

Antystatyczny pisze:Żadnego. problem widać już w rejestrze.



Gdzie? kurka porównywałem to z RM i wydaje mi się dobrze, no poza BRR bo tam ten wzór jakiś skopany jest

Awatar użytkownika
Antystatyczny
Geek
Geek
Posty: 1168
Rejestracja: czwartek 03 wrz 2015, 22:02

Re: Mam dziwny problem z UART na F103

Postautor: Antystatyczny » sobota 11 lut 2017, 13:38

Widać już w rejestrze, czyli w DR. Masz zaświecony siódmy bit (a właściwie bit nr 7), a przecież ma być zgaszony. Cały czas przeglądam RM, ale jakoś nie dostrzegam błędów w konfiguracji. Ustawienia związane z printf i scanf nie mają w tym przypadku żadnego znaczenia, bo operujemy wprost na rejestrach i nie posługujemy się tu funkcjami wbudowanymi do prezentacji danych.
"The true sign of intelligence is not knowledge but imagination" Albert Einstein.

Awatar użytkownika
squeez
User
User
Posty: 211
Rejestracja: czwartek 04 lut 2016, 10:13

Re: Mam dziwny problem z UART na F103

Postautor: squeez » sobota 11 lut 2017, 14:22

No właśnie to co mówiłem że ostatni bit W rejestrze DR jest ustawiony, dlatego jak go zamaskuję wówczas działa poprawnie ale to nie tędy droga że tak powiem :) tym bardzie że w protokole komunikacji potrzebuję wszystkie 8 bitów :)

Sprawdziłem rejestr zaraz po resecie i jak nie prześlę zadnego znaku to jest równy 0, wyłączyłem nawet nadawania zostawiłem sam odbiór i nadal to samo po nadejściu jakiegokolwiek znaku ustawiany jest MSB w rejestrze DR.

Zaczynam się zastanawiać czy może coś z synchronizacją nie jest skopane, sprawdzę na innych prędkościach i zmienię taktowanie procesora.
Ostatnio zmieniony sobota 11 lut 2017, 14:28 przez squeez, łącznie zmieniany 1 raz.

Awatar użytkownika
squeez
User
User
Posty: 211
Rejestracja: czwartek 04 lut 2016, 10:13

Re: Mam dziwny problem z UART na F103

Postautor: squeez » sobota 11 lut 2017, 14:29

Sprawdzałem w minicom, picocom, putty wszędzie to samo. A bitu parzystości nie mama, jest ustawione domyślnie czyli 8N1

--- EDIT ---

Zmieniałem prędkość transmisji, zmieniłem taktowanie z 8Hhz na 16MHz nic to nie zmieniło, cały czas odbiera z ustawionym MSB, nadawnaie jest poprawne.
Ostatnio zmieniony sobota 11 lut 2017, 14:44 przez squeez, łącznie zmieniany 1 raz.

Awatar użytkownika
dambo
Expert
Expert
Posty: 645
Rejestracja: czwartek 17 mar 2016, 17:12

Re: Mam dziwny problem z UART na F103

Postautor: dambo » sobota 11 lut 2017, 14:30

Ale domyślnie jest 8n1 więc niepowinno dodawać parzystości do rejestru odbiorczego. Może uruchom z ciekawości przerwania od błędu komunikacji i zobacz, czy tam wchodzi.
Nowy blog o tematyce embedded -> https://www.embedownik.pl/

Awatar użytkownika
squeez
User
User
Posty: 211
Rejestracja: czwartek 04 lut 2016, 10:13

Re: Mam dziwny problem z UART na F103

Postautor: squeez » sobota 11 lut 2017, 23:53

Sprawdziłem ze zgłoszeniem przerwania błędu i nic, żadne przerwanie błędu nie występuje.
Kombinowałem z ramką i jak ustawie 8bit + parzystość (czyli ramka ma 9 bitów) wówczas część transmisji przebiega poprawnie ale tylko cześć.
Kombinacja z bitami stopu nic nie dała.

Jestem trochę w czarnej d.... z tym :/ sprawdzę jutro na F100 jak tam będzie to działać.

Awatar użytkownika
squeez
User
User
Posty: 211
Rejestracja: czwartek 04 lut 2016, 10:13

Re: Mam dziwny problem z UART na F103

Postautor: squeez » niedziela 12 lut 2017, 12:08

Zainstalowałem Atolic True Studio wrzuciłem kod, skompilowałem i to samo, objawy dokłądnie takie same, podgląd w debugerze to potwierdził, bit numer 7 w rejestrze DR zawsze ma wartość 1, nie ważne jaki kod wysyłam.
Nadawanie naturalnie działa poprawnie.

Więc nie wiem co jest nie tak, zobaczę jeszcze skompiluję prostą obsługę UARTA na HAL-u i zobaczę jak tam będzie to wyglądać, tylko muszę znaleźć jakiś opis jak tego HAL-a tam "wsadzić" bo nic nie robiłem na bibliotekach :P

Awatar użytkownika
squeez
User
User
Posty: 211
Rejestracja: czwartek 04 lut 2016, 10:13

Re: Mam dziwny problem z UART na F103

Postautor: squeez » niedziela 12 lut 2017, 12:20

Część transmisji to znaczy że cześć znaków wprowadzanych z klawiatury przechodziła poprawnie a cześć nie, zapewne wynika to z obliczania bitu parzystości, który czasami ma wartość 1 a czasami nie.

Awatar użytkownika
squeez
User
User
Posty: 211
Rejestracja: czwartek 04 lut 2016, 10:13

Re: Mam dziwny problem z UART na F103

Postautor: squeez » sobota 18 lut 2017, 17:18

Odpaliłem na HAL-u prosty kod, miganie diodą co 1s do tego odbieranie i wysyłanie danych i ... działa. Tzn odbiera poprawnie dane.

Podejżałem ustawienia rejestrów i jedyna różnica jest taka że dodatkowo jest ustawione przerwanie od błędów. Funkcje HAL są bardziej skompilowane (sprawdzanie bitu IDLE, błędów itp.) niż moje łopatologiczne ale nie zmienia to faktu że tam nie ma przekłamań a u mnie są.

Fakt że w kodzie mam jeszcze obsługę I2C z DMA i dla I2C1 i UART2 DMA ma ta same kanały (choć ja nie używam DMA dla UART), ale w desperacji wyłączyłem obsługę I2C1 ale to i tak nic nie dało.

Sprawdzę jeszcze prosty kod sam UART beż innych dodatków ... może tu coś się zmieni, bo powoli tracę pomysły co może być nie tak.
Fakt też, że przykład na HAL-u kompilowałem w TrueStudio (inny kompilator, flagi przy kompilacji itp.) ale to już chyba zbyt głęboko idące oskarżenia :D

Awatar użytkownika
squeez
User
User
Posty: 211
Rejestracja: czwartek 04 lut 2016, 10:13

Re: Mam dziwny problem z UART na F103

Postautor: squeez » sobota 18 lut 2017, 23:12

Hurraaaa problem rozwiązany ale w życiu bym na to nie wpadł sam gdyby nie debuger i przykład z HAL-a.

Myśląc, że może coś nie tak z moim środowiskiem, które sam rozbiłem na Eclispe przeniosłem projekt do atolic ale tam to samo wiec zaczynałem wymieniać pliki z CMSIS moje na te z atolic ale to też nic nie dało. W końcu sproawdziłęm rejestry RCC jak je ustawił HAL z tymi jak ja ustawiłem. Było kilka różnic np. taka że HAL pomimo stawienia taktowania 16MHz szynę dla APB dzielił na 2 choć jak ja ustawiałęm taktowanie 8MHz to objawy miałem takie same ... co się okazało, muszę ustawić kalibrację dla HSI, mojego źródła taktowania PLL. w HAL-u był ustawiony ostatni 5 bit HSITRIM jak tak zrobiłem wszystko ruszyło jak trzeba, potem próbowałem innych wartości dla HSITRIM i nie jest ona jakoś mocno krytyczna bo jak ustawiłem tylko 2 bit to też chodziło poprawnie.

Ale kurka sam bym na to nie wpadł.

Awatar użytkownika
dambo
Expert
Expert
Posty: 645
Rejestracja: czwartek 17 mar 2016, 17:12

Re: Mam dziwny problem z UART na F103

Postautor: dambo » sobota 18 lut 2017, 23:18

czyli taktowałeś swój układ HSI i wynika z tego, ze to on bez kalibracji spowodował ten problem? A sprawdzałeś, czy przy ustawieniu HSE jest wszystko ok? na przyszłość może się przyda ta informacja
Nowy blog o tematyce embedded -> https://www.embedownik.pl/

Awatar użytkownika
squeez
User
User
Posty: 211
Rejestracja: czwartek 04 lut 2016, 10:13

Re: Mam dziwny problem z UART na F103

Postautor: squeez » sobota 18 lut 2017, 23:24

Na zewnętrznym nie sprawdzałem ale dla testów zobaczę i dam znać jak poszło.

PS. W sumie to troche moja wina bo w RM przeczytałem ze HSITRIM domyślnie ma wartość 16 a ja ostawiając rejestr w RCC zrobiłem

RCC->CR = ...
zamiast
RCC->CR |= ...


Wróć do „Programowanie STM w C/C++”

Kto jest online

Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 1 gość