Do SPI wpisujesz dwa bajty, odczytujesz tylko jeden. Kontrolerowi się to nie spodoba... [syntax=C] while( !( SPI2->SR & SPI_SR_TXE )); SPI2->DR = 0xD7; // // TUTAJ dodać "niby" odczyt SPI - choćby tak: // czekaj_na_dane(); // np poprzez sprawdzanie SPI_SR_RXNE // (void)SPI2->DR; // while( !( SPI2->SR & SPI_SR_TXE )); SPI2->DR = 0xFF; while( !( SPI2->SR...
I nie rozumie a = ADC_GetConversionValue(ADC1); dlaczego z ADC1 ? Myślałem że argumentem tej funkcji powinien być raczej kanał ? Co jeśli dopiszę konfigurację ADC dla PB0 czyli kanał 8 ADC1 ? jak wtedy odczytam wartość z PB2 ? ADC1 - to ADC1 bo F4 ma do 3 oddzilenych adc. Kanał definiujesz w sekwencji odczytów - tu masz tylko jedna i jest to ujete...
W AVR bym po prostu na czas "składania" zmiennej m w funkcji read_us wyłączył globalnie przerwania - cli() i po zapisaniu wartości do zmiennej m włączył - sei(). Czy tutaj trzeba wykonać podobną operację? Ale to Ci nic nie da, bo przecież timer chodzi nadal (; Oraz czy mógłbyś Freddie opisać jeden ze sposobów jak uzyskać "sparowany" odczyt. Zrób to...
Czy: Kod C - Tak, chyba że wymusisz update "ręcznie". 4\/3!!
arm.com: Cortex-M4 Technical Reference Manual ARMv7-M Architecture Reference Manual Co do timera: prawdopodobnie chodzi o opóźnienie kasowania zgłoszenia przerwania. Jeśli skasujesz pod koniec procedury, to po jej zakończeniu znacznik będzie jeszcze ustawiony i spowoduje powtórne zgłoszenie przerwania. Do sterowania NVIC proponowałbym jednak użyć pseudofunkcji...
while(!(I2C3->SR1&I2C_SR1_ADDR)); program nie wychodzi z drugiej pętli Drobna rada - jeśli robisz to krokowo w debuger to nie zatrzymuj się w pętli while tylko przeskakuj za nią, naciąłem się na tym ostatnio. Nawet przy działający programie jeśli się zatrzymasz w while to się posypie. Prawdopodobnie spowodowane jest to tym, że rejestr statusowy wcześniej...
Regulamin wymaga aby dodać poradę w celu ogrzania archiwalnego tematu. Więc.... Nie traćcie czasu na próbę zrozumienia konfiguracji tego urządzenia bo bez ustawiania rejestrów "Reserved" i tak nic nie da się zrobić. Rejestry o których mowa, nie są nigdzie opisane i jest ich chyba nawet więcej niż te, których mówi dokumentacja. Zanim kupiłem sobie tą...
A co na to odpowiednie RM (która powinna być dla ciebie święta księga a nie jakieś zabawne biblioteki). Powinna być, ale ciężko mi się tam odnaleźć. Pierwszy raz bawię się uC, dlatego kupiłem tą książkę, a tam pracuje się na tej bibliotece. Jak pisałem, na samych rejestrach nie potrafię nawet uruchomić zegara dla Backup Domain, a co dopiero skonfigurować....
Oprócz tego przy kompilacji wyskakiwał błąd: error: 'GPIO_TypeDef {aka struct <anonymous>}' has no member named 'BRR'; did you mean 'BSRR'? więc zmieniłem: SSD1963_CTRLPORT->BRR = SSD1963_PIN_CS | SSD1963_PIN_WR; na SSD1963_CTRLPORT->BSRR = SSD1963_PIN_CS | SSD1963_PIN_WR; I właśnie tu jest błąd, bo BSRR to nie jest to samo co BRR (co zresztą...
Tak jak pisałem w pierwszym poście IMO zachowanie normalne. Tak samo w STM32F4 nie ma żadnego FIFO w SPI. Teoretycznie ma bo masz rejestr przesuwny i DR. Dostajesz dlatego 2 TXE raz na poczatku a drugi jak przesunie z DR do tego rejestru. Aż sobie płytkę z 429 odpaliłem i nie widzę żadnego nieprawidłowego działania. FCh słusznie zauważył że akurat tu...
Nie jest moją intencją przerywać Waszej dyskusji, bo mi nie przeszkadza, ale nie skorzystam tak czy siak z tego timera, bo nie mam dostępu do tego proca. Proszę w międzyczasie tylko o odpowiedź na moje pytanie czy jest możliwe 8bitowym transferem DMA zapisać poprawnie 16bitowy rejestr compare timera?
Ćwiczę na STM32F4 Discovery. Diody mają reagować na wciskanie przycisku. Kiedy wciśnięty zapala się jedna, kiedy zwolnimy - zapala się druga a pierwsza gaśnie. Kiedy stosuję zapis do rejestru ODR wszystko działa jak należy. Kiedy jednak stosuję sterowanie pinami wyjściowymi przez rejestr BSRR diody się zapalają ale nie gasną po zwolnieniu przycisku....
Wybacz ale myślałem, że załapiesz tą drobną ironię :) PWR_CR_DBP to jest zdeiniowana stała a nie rejestr więc twój warunek wygląda dla kompilatora tak : while( 0x100 != 1) ) ; czyli wynikowo while(1); pętla nieskończona; Rozumiem, że chodziło ci raczej o : while(PWR->CR & PWR_CR_DBP); Cóż nie wiedziałem, że nie znasz podstaw C :roll:
No właśnie - w końcu dla nieznanego mechanizmu modyfikującego zmienne nieznany rejestr procesora nie jest ani trochę bardziej nieznany niż nieznana lokacja na stosie. :)
Dostęp atomowy w STM32: - bit-banding - rejestr BSR - wpisywanie gotowej wartości do rejestru ODR (czyli nie "|=" i nie "&=~") W innych układach, np. LPC17xx, dochodzą jeszcze inne możliwości. 4\/3!!
I ostrożnie z tym podglądem rejestrów, bo on generuje (a przynajmniej może, zależnie na jaki rejestr patrzysz) nadmiarowe odczyty. Nie pamiętam jak czy odczyty SR czy DR generują flagi, ale zwróć na to uwagę, bo odczyt przez debuger też zostanie zauważony przez procesor tak samo jak dowolny inny.
W funkcji odczytu zerujesz ACK, ale nigdzie go nie ustawiasz. Jeśli jest zbędne ZAWSZE, to po prostu skonfiguruj odpowiednio rejestr podczas konfiguracji. Jeśli jednak czasem musi być zmieniane, to w funkcji odczytu przywróć poprzednią wartość. 4\/3!!
No tak, ale czy debugger po prostu odczytuje błędną wartość, czy poprzez odczyt już zmienia rejestr DR? Bo zwykły odczyt rejestru w programie powinien z tego co wiem wyzerować rejestr, a tak się nie dzieje. Edit: No tak, ale czy rejestr jest pusty w debugu też nie sprawdzę... Tak czy siak w debugu czy mie w debugu śladu komunikacji na liniach MISO,...
Prawdopodobnie są zdefiniowane jako tablica.
Dlaczego? Wpisuję 0 na zerowy bit rejestru CR czyli Disable? Skoro mówisz, że nie, to pewnie masz rację, ale nie wiem co źle tu robię Operacja którą pokazałeś robi dokładnie... nic. No może nie do końca nic - odczytuje rejestr i zapisuje do niego dokładnie to samo co odczytała. Do kasowania bitów zwykło się używać "&=~". W tym przypadku jednak prościej...
Dziękuję za uwagi i w najbliższym wolnym czasie postaram się to poprawić. W dalszym jednak ciągu nie rozumiem jaka jest różnica między ustawianiem bitów ODR a BSRR. Rozumiem, że rejestr BSRR pozwala na ustawianie i resetowanie bitów w ODR więc dlaczego nie powinno się robić tego bezpośrednio? Przyznam, że wcześniej stosowałem BSRR ale gdy się dowiedziałem...
Generowanie liczb losowych to bardzo ciekawy temat. Niektóre mikrokontrolery np. STM32F4 mają wbudowany sprzętowy generator liczb losowych w tym wypadku 32 bitowych oparty o oscylator pierścieniowy oraz rejestr przesuwny ze sprzężeniem zwrotnym(nazywają go true hardware). Trochę się nim bawiłem. Jeżeli chodzi o generowanie programowe( nie wiem w jaki...
Funkcja gpio_pin_cfg() ustawia odpowiednie wartości a rejestrze AFR[].
Opcja może i jest, tylko sensu w tej opcji brak. Procedura przerwania w pratktyce jest jedna dla każdego źródła i nie podmienia się jej w czasie pracy, więc dynamiczne podpinanie nie ma sensu. Funkcje timerów w ST;32F też nie są wymienne, więc rzadko zdarza się, by można było użyć do czegoś dowolnego timera - każdy jest ciut specjalizowany. Poszczególne...
Tylko pytanko - czy wystarczy opcja : ./configure --enable-stlink przy konfiguracji? Raczej niezbyt. Konieczne jest jeszcze włączenie trybu "maintainer-mode" przy kompilacji źródeł z repozytorium. Jak z obslugą USB? ? EDIT: Rozwiązanie zostało znalezione, oczywiście błąd u mnie - nie czytać tego co pisze niżej! (; Ja natomiast mam pytanie do was, dotyczące...
Dzięki Wam jestem o krok dalej :-) Teraz próbuje odczytać 6 rejestrów zawierających dane o przyśpieszeniu z każdej z osi (dla każdej z nich po 2 bajty. Funkcja odczytu: [syntax=c] void i2c_read(uint8_t adres, uint8_t reg_adres, uint8_t * dane, uint8_t len ) { uint32_t dummy; I2C1->CR1 |= I2C_CR1_START; while( !( I2C1->SR1 & I2C_SR1_SB )); I2C1->DR =...
Witam Spróbuj włączyć zegar według poniższego (w Twoim kodzie nic podobnego nie widziałem) ========================================... * How to use this driver * ========================================... * * 1. Enable peripheral clock using the following functions * RCC_APB2PeriphClockCmd(RCC_APB2Periph_SP...
A w STM32F4 są już liczniki min. godz. dni itd...? Tak, są. Jeżeli chodzi o definicje, to staram się wpisywać dla czytelności, ale zawsze przed użyciem sprawdzam czy jej wartość zgadza się z numerem bitu w rejestrze, przeważnie najpierw zaczynam od (1<<15); a potem sprawdzam czy definicja którą użyję = 15 bit. Własnie dlatego że mogę czasem użyć...
Daje Ci mój działający kod, porównaj sobie co i jak. [syntax=c]#define CS_0 GPIO_ResetPin( GPIOE, 3 ) #define CS_1 GPIO_SetPin( GPIOE, 3 ) void spi_init( void ) { RCC->APB2ENR |= RCC_APB2ENR_SPI1EN; gpioa_init(); gpioe_init(); gpio_pin_cfg( GPIOA, 5, GPIO_AF5_PP_50MHz ); // sck gpio_pin_cfg( GPIOA, 6, GPIO_AF5_PP_50MHz ); // miso gpio_pin_cfg( GPIOA,...
Dodano po 17 Także problem rozwiązałem sam metodą prób i błędów. Wszystko było w porządku, poza deklaracją push-pull'a i floating :D Prawidłowy kod main.c dla potomności: [syntax=c] #include "main.h" #include "stm32f4xx_gpio.h" int main(void) { #ifdef DEBUG debug(); #endif GPIO_InitTypeDef GPIO_InitStructure; RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GP...
Witam, Mam STM32F4 i on ma 16-bitowe GPIO - problem w tym, że na obudowie 8bitów portu A jest na jednym końcu, a na drugim końcu jest kolejne 8bitów tego portu. Trochę to utrudnia prowadzenie ścieżek, zachowanie ich równej długości itd. Znacznie wygodniej było np. skorzystać z dwóch 8bitów z dwóch portów leżących koło siebie na obudowie (dajmy na to...
Witam ponownie Na początek sugerowałbym przetestować samą poprawność działania SPI, można np. zapętlić MISO z MOSI. Albo odczytywać z peryferiala rejestr ID. Dopiero w następnym etapie uruchamiać obsługę właściwą. Nie analizowałem Twojego programu ale podeślę mój 'bliźniaczy' i działający na STM32F429_DISCO, odczytuje on i wyświetla rejestry GYRO L3GD20....
SPI 3-wire to ma być half-duplex SPI, dobrze rozumiem? Troche inaczej sie to robi ;] 1) nie łącz MISO i MOSI. Jeśli procek jest masterem, podłącz tylko linię MOSI - w trybie half duplex ta linia potrafi również odbierać dane 2) Ustaw bit BIDIMODE w SPI->CR1 3) Kierunek narzucasz bitem BIDIOE - Jeśli chcesz coś nadać, to ustaw BIDIOE i wykonaj zapis(y)...
Witam, otóż mam problem, a mianowicie chciałbym obsłużyć przerwanie z pinu ALRT z przetwornika ADS1115 w celu wyeliminowania opóźnienia które teraz stosuje przy odczycie każdego z kanału (delay(20)) dokumentacja: https://cdn-shop.adafruit.com/datasheets... z góry dziękuję za pomoc mój dotychczasowy kod: [syntax=c] /* Includes ----------------------------------------...
0. Jeżeli słyszysz nie więcej niż 1s dźwięku, to program działa ok. Najpierw otwierasz plik, odczytujesz 31600 bajtów i zamykasz plik. Nic więcej nie odczytasz. Następnie przesyłasz dane do dekodera w paczkach po 32 bajty. Jeżeli masz bitrate rzędu 256kbit/s, to masz tam ~964ms dźwięku. Inna sprawa czy słyszysz ten fragment zapętlony, czy tylko raz...
Wez pierwszy kod i popatrz na niego uważnie. To jest kilka linijek. Jeżeli nie znajdziesz błędu, to odpuść. Nie ma in nic wspólnego z procesorem, rejestrami itp.
http://www.freddiechopin.info/pl/downloa... Ściągnij sobie przykład dla STM32F4 i możesz spokojnie pisać na rejestrach, bez żadnych wstawek assemblerowych oraz bez zastanawiania się nad "listą rozkazów", jak mylnie określasz HAL/SPL.
Chyba trzeba jeszcze wykonać update, czyli przepisać wartości z rejestru tymczasowego do rejestru sprzętowego. TIM2->EGR = TIM_EGR_UG;
I tutaj pojawia się problem. Otóż rejestry RTC są kasowane przy każdym resecie procesora oraz przy zaniku napięcia. Byłem pewien, że system sam wykryje brak napięcia VDD i podtrzyma odpowiednie rejestry, ale teraz już sam nie wiem czy może programowo nie trzeba czegoś ustawić. Szukałem w dokumentacji i niestety nic pasującego nie mogę znaleźć. Może...
Kamery zwykle mają wewnętrzny PLL. Częstotliwość sygnału XCLK i wartości wpisywane do rejestrów kamery muszą być odpowiednio dobrane.
Cocox na pewno obsługuje STM32F4, gdyż sam używam tego środowiska i wszystko działa bez zarzutów (testowane z płytką discovery, zewnętrznym ST-LinkV2 i ST-Link). W obecnej wersji brakuje tylko zdefiniowanych rejestrów peryferiów (dla F1 i F2 są), ale pewnie w kolejnych wersjach będzie to uzupełnione.
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...
Mi szczerze mówiąc brakuje podglądu rejestrów FPU w Keilu po ST-Link'u (no i może jeszcze podglądu licznika State'ów i czasu). Może to kwestia Keil'a a może ST-Link'a. Jutro sprawdzę na J-Link'u. Pozdrawiam.
Nie przy C, gdzie zanim zaczne cos robic, to zuzywam pare kilo flash-a :( To włącz optymalizator. C wcale nie jest AŻ TAK CIĘŻKI jak to ciągle piszesz, tylko programiści są ciężcy. Przecież jest tłumaczony na assemblera i optymalizowany w celu np reużycia wartości wpisanych w rejestry etc. W większości przypadków nie ma sensu pisać w asemblerze.
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...
Czy ktoś wie gdzie może być problem? Na pewno w tym, że nie czekasz ani na ustabilizowanie się zegara HSE, ani na ustabilizowanie się pętli PLL. Te operacje są obowiązkowe zarówno przed użyciem HSE jako źródła dla PLL jak i przed użyciem PLLa jako źródła dla rdzenia. https://github.com/DISTORTEC/distortos/b...
Myślę że przesunięcie rzędu czas trwania jednej konwersj nie było by problemem więc pytanie nadal aktualne A dlaczego nie wykorzystać możliwości. Jeżeli nie znasz HALa to najpierw zainstaluj sobie przykłady w Cube (ale nie mx) i przeanalizuj je. Wtedy domyślisz się jak zaincjalizować porty, ADC, DMA i timer aby trygierzował konwersje w odpiednim czasie....
Błąd masz w każdym obliczeniu. Ustawienie rejestru PSC na wartość x powoduje podzielenie zegara przez "x + 1". Ustawienie rejestru ARR na wartość x powoduje odliczenie "x + 1" taktów zegara. Z tego względu tego typu rejestry zawsze ustawia się na "x - 1" względem tego co sobie obliczyłeś. 4\/3!!
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.
A gdzie jest ten TC bit? W którym rejestrze? Jakoś nie widzę.
wgrywanie stm32f4 stm32f4 przetwornik stm32f4 discovery
ekspres krups konserwacja wymiana silnika kangoo litera zamiast cyfra
wyciag spawalniczy schematy instrukcje serwisowe
Ford Escape 2006 – licznik zawyża przebieg, przyczyny, czujnik VSS, rozmiar opon Mastercook piekarnik nie grzeje, symbol ślimaka na wyświetlaczu – jak odblokować?