Co do instrukcji barierowych to tylko wiem ze są takie i mają coś pożytecznego robić np zmusić proca do wykonania zalegających w cachu instrukcji np zapisu STM32F0 nie mają żadnego cache. Punktem wyjścia jest program bez tych instrukcji który też nic nie wpisuje do rejestrów. Widzisz tą podświetloną na żółto linijkę? Tam właśnie zatrzymał się układ....
W miarę wzrostu skomplikowania prjektów na ATmega rozpocznie się walka z ubogimi peryferialami, podczas gdy Cortexy mają po min. kilkanaście timerów 16- i 32-bitowych z weloma kanałami PWM. Akurat STM32 mają w większości timery 16-bitowe i zwykle 0 timerów 32-bitowych (wprost, bo timery 16-bitowe można łączyć w "łańcuch"), takie STM32F0 mają aż 1 timer...
Np. zaprogramuj SysTick lub dowolny inny timer na zgłaszanie przerwań z częstotliwością 100 Hz. Co 25 przerwań zmieniaj stan jednej diody, a co 100 - drugiej. Wszystko razem zmieści się w max. 20 liniach. Jeśli chcesz "zobaczyć" działanie timera z rejestrami compare - użyj dwóch rejestrów CC. W przerwaniu końca okresu zaświeć dwie diody, w przerwaniu...
Timery i dokładne odmierzanie czasu w różnych miejscach kodu. Zamiast korzystać z kilku timerów, można w różnych blokach kodu konfigurować 1 timer i wstrzykiwać odpowiednią funkcję przerwania. Oczywiście pod warunkiem, że nie będziemy musieli odmierzać czasu dla dwóch bloków jednocześnie. Wygląda na to, że potrzebujesz po prostu callbacka w jednym...
https://obrazki.elektroda.pl/9151185000_... Autor poniższego zestawienia jest inżynierem i konsultantem wsparcia dla systemów wbudowanych. W swojej karierze poznał on szereg różnych architektur mikrokontrolerów, różniących się wydajnością, wyborem peryferii, poborem zasilania etc. Wybór odpowiedniego układu stanowi zawsze o sukcesie...
https://obrazki.elektroda.pl/9151185000_... Druga część artykułu o najtańszych nowych mikrokontrolerach z roku 2017. Ekosystem developerski Środowisko developerskie mikrokontrolera ma ogromny wpływ na jakość pracy z nim i w konsekwencji - na produktywność. Na to składają się różne czynniki – jakość IDE, dostępne biblioteki, płytki...
Wyjście z CCR3 włączasz w rejestrze CCMR2, bity mają w nazwach CCMR2_OC3xx. No i timer wystarczy włączyć jeden raz, a nie trzy. Prescaler też wystarczy ustawić jeden raz. Paru rzeczy jeszcze nie włączyłeś w tym timerze. Obejrzyj przykłady PWM na STM32F0 w Elektronice Praktycznej.
Nie wiem o co Ci dokładnie chodzi, ale poprostu włączaj ten timer w momencie wejścia do tej funkcji opóźniającej, zaraz po przypisaniu tmier_cnt = cnt; albo nawet przed. bez przesady wykorzystywac 2 timery do delaya...
Witam Jak w temacie, ustawiłem timer 2 w tryb PWM. Sygnał powinien być na PA0,PA1,PA2 i PA3 a jest tylko na PA0. [syntax=c] ///TIM2 PWM RCC->AHBENR|=RCC_AHBENR_GPIOAEN;//zeg... PA RCC->APB1ENR|=RCC_APB1ENR_TIM2EN;//ze... TIM2 TIM2->PSC=48; TIM2->ARR=20000; TIM2->CCR1=1500; TIM2->CCR2=1500; TIM2->CCR3=1500; TIM2->CCR4=1500; GPIOA->MODER|=GPIO_MODER_MODER0_1|GPI...
Witam mam mały problem z uruchomieniem PWM na pytce ewaluacyjnej stm32F0. Wydaje mi się, że o niczym nie zapomniałem, a jednak nie działa. Celem programu jest wygenerowanie przebiegu PWM o 50% wypełnienia, poniżej zamieszczam kod. void initPWM() //inicjuje pwm na tim3 dzialajacy na kanale 2 //PORTA PIN 7 { //timer zlicza od wartosci CCRx...
Ja mam zestaw z STM32F0 wygrany w konkursie organizowanym przez kamami. Wcześniej programowałem już ARM'y ATMELa. W przykładzie jak powyżej wykorzystywany jest System timer tick. U atmela normalnie ustawiałem zezwolenie na przerwania od SysTick, a tutaj tego nie widzę. W RM od tego procesora µC w tabeli wektorów przerwań nie widzę, żeby SysTick...
A to co? LPC_SYSCON->PDRUNCFG &= ~80; Poprawiłem na 0x80, faktycznie w kursie jest [syntax=c] #define PDRUNCFG_SYSPLL_PD 0x00000080 LPC_SYSCON->PDRUNCFG &= ~PDRUNCFG_SYSPLL_PD; [/syntax] (at)BlueDraco: Ponawiam pytanie: Czy w tym numerze Elektronika Praktyczna 2014/4 "32 bity jak najprościej. STM32F0 - nieblokująca obsługa wyświetlacza...
oto kod programu [syntax=c]/* Includes */ #include <stddef.h> #include "stm32f0xx_rcc.h" #include "stm32f0xx_gpio.h" #include "lcd_hd44780_lib.h" /* Private typedef */ /* Private define */ /* STM32F0_DISCOVERY board definitions */ #define LED_PORT GPIOC #define LED1 GPIO_Pin_9 #define LED2 GPIO_Pin_8 #define KEY_PORT GPIOA #define KEY GPIO_Pin_0...
BlueDraco Mam wersję Keila 4.5 i tutaj nie ma jeszcze tych podpowiedzi kontekstowych (gdy się naciśnie CTRL + SPACJA). Mam na płycie z EP wersję 4.72a. Aby dobrze działał to odinstalować wersje 4.5 i instalować nową, czy odrazu. Jak jest lepiej, żeby poźniej nie było problemów z działaniem? http://obrazki.elektroda.pl/4851810600_1...
OpenOCD zaktualizowanie tak jak kompilator wcześniej. Przerabiam przykład od początku teraz na bazie tego o którym mówiłeś LPC Będe wklejał tutaj co dokładnie przerabiam. Jeśli coś robię źle to mam nadzieje że mnie poprawicie. Jeśli dobrze to mam nadzieje że komuś się przyda. 1.Import projektu lpc1114_blink_led i rename na stm32f0_blink_led 2. Zmiany...
Przy tej samej prędkosci zegara PIC-e maję wolniejszy FLASH - przy 48MHZ PIC-e 2WS a F0 1WS. Tak że będą czytać stałe z FLASH wolniej. oba procki chodzą na 24MHz, ze względu na pobór prądu Na prośbę moderatora: PIC32MX150, STM32F030K6T6 Tu prosta maszyna stanów - funkcja, która wykonuje się wolniej o jakieś 30...40% niż na PIC. Uprzedzam, sprawdziłem,...
Patrząc pobieżnie, używasz SPI1, które to w tym procku może korzystać z PB4, PB5 (mosi i miso). Konfiguracja SPI następuje po konfiguracji pinów "pod" enkoder. Może konfiguracja SPI "psuje", ustawienia portów PB4 lub PB5. To teoria na szybko, usunięcie linijek od SPI pewnie rozwieje moje podejrzenia...
Przetwornika nie ustawiasz, bo to nie jego rola. Możesz to zrobić na zylion sposobów. 1. Ustaw sobie alarm w zegarze RTC - i jak dostaniesz przerwanie to inicjuj konwersję. 2. Ustaw sobie wakeup timer w RTC i jak wyżej. 3. Sprawdzaj jakiś licznik zmieniany np. SysTick - jak jego wartość będzie większa niż poprzednia plus 600000 to inicjuj konwersję....
[syntax=c]#define ONE_WIRE_SET_LOW ( GPIOA->BRR |= ( 1 << 3 )) #define ONE_WIRE_SET_HIGH ( GPIOA->BSRR |= ( 1 << 3 ))[/syntax] Powinieneś użyć normalnego przypisania "=", a nie logicznej sumy "|=". Nie ma to tutaj specjalnego znaczenia, ale warto o tym pamiętać. Sprawdź w manualu, czy timer którego używasz (jak wszystkie timery na...
Tu na pewno jest błąd: if(released & btn == btn) to to samo co: (poprawiłem) if(released & 1) Jeśli nie masz nieblokującej obsługi LCD w przerwaniu timera, to skoro już bardzo chcesz pisać coś na LCD w przerwaniu - obniż priorytet tego przerwania.
Wyzwalasz timerem sprzętowo, odbierasz wyniki do bufora przez DMA, po odebraniu bloku o długości, którą sam wymyślisz - przetwarzasz wyniki. Dane możesz pewnie przetwarzać w przerwaniu DMA. Jeśli masz inne, ważniejsze przerwania - obniż priorytet przerwania DMA.
(at)excray To jest tzw. pluskwa milenijna :) Rozumiem że czytasz tylko 8 bitów z tego biednego ADC? Dopisek - a tak nie doczytałem że 8 bitowa rozdzielczość. Pewnie jest coś nie halo w tej części softu, której nie pokazałeś. Zmiani ARR zawsze wywoła odpowiednią zmianę w okresie pomiędzy przeładowaniami.
Porada była jedna i to już dawno. Przy ograniczonym zakresie nie ma potrzeby sprawdzania przepełnienia - wystarczy zwykłe odejmowanie dwóch złapanych czasów z przycięciem wyniku odejmowania do długości timera.
Jeśli to ma być PWM to powinieneś zmienić na: Dodano po 4 GPIOC->MODER |= LED1 | LED2; Co się kryje pod LED1 i LED2? Bo LED2 którego sterujesz ręcznie, aktywujesz tak samo jak LED1, który ma być sterowany timerem. A przecież to 2 odrębne tryby MODER: 01 - wyjście - LED2, oraz 10 - AF - LED1.
Cześć, mam dziwny problem z STM32F030K6T6. Są dwa timery TIM1 i TIM3. TIM1 ma podpięte 4 kanały PWM. Sytuacja jest następująca: zezwolenie na przerwania pochodzące od TIM3 powoduje zaprzestanie działania PWM na kanałach 1,2,3. 4 działa poprawnie. W agonicznym poszukiwaniu problemu wyłączyłem wszystkie inne przerwania a kod obsługi IRQ TIM3 wygląda teraz...
Wpisz do wnętrza pętli while(timer_cnt!=0); np. 'mruganie' portem żeby mieć pewność, że właśnie tam program się wykonuje.
Witam, Pracuję nad projektem urządzenia, w którym po raz pierwszy zastosuję mikrkontroler STM32 zamiast dotychczasowych AVR. Zadecydowałem się użyć układ STM32F030K6T6 oraz środowisko programistyczne CooCox. Na poczatek napisałem prosty program w załaczniku. Mam takie pytanie, jak w programie zadeklarować, że uzywam zewnetrzny kwarc np: 12Mhz? [syntax=c]...
albo powielić na jakimś szybkim Cortexie do 1kHz Następny. Jak się powiela na szybkim Cortexie, czego nie można zrobić innym procesorem? Albert To tylko sugestia. Jeśli w tej samej cenie mogę mieć dostępne 48MHz (przykładowo STM32F0) zamiast 16MHz (Atmega8) i nie muszę szczypać się, ile taktów zajmie mi zmiana GPIO, to czemu nie? O 32-bitowym timerach...
Tak prawą ręką przez lewą nogę zrobiłem koledze projekt do AC6 bez HAL-a (zajęlo to 4 minuty wliczając ładowanie AC6 i CubeMx) (załacznik na dole tego postu). W ac6 import project <ciach> Post raportowany. Takie sprawy proszę załatwiać przez PW, gdyż dla moderatora obsługującego raport powstaje niezręczna sytuacja, że post dot. sposobu moderacji...
A nie widzę nigdzie innego użycia przerwań niż tylko przy wciśnięciu klawisza klawiaturki. Przerwania zewnętrzne mają wyjątkowo ograniczone zastosowania. Nadają się np. do tego, żeby obsługiwać sygnały od innych układów scalonych, świadczące o tym że dany układ ma coś ciekawego do powiedzenia. Do przycisków nadają się wyjątkowo słabo, bo żeby to działało,...
Teraz wyjaśniłeś trochę lepiej, i procedurę obsługi timera też jakąś sensowniejszą napisałeś. Bo o tej pierwszej to lepiej się nie wypowiadać. Tym niemniej dalej uważam, że DAC'a czepiasz się niesłusznie. Ja przyczyny niepowodzenia upatrywałbym w idei sterowania Timerem6 - właczanie i wyłączane po paczce. Próbkowanie masz ciągłe, a timer puszczasz paczkami....
Nie zerujesz rejestru SysTick->VAL. Opóźnienia w takim stylu są ciut bez sensu, a LCD lepiej obsługuje się w przerwaniu timera, co było pokazane parę miesięcy temu w EP (na STM32F0). W przypadku nibyopóźnienia mikrosekundowego - prawdopodobnie gubisz przepełnienia timera, bo okres SysTick jest zbyt krótki.
Wygląda, że masz podobny problem jaki ja miałem niedawno na procesorze STM32F030R8... Zapomniałeś tylko dopisać, że ustawiłeś samodzielnie bit UDIS w rejestrze CR1 timera, który właśnie coś takiego powoduje. Nie wiadomo jednak po co go ustawiłeś.
A ja właśnie po 3 latach "przesiadam się" z LPC11xx na STM32F0, głównie z powodu niewystarczającej liczby interfejsów UART i SPI w LPC11. Na 11U6x, który rozwiązuje ten problem to sobie jeszcze trochę poczekamy. Timery też w w STM32F0 ciut mądrzejsze, no i zapowiadane USB bez kwarcu w małych obudowach wygląda zachęcająco.
Tu też jest to proste: 1. Czytamy Reference Manual, zwłaszcza rozdział o GPIO i timerach. 2. Włączamy timer i GPIO w RCC - 2 instrukcje C. 3. Inicjujemy wybrany timer, ustawiając preskaler i okres oraz programując wyjścia PWM, następnie włączamy timer - 6..7 linijek kodu. 4. Ustawiamy wybrane linie jako wyjścia timera - dwie instrukcje C, rejestry AFR...
Straszne skomplikowane. Proponuję prościej - bez pętli głównej, a w przerwaniu SysTick kilka sekcji jak poniżej. [syntax=c]void SysTick_Handler(void) { static uint32_t r1_timer = R1_PERIOD; if (-- r1_timer == 0) { r1_timer = R1_PERIOD; R1_OFF; } else if (r1_timer == R1_ONTIME) R1_ON; }[/syntax]
Dobra,ogarnąłem makra.W avr'ach wyglądały trochę inaczej. Zamieszczam cały poprawiony i niedziałający kod: [syntax=c] #include "stm32f0xx.h" #include"core_cm0.h" #define zapal GPIOC->BSRR|=(GPIO_BSRR_BS_9);//zapal diode #define zgas GPIOC->BSRR|=(GPIO_BSRR_BR_9);//zgas diode int main(void) { RCC->AHBENR |=(RCC_AHBENR_GPIOCEN);//wlacz port C RCC->AHBENR...
Czy ktoś tu namawiał do używania magicznych wartości w rejestrach? Czy taki kod jest nieczytelny? [syntax=c]TIM16->PSC = SYSCLK_FREQ / LED_FREQ / LED_STEPS - 1; TIM16->ARR = LED_STEPS - 1; TIM16->CCMR1 = TIM_CCMR1_OC1M_PWM1 | TIM_CCMR1_OC1PE;// PWM mode 1, buffered preload TIM16->CCER = TIM_CCER_CC1E | TIM_CCER_CC1P;// enable CH1 output TIM16->BDTR...
http://obrazki.elektroda.pl/3668151000_1... Witam. Chciałbym przedstawić sposób własnego pomysłu na w pełni sprzętowe sterowanie LEDów WS2812B za pomocą mikrokontrolera STM32F030. Nie trzeba nic konwertować, marnować cenny RAM czy cykle procesora, wystarczy dane RGB (3 bajty/led) wysłać jak po SPI. Można też do tego użyć DMA. Sposób...
Cześć. Tak jak napisałem w nazwie tematu posiadam ARM'a STM32F072RB. Podłączyłem kolejno kolumny, później wiersze klawiatury matrycowej 4x3 do portów GPIOC1-GPIOC7. Chcę odczytywać wciskane klawisze na klawiaturze i napisałem jak na razie taki kod: [syntax=c] #include "stm32f0xx.h" #include <stdio.h> volatile uint32_t timer_ms = 0x0; void delay(int...
Przyczyn szukaj w błędnym kodzie ew. braku połączenia mas. Ani sensownej części kodu, anie schematu nie pokazałeś. Kod źle sformatowany i przez to nieczytelny, inicjowanie UART dziwne, nadawanie błędne, odbiór przez krótką chwilę a potem w krzaki (chyba, bo końca kodu nie widać). Niby jaki odstęp pomiędzy bajtami ma dawać taka pętla? Potrzebujesz odstępu...
Nie, nie możesz wybrać, a manual napisano tylko po to, by wprowadzić Cię w błąd... ;) Tablice w datasheet zawierają numery funkcji AF odpowiadające poszczególnym funkcjom poszczególnych nów. Dla portów A i B wyprowadzenia mają po wiele możliwych funkcji. w rejestrze MODER ustawiasz AF dla danego wyprowadzenia, a w rejestrze AFR ustawiasz numery funkcji...
Witam, próbuje znaleźć dobry sposób na pomiar amplitudy impulsu PWM. Zakres zmian wypełnienia 5 % do 95 %. Czestotliwosc sygnalu sie nie zmienia i wynosi 1 KHz. Mój pomysł polega na tym, że po wychwyceniu zbocza narastajacego odpalam ( w przerwaniu od input capture) timer ktory co 10 us ( 5 % z 1 ms to 50 us) trigeruje pomiar ADC poprzez DMA (czyli...
Mozę powtórzę, bo nie lubię patrzyć jak ktoś traci czas - wszystkie porady sugerujące że problemem jest 8-/16-/32-bitowy dostęp do rejestru DR lub jakieś nieistniejące w tym układzie FIFO są po prostu błędne. Jeśli bez optymalizacji ruszyło, to powód jest dokładnie taki jak w słynnym przypadku timerów - to co kasuje flagę (zapis do DR) jest zbyt blisko...
Nie neguję dokumentacji. Nawet więcej, nigdy nie odpalam bez niej. Nawet gotowca konfrontuję z datasheetem. Po prostu mi chodzi że z przykładem jest prościej i szybciej. Nie ma co popadać w skrajności. Czyli też w uruchamianie wyłącznie na podstawie datasheeta. Bo czas też kosztuje. I szkoda na nowo odkrywać koło. Niektórych rzeczy wręcz bym nie odpalił...
Przesądy... ;) Nie "jak najszybciej" a "odpowiednio szybko"; np. jedyne w systemie przerwanie zgłaszane co 100 us może być obsługiwane przez 99 us i wszystko będzie ok. A co do diody - cały kod, który robi to, co trzeba w przerwaniu zgłaszanym co 10..20 ms, wygląda tak (na STM32F0): [syntax=c]static uint8_t bstate = 0, led_timer = 0; bstate = (bstate...
A dokładnie, to jak to robisz? volatile int8_t spi1_error=0; ... static uint8_t spiTransferByte(uint8_t addr,uint8_t data) // { // spi1_error=0; // GPIOC->BRR =(1<<12); // nSEL-->low uint32_t timer=spi_Timeout; // while(!(SPI1->SR&SPI_SR_TXE ) { if(--timer==0) return(spi1_error=-1);} // SPI1->DR=(uint16_t)(data|(addr<<...
Różnice w wydajności są marginalne i nieistotne w większości zastosowań. Na ogół nie ma nawet potrzeby korzystania z maksymalnej częstotliwości zegara. Podstawowe kryterium wyboru - to odpowiedniość liczby wyprowadzeń i peryferiali do zastosowania, potem czynniki takie jak możliwości zasilania, dostępność, cena, jakość dokumentacji. Z moich doświadczeń:...
Tylko tyle zdążyłem napisać: [syntax=c]/** ****************************************... * (at)file main.c * (at)author Ac6 * (at)version V1.0 * (at)date 01-December-2013 * (at)brief Default main function. ****************************************... */ #include "stm32f0xx.h" #include...
Trzeba pewnie włączyć jeszcze globalne zezwolenie na przerwania, tylko nie mogę się tego doszukać w RM. Domyślnie przerwania są globalnie "odblokowane". W przeciwieństwie do poszczególnych przerwań, więc jest taka funkcja NVIC_EnableIRQ() czy jakoś tak. P.S.1. Nie musisz deklarować przerwania na górze, przed main(), bo i po co? P.S.2. W obsłudze przerwania...
stm32f0 discovery stm32f0 przykład systick stm32f0
legrand różnicówka przestrojenie julia wyświetlenie stref
kluczyk kodowanie aktualizacja oprogramowania pioneer
Ekspres Saeco - Słabe Ciśnienie i Szybkie Napełnianie Tacki Błąd F43 w pralce Bosch - przyczyny i rozwiązania