Na wypadek, gdybyś nie zauważył: przy takich deklaracjach i treści procedury konfiguracji DMA, jakie masz obecnie, do rejestru adresu pamięci DMA wpisujesz wartość bajtową odczytaną z pamięci ze zmiennej TxBuf, rozszerzoną zerami do 32 bitów, czyli wysyłasz przez UART zawartość tablicy wektorów wyjątków.
To nie rozwiązuje problemu. Jeśli masz do skonfigurowania kilkadziesiąt pinów to dalej stoisz w tym samym miejscu - tracisz dużo czasu na klepanie konfiguracji dla GPIO. To rób konfigurację CubeMX a dostęp do GPIUO na rejestrach. Często używam tej metody nie tylko dla GPIO ale i dla USART, SPI. Transmisję realizuję swoimi funkcjami a init robię przez...
Zastanawiam się tylko po co sprawdzać to: [syntax=c]USART3 -> CR1 & USART_CR1_TCIE[/syntax] nie rozumiem powodu. Przecież to jest "This bit is set and cleared by software." Programista nie wie czy ustawił to przerwanie czy nie? Dodatkowo ten zapis: [syntax=c]if(( USART3 -> CR1 & USART_CR1_TCIE) && (USART3 -> SR & USART_SR_TC ))[/syntax] wygląda dość...
Chyba trzeba przestawić funkcję wybranych wyjść GPIO na linie interfejsu USART. Dla mnie mało czytelne są te gotowe biblioteki STM32. Sam wszystko robię na rejestrach.
W Twoim działającym przykładzie do rejestru wpisujesz adres tablicy ("&" może być albo może go też nie być - również zadziała wg mnie), natomiast w przykładzie niedziałającym najpierw do funkcji podajesz adres tej tablicy, a potem jeszcze raz wyciągasz adres tego adresu - żeby zaspokoić Twoje potrzeby kompilator zmienną tab umieszcza gdzieś na stosie...
Mam jakąś podstawowa bibliotekę z makrami peryferiów. Wiem że dane makro odpowiada bitowi w rejestrze statusowym i sprawdzam czy jest ustawione czy nie tą metodą zrobiłem już i2c i usart.
Przerwanie bym raczej właczył przed odpaleniem DMA. Odbiór przez DMA to raczej tylko w przypadku kiedy masz zawsze tę samą ilość danych. nie wiem jak w Twoim przypadku bo nic o tej "ramce" nie piszesz. Rozmiem że ma dokładnie 30 bajtów. Jezeli ma więcej lub mniej o choćby jeden bajt to Twój algorytm nie zadziała. - jezeli mniej np o 5 bajtów to odbierze...
To że w drugiej linijce ma znaczenie: [syntax=c] USART2->CR1 = USART_CR1_TE;// uruchomienie Tx USART2->CR1 = USART_CR1_UE;// zerowanie rejestru i ustawienie tylko tego bitu [/syntax]
Nie, no niewątpliwie masz rację, że jeśli chodzi o wydajność to szybciej jest bezpośrednio pisać po rejestrach ;) pozdrawiam Krzysiek
Jest to przejściówka "Konwerter CP2102 Niestety nie mam takiej pod ręką to nie obadam jaki ma pull up. Próbowałem z DATA rezystor 480ohm do 3.3V ale nie działało. To według mnie zdecydowanie zbyt niska oporność, jak na obciążenie fototranzystora w transoptorze. Spróbuj coś koło 4,7 - 15kΩ. Od biedy można by spróbować uruchomić wewnętrzny pull...
Dzięki freedi miałeś racje. Patrzyłem na kolejność przerwań w tabeli f0 ale nie na adresy. Aby zapełnić luki i poprzesuwać adresy dodałem brakujące reserved handler Dodano po 11 Teraz tylko muszę rozwiązać skąd mi przerwań multum nadchodzi i w nierównych odstępach od timera. Bo pwm wyprowadzone jest na jedną diodę a przerwanie zmienia stan innej diody....
Olej te ich dziwaczne wywody na temat obliczania wartości do rejestru odpowiedzialnego za baudrate i po prostu wpisz do tego rejestru wartość równą PRĘDKOŚĆ_ZEGARA_UART / BAUDRATE. Te całe zabawy w część stałą i ułamkową właśnie do tego się sprowadzają, chyba ktoś kto pisał dokumentację miał nadmiar fantazji. Wg tegoż BRR powinien być równy 6666 czyli...
Domyślnie są wyłączone, a co robi z nimi SPL - to już tajemnica jej twórców. Rozsądni ludzie nie korzystają z bibliotek typu SPL, a jeśli korzystają - to nie używają nadmiarowych wywołań, które mają za zadanie wpisać do rejestru to samo, co już tam jest. Poprawne zainicjowanie UART bez SPL - to jakieś 4..5 linijek kodu. ClearITpendingBit jest bez sensu...
Prawdopodobnie nie włączyłeś przerwania odbioru danych w USART - bit RXNEIE w rejestrze CR1. A poza tym . oczekiwanie w procedurze obsługi przerwania to nie jest dobry pomysł, a właśnie to robisz. Masz poniżej tablicę do zainicjowania USART z przerwaniem odbioru w STM32F0 - adresy rejestrów i ich zawartości - wychodzi to sporo krócej niż przy użyciu...
a czy da się to zrobić w bibliotece SPL? Zadam złośliwe pytanie - a czy da się sprawdzić w dokumentacji tej biblioteki albo w jej kodzie źródłowym? Przecież na pewno będzie szybciej niż pytać o to na forum, zwłaszcza że SPL jest już martwe i teraz ludzie albo używają HALa albo rejestrów. Zresztą - wystarczyłoby pewnie otworzyć odpowiedni plik nagłówkowy,...
Czy pamiętałeś o włączeniu portów w ODPOWIEDNIM rejestrze APBENR? volatile nie ma nic wspólnego z AVR. Tego atrybutu używa się np. wtedy, kiedy zmienna modyfikowana przez obsługę przerwania jest testowana przez inny fragment kodu. Pokaż kod procedury przerwania, bo coś tam narozrabiałeś.
Lepiej tak: void USART1_IRQHandler(void) { if (USART1->ISR & USART_ISR_TXE) { // jeśli zakończona wysyłka to coś... USART1->CR1 &= ~USART_CR1_TXEIE; // kasowanie flagi tak mi się wydaje że to to. } } A to jest źle każde przerwanie powinno wyglądać tak: [syntax=c] void XXXX_IRQHandler(void) { uint32_t isr; isr = XXX->ISR & XXX->IER; if( isr & flag)...
GPIOB->AFR Kod pisałem w oparciu do Reference Manual, oraz poradnik dostępny na tym forum Chyba nie do konca :) W poradniku masz napisane jak ustawic funkcje alternatywne. A w RM jak sobie skoczysz do dzialu GPIO i tam rejestry AFRL i H to masz tabelkę.
Przerwania, w odróżnieniu od starych ARMów są w całości zarządzane przez ARM'a czyli CortexMx. W dokumentacji ARM znajdziesz opisy rejestrów i jako to działa. Każdy producent, taki jak ST zmienia znaczenie linii przerwań, definiując je po swojemu za wyjątkiem kilku pierwszych zarezerwowanych przez ARM. Ponadto, Cortex'y mają możliwość nadania przerwaniom...
Może zbyt namieszałem. Zasadniczo chodzi po prostu o to jak stworzyć projekt w SW4STM, który nie zawierałby tych wszystkich śmieci z SPL i HAL i dało się pisać na rejestrach. Taki czysty podstawowy projekt pod rejestry z tylko niezbędnymi rzeczami jak w przypadku pisania na AVRy.
No ale jaki jest w ogóle sens tego kodu? 1. Najpierw czekasz na zmienną którą ustawiasz w tej samej funkcji i ponoć nie masz przerwań (choć w komentarzach coś niby o nich piszesz), to po co czekać? (nie mówiąc już o tym, że się nigdy nie doczekasz poza pierwszym razem [może], gdyż nigdzie tej zmiennej nie zerujesz przy braku problemów) 2. Potem kopiujesz...
Cześć, szukam pomocy w konfiguracji interfejsu USART2 na płytce STM32L476RG po rejestrach do komunikacji STM<->PC. Errorów brak, dane wg debuggera się wysyłają, jednakże w RealTermie kompletnie nic mi nie przychodzi. Próbowałem zgodnie z RM, z poradnikami z YT " Controllers Tech", z poradnikiem użytkownika " szczywronek " i nadal coś nie ogarniam...
Zauważyłeś że coś jest nie tak? Owszem. To co napisałem Ci ja i BlueDraco zaraz przedemną. W ramach podpowiedzi, dodam, że wartość rejestru GPIOA->AFR[1] po tych dwóch linijkach to `7<<2*4`, a nie spodziewane przez Ciebie `(7<<2*4) | (7<<1*4) | stara_wartość_rejestru`. Zastanów się sam dlaczego.
Zaczynam zabawę z stm32. Chciałbym obsłużyć USART przez przerwania. Większość przykładów opiera się na stdperiph lib, chciałbym uniknąć stosowania tej biblioteki. Używam tylko nagłówka stm32f10x. Wydaje się że włączyłem przerwanie przez NVIC_EnableIRQ(USART1_IRQn) bit w rejestrze USART1->CR1 również został ustawiony i w zasadzie na tym utknąłem. Prosiłbym...
Witam, Mam pytanie do znawców środowiska ECLIPSE. Czy jest możliwość aby podczas debugowania mieć podgląd rejestrów peryferiów (np. USART) w innej formie niż wartość HEX? Dokładniej mam na myśli rozpisanie każdego z bitów i interpretację go na poziomie pełnionej funkcji, coś na kształt tego co można spotkać w środowisku Keil. Z góry dziękuję za pomoc....
Witam, Potrzebuję odebrać dane, które wysyłam za pomocą aplikacji bez bluetooth do uC STM32F4. Dane chcę odbierać przy pomocy przerwania usart. Dane z aplikacji wysyłane są w następującej postaci: Lx , x - liczba całkowita z zakresu <0;100>, np. L25, L100. Nie do końca wiem jak pobrać tą wartość chodzi mi w tym przykładzie o liczbę 25 , chcę ją...
Parę przykładów DMA na STM32F bez SPL niedawno się tu przewinęło - szukaj. Włącz DMA w rejestrze AHBENR, a potem np. coś takiego: DMA1_Channel2->CMAR = (uint32_t)time; DMA1_Channel2->CPAR = (uint32_t)&USART1->TDR; DMA1_Channel2->CCR = 0;// disable DMA1_Channel2->CNDTR = sizeof(time);// no. of items // increment memory adress, mem->periph, enable DMA1_Channel2->CCR...
Jak wygląda sprawa z przerwaniami? Tam zamiast przerwań są używane callbacki. To nie tak jest. Callbacki są całkiem do czego innego. W programie HALowym, to użytkownik pisze obsługę przerwań sprzętowych (tak jak w klasycznym podejściu "rejestrowym") a specyfiką HAL jest tylko to że dostarcza pewnych gotowców na obsługę przerwań. Przykładowo weźmy uart....
1. Masz odpowiednie definicje rejestrów i wartości do wpisania w nagłówkach CMSIS. 2. Nie. Wpisujesz bit PENDSVSET i przerwanie jest pending ;) 3. Nie ma najniższego priorytetu. Trzeba ustawić. Jeżeli pytanie pierwsze jest przeczące to czy dobrze rozumiem, że wystarczy wpisać 1 w PENDSVSET a wychodząc 1 w PENDSVCLR ? Clear sie sam robi po wykonaniu...
Biblioteka STDPeriph jest martwa, więc lepiej ją zostaw i zainteresuj się HAL i CubeMx. Gdy program uruchamiam krokowo i jestem w petli for to dane się wysyłają. Za szybko ta pętla działa i dane za szybko są "wypychane". Należy odczekiwać odpowiedni czas za każdym razem. Regułą jest uprzednie sprawdzanie rejestru statusowego przed zapisem do rejestru/odczytem...
14.7456 MHz * 5 = 73,728 MHz, a nie 72 MHz. Jeśli zdefiniowałeś częstotliwość niezgodną z rzeczywistą to prędkość USARTA jest źle wyliczona przez funkcje, która to robi. W tym przypadku nie ma znaczenia czy korzystasz z biblioteki czy wpisujesz bezpośrednio do rejestru. Przetaktowanie mikrokontrolera to inna sprawa. Nie przekraczaj 72MHz.
Na przykład otwieramy manual na stronie, gdzie znajduje się opis rejestru MODER i czytamy, co oznacza jaka wartość pola bitowego w tym rejestrze - co trzeba wpisać, żeby dana linia portu była przypisana do peryferiala (np. UART), a nie do GPIO. Przed zapisem do MODER ustawiamy dla odpowiednich linii portu funkcje RX i TX odpowiedniego UARTa w rejestrze...
Widzę że dosyć cich. dorzucam jeszcze skrypt linkera i startup. nawet mam brakepointa w void Reset_Handler(void) i w niego nie wchodzi. ale na brakepointa w Default_Handler reaguje. Zanaczam że jak wgram program na mikrokontlorer to działa bez zarzutu... [syntax=c]/* Procedura startowa dla STM32 connectivity line devices */ /* NastÄ™pujÄ…ce...
jeszcze nie zapomnij o samym USARC-ie, który może byc w stanie błedu - bo obsluga DMA była właczona, ale DMA nić nie zabierało. A jeśli UART jest w stanie błędu to jak go usunąć? Zmodyfikowałem funkcję do takiej postaci jak poniżej. Czyli wyłączałem również UART i konfigurowałem ponownie, ale nic to nie pomogło. Dodano po 1 W HALu jest taka funkcja...
Witam, skorzystałem z tematu i chciałem spróbować kod kolegi powyżej zaimplementować u siebie. Procesor STM32f051 na płytce Discovery, rejestry w F1 i F0 co do usartu są prawie takie same, wystarczyło zmienić nazwy na odpowiadające w F0, przenosiłem już nie raz USART z F1 na F0 i nie trzeba było wielu zabiegów. Skonfigurowałem dodatkowo piny USART2...
GPIOA->BSRR |= GPIO_BSRR_BS5; To nie źródło problemu ale tak się tego rejestru nie używa. To jest write only rejestr czyli tylko samo przypisanie Zgadza się, dzięki :) Co do głównego problemu, punkt 1. Użyj debugera okazał się bardzo pomocny :) Założyłem, że skopałem coś w Makefile (np. brakuje jakiejś flagi) i podczas debugowania nic ciekawego...
W HAL odbiór po USART jest napisany źle. Problem pojawia się, gdy w czasie nadawania (na przerwaniach) pojawią się dane do odbioru. Nie miałem siły aby HAL poprawiać. Najlepiej zrobić na rejestrach. HAL to działa jak Arduino. Jak uruchamia się jedną funkcję jest ok, jak kila to porażka. Na razie w I2C nie znalazłem błędów (niedomagań) a w USART, RTC,...
odnośnie wyłączenia i ponownego włączenia przerwania funkcjami: NVIC_EnableIRQ(IRQn_Type IRQn), NVIC_DisableIRQ(IRQn_Type IRQn) czy podczas ponownego włączenia nie trzeba znów wpisać odpowiednich wartości do rejestrów konfiguracyjnych? Ponieważ ostatnio próba wyłączenia i ponownego włączenia przerwania bez ponownego wpisu do rejestrów konfiguracyjnych...
Witam, modyfikuję bibliotekę pod klawiaturę matrycową 4x4. W funkcji "Keypad4x4_ChangeColomn" dla określonego warunku należy zmieniać ustawienia pinów z PushPull na Oped Drain. Wszystko funkcjonuje dobrze : dla pierwszego warunku "if(colNum_0_to_3==0)" bity w rejestrze zostają ustawione poprawnie, jednak dla kolejnych warunków pozostają one bez zmian,...
Inicjowanie UART to 2 lub trzy zapisy do rejestrów, przemieszczenie linii - po jednym zapisie na port (czyli jeśli zmieniasz z portu A na B to masz dwa zapisy). Czas tych operacji nie przekroczy ułamka mikrosekundy (kilkanaście cykli procesora), o ile nie będziesz korzystał z SPL ani HAL.
(1 << 27) Tego nie będę rozszyfrowywał. I przy okazji nie mieszaj kodu HAL-a z rejestrami - w tch samych funkcjach - no chyba że dokładnie wiesz co te halowe robią na poziomie rejestrów (ja np poza kilkoma nie wiem i nie chce mi się grzebać) Procedurę masz opisaną w RM Reception using DMA DMA mode can be enabled for reception by setting the DMAR...
Wiem , że stary temat, ale czemu koledzy nie używają mechanizmu wyszukiwania znaku w transmisji, która jest sprzętowa....opis w DS dotyczy Modbus, ale działa w normalnym trybie USART. Wpisuje się w miejsce rejestru ADD znacznik np. końca linii - 0x0D, a potem uruchamiamy przerwanie od Character Match. Druga możliwość to przerwanie po np.100 bitach na...
To sorki - myślałem że to HAL. SPL-a nie pamietam ale to trzeba te opeacje przeniesc przed inicjalizacje pinu. W przeciwnym razie łaczą sie ze złym AF na krótki czas i jest mozliwe że przełaczenie nie bedzie pozniej możliwe. Kolejny mit :cry: Powiedz Piotruś skąd Ty bierzesz takie bajki? Czy gdziekolwiek w dokumentacji jest taki zapis, czy znalazłeś...
A do AVRlibc jakoś nikt nie zgłasza pretensji- dlaczego? Przecież też biblioteka. Z takich "kłótni" to się czasem można czegoś dowiedzieć. Np. gdy w końcu zacznę mysleć nad ARM- ostatecznie głupoty w C można pisać na dowolny procesor- to będę wiedział czego unikać. Mimo że jest książka oparta na tej bibliotece, jest jakiś kurs- też oparty na bibliotece-...
Dokumentacja: (lub wykorzystywać inną funkcję alternatywną z ową nóżką związaną) Tak, za wyłączenie tych bajerów odpowiada rejestr USART_CRx. Domyślne są wyłączone, więc nie ma się co przejmować. Można odpalić samo RxTx.
Z tego co wiem, funkcja obsługująca przerwnie void HAL_UART_TxCpltCallback jest wywoływana, gdy rejestr tx Usarta jest pusty, więc gdy nadawanie zostało zakończone. Wówczas nadajemy kolejny znak. Co tutaj jeszcze sprawdzać?
Hehe. Wiem że to dziwne ale robiłem to na szybko. Cały czas eksperymentuje a mam mało czasu wiec mam nie mały bajzel. To ja jeszcze zwrócę uwagę na to, bo w Twoich kodach z innych tematów aż się rzuca w oczy: [syntax=c]USART1->CR1 = USART_CR1_UE; USART1->BRR = 168000000/9600 ; USART1->CR1 |= USART_CR1_TE | USART_CR1_RE; // RX, TX enable[/syntax] Po...
Tak, jest wszystko włączone, pytanie czy wszystko w rejestrach timera jest jak trzeba. Chciałbym wykorzystać funkcje API dostarczone przez STMa, sprawdziły się dla innych peryferii (SPI, USART, GPIO, DMA...) jednak nie ma nigdzie przykładu konfiguracji timera w trybie compare.
Witam, Po paru dniach ślęczenia udało mi się - tak myślę :) , skonfigurować rcc na 72MHz. : void rcc_init(void) //RCC init włączający procesor na 72MHz { RCC->CR|=0x1; //wlacz HSI wewnętrzny oscylator, włączany jako pierwszy po zasilaniu. while(!(RCC->CR&0x2)); //poczekaj na HSI sprawdza czy HSI się włączyło RCC->CFGR|=(0xF<<18);...
To napisz może jak ustawiasz Option Bytes. Istnieje tutaj widoczna zależność - utrata komunikacji następuje chwilę po zaprogramowanie Option Bytes. Wartości z tych rejestrów ładowane są przy okazji resetu. Nie włączyłeś przypadkiem RDP? (read out protection) RDP =AA = LEvel 0, no protection - nic nie włączałem - ale sprawdziłem i nie ma żadnego write/read...
Chodzi mu o to że PA9 ma przypisane 2 peryferia w jednym trybie, i jeśli obydwa peryferia są włączone i żadne nie jest zremapowane to następuje konflikt. TIM1 ma możliwość odłączenia się od tego portu, ale być może biblioteka nie do końca mu to umożliwia. Ta biblioteka zbyt inteligentna nie jest i ma błędy i dlatego z niej nie korzystam, po drugie szkoda...
W sumie to co napisałeś Freddie Chopin dużo wyjaśnia to co się działo z STM. Musisz mieć rację. Napisz mi tylko jeszcze czy jest możliwe zrobić czegoś takiego: W USAR'cie gdy chciałem wysłać 1 bajt np. co 1sek to wówczas ustawiałem flagę nadawania program przechodził do procedury obsługi przerwania i kopiował zawartość zmienne do rejestru nadawczego...
sprawdziłem w dokumentacji. FIFO ustawiane jest w trybie z DMA, którego nie używasz. Więc ten aspekt odpada. Dla uporządkowania tematu. PC-t wysyła do stm32f1.. ramkę z 8 bajtów z 1 bitem stopu bez parzystości. 8 bajtów wyjechało i masz je w buforze odbiorczym pc-ta jako echo. 1. czy arm widzi tylko wybrane bajty ? 2. czy arm widzi wszystko? 3. czy...
Próbuje napisać coś w stylu klasy ale stanąłem w miejscu. Klasa ma obsługiwać usart. W pliku H zadeklarowałem strukturę która przechowuje m.in. wskaźniki na funkcje, a w konstruktorze do tych wskaźników przypisuje funkcje. Plik h // usart type powinien być różny w zależności od obiektu który wywołał funkcję! //while (!(module->usart_type->SR & USART_SR_TXE));...
USART1->ISR &= ~USART_ISR_RXNE; To jest po pierwsze zbędne - flaga jest czyszczona automatycznie jeśli coś odczytasz - a po drugie błędne - do czyszczenia flag słłuży rejestr ICR, a nie ISR (który jest tylko do odczytu). Na pinie RX warto albo ustawić wewnętrzne podciąganie, albo zrobić podciąganie zewnętrzne.
No tak: [syntax=c] /************************* * stm32 uart main.c *************************/ #include "stm32f10x.h" #include "stm32f10x_flash.h" #include "stm32f10x_gpio.h" #include "stm32f10x_rcc.h" #include "stm32f10x_usart.h" #include "stdint.h" #include "misc.h" #define CLK_FREQ 36000000 /* User defined function prototypes */ void GPIOA_Init(void);...
Jak sprawdzam wartości rejestrów to wygląda, że funkcje alternatywne są ustawione dobrze GPIOA->AFRH przyjmuje wartość 0x70, a GPIOC->AFRL 0x80000000. Powinno być 84MHz, ponieważ zegar ustawiany jest za pomocą PLL i przeliczając wychodzi mi 168MHz z dzielnikiem 2 na APB2. Ale rozumiem, że same rejestry od USARTa wyglądają na poprawnie ustawione?
Vcc? Zasilanie mam tylko od strony RS485 konwertera. A nowsze wtyczki kabli szeregowych nie przewidują specjalnie ich rozbierania (no i na mojej rozpisce PINów komunikacji szeregowej nie ma nic takiego). W kwestiach sprzętowo technicznych trzeba mi łopatologicznie napisać bo do niedawna jedyny mój kontakt sprzętowy to było włożenie wtyczki gdzie trzeba...
Właśnie nad tym się skupiłem, nad prędkością. Przy czym zmieniłem kierunek transmisji i sobie wysyłam z procka znak 'G' do komputera. Dodano po 39 Ok znalazłem gdzie tkwi problem. HSE domyślnie ustawiony jest na 25MHz a ja mam w układzie 8Mhz. Teraz działa w obie strony tak jak należy na pierwszy rzut oka. Tematu jeszcze nie zamykam może pojawią się...
Witam, Mam mały problem z ustawieniem niestandardowej prędkości na STM32 powyżej 115200. Problem pojawia się zarówno przy użyciu funkcji niesocjalizującej jak i ręcznego skonfigurowania ( ręczne wyliczenie wartości dla rejestru BRR ). Nie ma problemu z różnymi transmisjami 9600, 28800 aż do 115200. Po tej wartości terminal milczy. Jedynie przy użyciu...
Czy to oznacza, że trzeba pracować na rejestrach i nie używać bibliotek? Nic nie "trzeba". Tylko po prostu jak chcesz zrobić coś choć trochę bardziej dziwnego niż to przewidzieli twórcy HALa, to zaczyna się temat na 50 postów o tym "jakie magiczne funkcje i jakie magiczne argumenty przekazać", gdy tymczasem rozwiązanie problemu bez tego HALa zajmuje...
Witam. Zastanawiam się nad tym w jaki sposób działają funkcje biblioteki stm32cube, np: HAL_StatusTypeDef HAL_UART_Transmit_IT(UART_HandleType... *huart, uint8_t *pData, uint16_t Size) { uint32_t tmp = 0; tmp = huart->State; if((tmp == HAL_UART_STATE_READY) || (tmp == HAL_UART_STATE_BUSY_RX)) { if((pData...
Postanowiłem krok po kroku zobaczyć jak ta biblioteka wyznacza sobie zawartość rejestru BRR. Okazało się, że z poziomu pliku stm32f10x_rcc.c widać niepoprawną wartość stałej HSE_VALUE - zamiast 10 MHz była widoczna wartość zdefiniowana w pliku stm32f10x.h czyli 25 MHz, pomimo zdefiniowania 10 MHz w mainie. To jest o tyle dziwne, że preprocesor nie widzi...
Witajcie, Potrzebuję pomocy przy STM32F429. Moje pierwsze podejście do rozwiązania docelowego zadania było oparte o biblioteki HAL i była to moja pierwsza styczność z STM. Pomysł fajnie się spisywał, ale później miałem jakąś totalną masakrę, żeby zaimplementować jakiekolwiek klasy. Wyszło tak, że przerzuciłem się na rejestry i nie wygląda to najgorzej....
ADC jest 12 bitowe (rejestr jest 32 bitowy): [syntax=c] __IO uint32_t CPAR; /*!< DMA channel x peripheral address register */ __IO uint32_t CMAR; /*!< DMA channel x memory address register */[/syntax] Przez DMA odczytuję wartość 32 bitową czyli dalej nie powinno być problemów (W erracie nawet pisze, że dla odczytów DMA 8 i 16 bitowych coś jest...
Witam. Stosunkowo niedawno wziąłem się za Cortexy i chciałbym na nich oprzeć swój projekt. I potrzebuje kilku rad odnośnie projektowania płytki pod te procesory (STM32F372CCT6 /LQFP48). Niestety w datasheecie prócz tego jak podłączyć zasilanie innych pomocy nie znalazłem i mam kilka pytań. 1. Co zrobić z wejściem kwarcu dla RTC jak nie mam zamiaru z...
To niech teraz też będzie samo =, bo OR nie ma tu najmniejszego sensu a tylko może zaszkodzić. Tak samo OR nie ma najmniejszego sensu przy inicjalizacji rejestrów USARTa, bo niby po co chcesz zachowywać stare wartości? A jak tam jest właśnie jakimś sposobem ZŁA wartość? Wpisz po prostu do dwóćh rejestrów dwie gotowe wartości i tyle, bez żadnych ORów....
Tutaj zamieszczam końcowy program, może komuś się przyda. [syntax=c]#include "stm32f1xx.h" #include <stdlib.h> /*Wyswietlany tekst przez USART*/ volatile char znaki_f[] = { " Czestotliwosc = " }; volatile char znaki_u[] = { " Napiecie = " }; volatile char znaki_i[] = { " Prad = " }; /*Zmienne odebierane*/ volatile uint32_t wartosc_f = 0; volatile...
Cześć, Od jakiegoś czasu borykam się z takim problemem: chciałbym odbierać po CANie ramki, wpisywać je w gotowy szablon i dalej wysyłać po USARCie na kompa w kodzie ASCII. Czegoś mi brakuje w tym kodzie i za każdą wskazówkę będę wdzięczny. Z góry dzięki:) To mój main: [syntax=c] unsigned char tx_uart[]=" ID: DL: F: T: DATA: ";//54 char ramka[55]; unsigned...
Faktycznie, rozwiązanie kwestii działania SPI było dosyć proste i po sprawdzeniu - SPI działa. Odczytuję zapisany wcześniej rejestr poprawnie. Teraz mam inny problem. Poniżej zamieszczam program z pliku main.c, w którym są dodane miejsca wysyłania kolejnych numerów przez UART i program zatrzymuje mi się po wysłaniu numeru 88. Nic więcej się nie dzieje,...
Dziękuje, już sobie poradziłem. Jeśli kogoś interesuje w czym tkwił problem, to powiem, że miałem skonfigurowany USART od SmartCard tak jak w przykładach z ST. Niestety tam domyślny Guard Time był 16. Dla mojej karty widocznie było to za dużo i zjadało mi bajty wracające od niej. A dlaczego bajty wysyłane, wracały do mnie? Po każdym zapisanym bajcie...
Udało mi się ustalić, w skrócie że Keil uVision jest do bani.. potwierdziłem za pomocą doświadczeń, że wszystko jest wporzadku z programatorem i ustaliłem sobie te wszystkie zegary dokładnie tak jak narysowane jest to na pierwszym obrazku (czerwona droga) - na głównym SYSCLK mam 72 MHz potwierdziłem to ustawiając USART - i konfigurując go poprawnie...
Zazwyczaj najwygodniej uczyć się języka C na desktopie, czyli swoim PC-cie. Programując STM32 lub AVR-ki używa się języka w ten sam sposób, ale zwykle nie mamy dostępu do pewnych bibliotek standardowych, które na desktopie są od razu, bo komputer ma monitor, klawiaturę, dysk twardy itp.. W mikrokontrolerach tego nie mamy, więc użycie printf(), getch()...
Ale na pewno bufor nie ma 2 bajtów. Ma - jeden bajt od razu jest ładowany do "shift register", a drugi czeka w rejestrze USART->DR. Dopiero trzeci i kolejne się nie mieszczą i muszą czekać na zakończenie wysyłania poprzednich.
Nie wiem, jaki Ty tu konflikt widzisz. Każda linia portu jest ustawiania oddzielnie, z każdą możesz zrobić, co chcesz. Chodzi o to, że zgodnie z dokumentacją jeśli kilka układów współdzieli ten sam pin tylko jeden z tych układów może być włączony poprzez rejestr RCC. Tak wynika z dokumentacji (http://www.st.com/internet/com/TECHNICA...
Mieszanie do tej dyskusji bitbandingu nie ma sensu. Operacja "tylko-zapis" jest atomowa jeśli tylko zmienna którą zapisujesz ma "rozmiar natywny" (lub mniejszy), czyli na ARMach generalnie 32 bity lub mniej. Wszelkie operacje zdradzające cechy "read-modify-write" (a więc "a^= b", "++a", "a += b", "a |= b" itd) NIE są atomowe. To czy akurat "celem" danej...
To teraz jeszcze wyrzuć wszystkie operacje na CR2, bo są całkowicie zbędne - ustawiasz w tym rejestrze wartości domyślne, które są tam od początku. Operacje na AFR i MODER możesz wykonać jedną instrukcją. Procedura TransmitByte to przykład, jak nie należy programować, jakby zainspirowany pewną książką. :) Kolejność akcji!!!
Czasem Arduino do czegoś się przyda Dodano po 2 Możesz dać przykład takiej krytycznej czasowo operacji? Problem jest a raczej był związany z buforem nadawczym uarta. Mam funkcję: Blokuj tylko przerwania od UART.
Patrzyłem zbyt wąsko na problem - znowu (!) coś dzieje się z transmisją przez USART :/ Jeśli w pętli while(1) nie używam "żądania" wysłania na terminal "w" w celu przesłania wartości mierzonej przez ADC - program działa. Wraz z dopisaniem linijki odpowiedzialnej za sprawdzanie co pojawia się w terminalu, program działa tylko w przypadku (A) ! (czyli...
(at)tmf - dziękuję za miłe słowa :) Właśnie takie było założenie co do grupy "docelowej". Myślę, że jeszcze długo ATmegi i ATtiny będą punktem startowym dla hobbystów ze względu na nawał informacji w Internecie i mocno zakorzeniony pogląd jakoby wszystko inne było drogie/trudne itd. W sumie chciałem, żeby w poradniku było trochę więcej nawiązań do...
Może rozwiążę Twój problem nieco inaczej. Obsłużenie dowolnej bardziej skomplikowanej rzeczy w przerwaniu polega zwykle na sprawdzeniu flag statusowych (np. rejestru TIMx->SR) _ORAZ_ tego jakie przerwania są włączone (np. rejestru TIMx->DIER). Inaczej jest to po prostu niemożliwe. Dopiero mając te dwie informacje można dojść do tego jakie źródło faktycznie...
Witaj Kasiu. Miałaś tyle różnych przerwań USARTA do wydoru, a wybrałaś przerwanie USART_IT_RXNE, które informuje o tym, że rejestr odbiornika nie jest pusty. Nie do końca rozumiem dlaczego. Tak sobie myślę, że jak wysyłasz znaki USART-em, to lepiej byłoby wiedzieć, że znak został wysłany i można wysyłać kolejny. To chyba przerwanie USART_IT_TXE. Do...
Nie wszystkie procki od ST mają to sprzętowo zrobione. Z F0 to mają STM32F0x1/STM32F0x2/STM32F0x8, podobnie jak rodzina F303. W rejestrze USART_CR2 jest pole ADD: "This bit-field gives the address of the USART node or a character code to be recognized". Oczywiście należy włączyć przerwanie od znalezionego znaku: USART_CR1_CMIE// Character match interrupt...
Dlaczego włączasz przerwanie przed zaprogramowaniem UART? W jakim celu używasz makr do zerowania bitów, które mają wartość zero? Po co w ogóle cokolwiek robisz z rejestrem CR2? W jakim celu zaszyfrowałeś wartość wpisywaną do BRR? Odsuń instrukcje włączające peryferiale od instrukcji zapisujących do ich rejestrów - nie powinno sę tego robić w następnej...
0. Z jakiego źródła jest taktowany UART2? Czy zmieniasz wartość BRR dla UART2 po zmianie taktowania? 1. Sprawdź profil zasilania ustawiony w rejestrach PWR. Domyślny to Scale 1, ale jeżeli projekt wygenerowałeś w CubeMX z zegarem HSE lub HSI, to możliwe jest inne ustawienie, które uniemożliwia pracę rdzenia z zegarem 180 MHz. 2. Zmiana Wait State wymaga...
Ustaw AF dla obydwóch pinów i obydwa ustaw na push-pull. Wiem że to brzmi dziwnie dla pinu RX, ale tak właśnie ma być. USART3_GPIO->AFR[0] |= GPIO_AFRL_AFRL7; To jest źle skoro używasz pinów 8 i 9. DMA1_Stream3->M0AR = (uint32_t)&ramka_tx; DMA1_Stream3->M1AR = (uint32_t)&USART3->TDR; Adres &USART3->TDR powinieneś wpisać do rejestru PAR, a nie M1AR....
Do BRR powinieneś wpisać (168000000/4)/Baud. Do tego to co napisał kolega wyżej no i to zerowanie bitów jest raczej zbędne bo po resecie te rejestry mają wartości 0x00000000.
Sprawdziłem wartość rejestru. Po odebraniu bezpośrednio ładuję na USART, efekt - wartość rejestru się nie zmienia. To duża podpowiedź, bo błąd tkwi w SPI albo w rygorach czasu. Dodano po 1 Tak, tak, wiem. SysClock jest ustawiony na 8Mhz. PLL = 24MHz. Dodano po 1 UWAGA! UWAGA! Problem rozwiązany. Okazało się, że zakupiony MPX6675 ze sklepu bot****.com...
Witam, chciałem zaprogramować sobie uC wykorzystując bootloadera przez USART2, programem FlashLoader Demonstrator. Program wyświetla błąd że nie można nawiązać komunikacji z uC. Możliwym problemem jest zła konfiguracja bootloadera w uC. W dokumentacji doczytałem się że bity BOOT0 i BOOT1 muszą być ustawione na 1. Z bitem BOOT0 nie ma problemu, bo jest...
(at)Piotr - teraz zrozumiałem co masz na myśli. A na jakiej częstotliwości powinien pracować i jak sprawdzić z jakiego korzysta? Próbowałem ustawić go przez wstawienie na początku maina następującą linijkę, ale nie pomogło. Bo zegara nie określamy przez #define, tylko przez wpisywanie odpowiednich wartości do rejestrów procesora. Jeśli masz oscyloskop,...
Nie trzeba go przekonywać. Dla DMA jest wszystko jedno pod jakie adresy mają się zapisać dane. Ale nie jest mu wszystko jedno, w jakich okolicznościach ma to robić. W przypadku UART TX, DMA request jest generowany za kazdym razem, gdy flaga TXE==1 (jesli UART ma włączony DMA oczywiscie). Wtedy DMA transferuje wartość spod adresu podanego w CMAR do...
Jeżeli nic wcześniej nie podłączałeś do tego wyprowadzenia, to sprawdź czy układ/pin reaguje na ręczną zmianę stanu w rejestrze ODR. Przy okazji możesz sprawdzić stan pozostałych bitów odpowiedzialnych za konfigurację. Możesz wstawić zrzut ekranu. Ale jeżeli wszystko jest ok w rejestrach, a pin się nie odzywa, to jest trwale niezdolny do posługi i pożytku...
Freddie miałeś racje po dodani kodu włączającego zegar wewnętrzny ruszyło [syntax=c] //Wlaczenie HSI, wpisanie wartosci 1 RCC->CR |= RCC_CR_HSION; //czekanie na ustabilizowanie sie sygnalu HSI //do momentu az flaga zostanie ustawiona while(!(RCC->CR & RCC_CR_HSIRDY)); //Zresetowanie wartosci rejestru RCC_CFGR //automatycznie zostaje wybrany zegar systemowy...
Dzięki wielkie za odpowiedzi, oczywiście było tak jak mówicie, bit w rejestrze DIER + błędnie ustawiony bit UDIS, teraz już działa ;) co do wartości w rejestrach PSC i ARR to były zupełnie przypadkowe na razie :) a TIM2_CR1_CEN_bb = 1; to dostęp do bitu CEN przez bitbanding i tak, włącza on timera ;) Jeśli chodzi o printf Freddiego - on napisał swoją...
Handler: [syntax=c] void HardFault_Handler(void) { HAL_DbgUartInit(); // __asm volatile ( " tst lr, #4 \n" " ite eq \n" " mrseq r0, msp \n" " mrsne r0, psp \n" " ldr r1, [r0, #24] \n" " ldr r2, handler2_address_const \n" " bx r2 \n" " handler2_address_const: .word prvGetRegistersFromStack \n" ); while(1); } [/syntax] UART Init: [syntax=c] void HAL_DbgUartInit()...
USART wczoraj ruszył bez problemów:) Dzisiaj staram sie zrobić zegar, z kalendarzem itd. RTC taktowany kwarcem 32.768. Wydaje mi się to znacznie trudniejsze. Napisałem taka funkcję inicjalizacji RTC: [syntax=c] void RTC_Init(void) { RCC->APB1ENR |= RCC_APB1Periph_PWR; //RCC_APB1ENR_PWREN RCC->APB1ENR |= RCC_APB1Periph_BKP; //RCC_APB1ENR_BKPEN...
Jeśli masz przejściówkę USB-RS232, a nie USB-UART "TTL", to musisz mieć po drodze jeszcze translator poziomów - z uC nie wychodzą sygnały RS232. Mikrokontroler można łatwo uszkodzić, łącząc go z wyjściem TX RS232. W praktyce dopóki chcesz się łączyć na biurku, a nie "w terenie" zamiast MAX232 wystarczy rezystor 47k na linii RXD mikrokontrolera i bezpośrednie...
Ciekawe że w RM ciężko doszuać takich informacji. Dla jasności, czy Wy to mapowanie rozumiecie tak, że dla Was mapowanie oznacza takie przypisanie w którym zamiast zwyklej cyfrowej koncówki GPIO mamy przyłaczone I2C, USART? Czy może podaną w RM zmiane polegająca że sygnały np układu I2C są zamiast na porcie C przełączone na A? Bo to dwie rózne sprawy....
Że trzeba włączyć to wiem. Mało tego. Zaraz po konfiguracji ADC jest konfiguracja USART1 który jest tak samo podłączony do APB2 i z nim mogę zrobić co mi się tylko podoba. Skonfigurować, zamieszać w nim, wszystko... Przed ADC konfiguruję DMA więc i tam zobaczę czy da się wprowadzić zmiany. Tak. W rejestrach DMA też mogę mieszać do woli.
Witam, Przesiadam się z STM32F103 na F051, a raczej ćwiczę sobie na obu tych mikrokontrolerach. Napisałem program na F0, w celu poćwiczenia sobie z konfiguracją interfejsu SPI. Zadanie jest takie SPI1 posyła dane, a SPI2 odbiera je zgłaszając odbiór. Interfejsy podłączyłem ze sobą SPI1->MISO z SPI2->MISO SCLK - SCLK MOSI - MOSI Niestety komunikacja...
stm32 usart usart stm32 rejestr stm32
huawei gniazdo naprawa renault megane bezpiecznik wycieraczka piecyk wybrać
brother zacięcie papieru obudowa transformatora
Przełączniki na desce rozdzielczej Setra 315: opis i funkcje Kolejność przekładek foliowych w Sony KDL-32WE615