Nie mi rozstrzygać, czy powinno być zdefiniowane. Ponieważ jednak nie jest zdefiniowane, wygodnie jest to sobie zdefiniować we własnym pliku .h. Ostatnio zacząłem stosować taką praktykę, że tworzę plik np. stm32f0yy.h, który włącza stm32f0xx.h i dokłada moje własne definicje, których brakuje w xx.h. Dopóki nie przejrzysz "wszystkich" bitów, nie stwierdzisz,...
Toggle zmienia stan diody na przeciwny. To nie to samo co set. [syntax=c] // STM_EVAL_LEDToggle(LED3); GPIO_SetBits(GPIOE, GPIO_Pin_9); // <--- modyfikacja zamiast powyższej lini !!!!!! [/syntax] Możesz ten kod zamienić na: [syntax=c] GPIOE->ODR ^= GPIO_Pin_8; [/syntax]
Musisz je znowu aktywować. Konfigurację UARTa można zostawić z HALa, jednak samą obsługę przerwań lepiej zrobić na rejestrach. Jak je ponownie aktywować ? HAL_UART_Receive_IT
Jak się bawisz Keilem, to prześledź sobie działanie programu w symulatorze jak nie masz debuggera. Zobacz też czy masz zdefiniowane przerwanie od systick i co ono robi, jak nie grzebałeś nic w pliku konfiguracyjnym, to z automatu on jest włączany na wartości domyślne.
z tego co widzę to 19 przerwanie czyli moje prowadzi pod inny adres niż wszystkie No tak, tyle ze to przerwanie jest "19-te", tyle że przed nim jest kilka systemowych. Wg tabelki w manualu tych układów, adres wektora przerwań dla TIM14 to 0x8c, natomiast u Ciebie wektor jest pod 0x68... Błąd masz taki, że za bardzo w nią zaingerowałeś... Zwróć uwagę,...
2. Łatwo o bląd. Nawet bardzo łatwo, i kolega atom1477 takowy popełnił:[syntax=c]NVIC->ISER[1] &= ~(1 << (57 & 0x1F)); for (i2=0; i2<255; i2++); NVIC->ISER[1] |= (1 << (57 & 0x1F));[/syntax]NVIC_ISER jest rejestrem, który umożliwia tylko odczyt i ustawienie bitu ;) Do wyłączenia przerwania służy NVIC_ICER.
Zewnętrzne przerwania nadają się - przykładowo - do obsługi pinów sygnalizacyjnych z innych układów scalonych, a nie do zabaw z przyciskami. To po prostu nigdy nie zadziała... Zrób sobie przysługę i odczytuj po prostu wszystkie piny w okresowym przerwaniu od timera (co 20-50ms, albo i rzadziej) i będzie wtedy działało perfekcyjnie.
Czy w procesorach STM32 wiekszość rozkazów wykonuje się w 1 cyklu zegarowym? Nie wszystkie. Jeśli chcesz mieć bardzo dokładnie oszacowany czas w cyklach to musisz zdeasemblować program, zajrzeć do dokumentacji, żeby sprawdzić ile czasu się wykonuje jeden rozkaz i sprawdzać rozkaz po rozkazie. Jak zależy Ci na prędkości i oszczędności co do rozkazu,...
No to masz 4-bajtowy znacznik początku ramki, w dodatku niejednoznaczny, tylko po co? Przy automacie masz zmienną - stan automatu, którą elegancko robi się jaku enum, a dalej switch zapewniający obsługę kolejnego bajtu i przejścia pomiędzy stanami. Do obsługi tego początku, jaki masz, potrzebujesz czterech stanów automatu (piąty stan to odbiór danych)...
to chwyć zakładkę edytora i przesuń utworzysz nowy okno edytora.
Włączasz stosowne porty w RCC?
Wg. dokumentacji uC w takiej konfiguracji powinno nastąpić przy stanie licznika 0, czyli wszystko się zgadza. Co to znaczy "zablokowanie przeładowania licznika" oraz że licznik "ma się zatrzymać, ale nie wyłączyć"?
typedef char t_Ramka[6] t_Ramka RamkaA[85] albo zdefiniuj jako unia
Kolego andrzej_nied, Proponuję zastosować timer do generowania przerwań co około 2.5ms. W przerwaniu testujemy wejścia portów nie zawracając sobie głowy jakimiś 'drganiami styków'. Sprawdzone, pewne, proste. Czas 2.5ms dobrany jest tak aby zwykły enkoder 20-32imp./obrót obracany energicznie ręką nie zgubił impulsu (gdy czas pomiędzy przerwaniami za...
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,...
Dopisz coś takiego: [syntax=c]... TIM2->ARR = 6550; TIM2->EGR = 1; //bit UG TIM2->CNT = 10; ...[/syntax]
Witam W trybie FS możesz mieć mały problem z freeRTOS i USB jeśli chodzi o wysłanie danych z Stm32 do PC. W nim nie masz DMA i żeby wysłać dane musisz albo sprawdzać sam czy pierwsze 64 bajty zostały wysłane i potem wysłać następne (np co 1ms) lub zostawić jak masz zrobione w bibliotece od Stm, czyli oni włączają przerwanie Tx FIFO Empty Interrupt,...
A czy da się to w ogóle zrobić? Za ref. manualem do F3: EXTI3 Nie napisali nic o kilku źródłach jednego przerwania. Pzdr.
Jak dla mnie brakuje w ogóle funkcji do obsługi przerwania: [syntax=c] void DMA1_Channel5_IRQHandler(void) { }; [/syntax] więc powinieneś dostać dodatkowo HardFault.
Quiz pod tytułem znajdź problem widoczny z daleka: RCC->APB2ENR|=(RCC_APB1ENR_TIM14EN);//wl... zegar tim14 4\/3!!
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...
Usuń znaczniki |= |= |= ) [syntax=c]NVIC->ISER[0] = (1 << 2);[/syntax] [syntax=c]NVIC->IP[2] = (9 << 4);[/syntax] Tutaj znowu niebezpieczne przypisanie, lepiej użyć operatora |=, ewentualnie ze wstępnym wyzerowaniem odpowiednich bitów. CMSIS nie gryzie, można go spokojnie używać dla przejrzystości kodu.
Jeśli używasz DIY toolchain wg. Freddiego, to zapewne właśnie wpadłeś w jego słynną pułapkę z brakiem stosu. NVIC_Configuration możesz spokojnie wyrzucić.
Załóż nowy to podyskutujemy (; 4\/3!!
Przerwanie od zbocza jest kompletnie niepotrzebne do niczego - wystarczy TYLKO przerwanie od timera, w którym również można zrobić wykrywanie zbocza i filtrowanie - wystarczy kilka zmiennych pomocniczych (poprzedni stan, jakieś liczniki). Jest to skrajnie proste i działa idealnie. Angażowanie dwóch przerwań do czegoś co można zrobić w jednym jest kompletnym...
Popularne stm32f103 lub wg. potrzeb może być coś mocniejszego z rodziny f2,f3,f4...
if( EXTI_GetITStatus( EXTI_Line5 != RESET ) ) Przyjrzyj się dobrze. 4\/3!!
o dzięki, szukałem dzisiaj tego bitu w PM, ale nie mogłem znaleźć. Rzeczy związane z samym rdzeniem są opisane na stronie ARM - w dokumentacji od ST można czasem coś znaleźć, ale zwykle nie ma to sensu. http://infocenter.arm.com/help/index.jsp... Mam takie pytanie co do atomowego przepisania zmiennej nr. 1 do...
1.Czy w CMSIS jest jakieś makro wywołania, czy trzeba to pisać ręcznie? Ręcznie. O tak - https://github.com/DISTORTEC/distortos/b... 2.Czy to przerwanie się inicjalizuje? Co przez to rozumiesz? 3.Czy trzeba mu ustawiać priorytet (domyślny ma chyba najniższy i o to mi chodzi)...
Witam, W przypadku wykorzystywania przerwań EXTI trzeba włączyć zegar dla AFIO RCC_APB2Periph_AFIO. Cytat z STM100xx Referene Manual (RM0041, rozdział 7.4 pierwsza notka) To read/write the AFIO_EVCR, AFIO_MAPR, AFIO_MAPR2 and AFIO_EXTICRX registers,the AFIO clock should first be enabled. Więc aby poprawnie skonfigurować przerwania EXTI (zapis do rejestrów...
// Interrupt mask register, that EXTI lines are active: 0 and 1 EXTI -> IMR = EXTI_IMR_MR0; //A0 EXTI -> IMR = EXTI_IMR_MR2; //C2 Druga linia kasuje to co zrobiła pierwsza. Przy okazji łatwiej by było jakbyś napisał DOKŁADNY opis problemu, bo tak naprawdę to nie wiadomo co Ci nie działa. Dodano po 1 __attribute__ ((interrupt)) void EXTI0_IRQHandler(void)...
Próbuję pożenić template Freddiego (stm32_blink_led) z StdPeriph Ale to widziałeś? http://www.freddiechopin.info/pl/artykul... Ma ktoś pomysł co może być nie tak ? W skrypcie linkera należy ustawić rozmiar stosu dla przerwań - domyślnie jest zero, co zwykle źle się kończy. Ustawiłeś...
Przez czas jak pisałeś te dwa posty już ze 4x przejrzałbyś CAŁĄ listę przerwań, bo nie wiem skąd założenie, że koniecznie muszą być po kolei. P.S. Co złego jest w funkcji z CMSISa robiącej to samo co Ty tylko czytelniej? Przy okazji jak być jej użył, to nie robiłbyś zupełnie bezsensownego ORa... P.S.2. Funkcja z CMSIS jest typu inline - nie da się tego...
Sporo się namęczyłem, zanim ruszył mi slave transmitter w STM32F103. W 107 będzie tak samo. Po pierwsze zobacz do errat - tam między innymi napisali, że przerwanie i2c musi mieć najwyższy priorytet, bo inaczej się wiesza. Poza tym przykłady nie zadziałały mi od razu, a problemy mają też inni, o czym możesz poczytać na main.c // main.c main()...
W przerwaniu przydałoby się kasowanie flagi od przerwania (rejestr EXTI_PR)
Będzie tak jak piszesz. Przerwanie po doliczeniu do 999 po czym zerowanie licznika i liczy od nowa
A gdzie masz ustawienie bitów SW na PLL w RCC?
Poczytaj w dokumentacji, sprawa jest tam poruszona. SysTick i PendSV mają być na najniższym, a inne przerwania - które używają funkcji RTOSa - nie mogą mieć wyższego priorytetu (niższego numerka) niż configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIO... lub configMAX_SYSCALL_INTERRUPT_PRIORITY. Obstawiam, że jedna z tych wartości nie jest używana i w ogóle jest...
W pliku startup_xxxxx.s
można jeszcze jedno z definicji ustawić z atrybutem "weak" Po co? ale pewnie wymagałoby to dodatkowego uzasadnienia oraz dodatkowej opcji kompilacji, a właściwie chyba linkera... nie wymagałoby
Ten temat może pomóc w rozwiązaniu tej zakręconej kwestii http://www.elektroda.pl/rtvforum/topic14... pozdr.
Też nie bardzo wiem jaka jest nazwa (wektor) funkcji tego przerwania, więc mam tak: Przecież wystarczy zajrzeć do tablicy wektorów i wszystko stanie się jasne... Można też zajrzeć do manuala, aby dowiedzieć się, że system CSS jest zmapowany na przerwanie NMI. Nie wiem czy czekanie na odpowiedź na forum jest naprawdę szybsze... 4\/3!!
Proponuję Ci zerknąć na ten kod - https://github.com/DISTORTEC/distortos/b... - robi dokładnie to co chcesz osiągnąć i w dokładnie ten sam sposób. Tutaj kod przerwania - https://github.com/DISTORTEC/distortos/b...
RTC jest podpięty pod EXTI: https://obrazki.elektroda.pl/7724120400_...
Bit RXNEIE włącza przerwanie od dwóch flag: RXNE i ORE (overrun) - patrz tabelka USART interrupt requests . Odczyt z DR kasuje RXNE. ORE jest kasowane przez (cytat z opisu bitu ORE): "an read to the USART_SR register followed by a read to the USART_DR register".
Prawdopodobnie o żaden konkretny tylko o samo porównanie. Prościej więc po prostu programowo sprawdzać ten warunek (w końcu wartości pewnie też będą generowane programowo). A co do Timera to faktycznie on tylko porównuje na równość (==). Więc na nim tego nie zrobisz.
Niestety nie wiem, jak skonfigurować przerwanie zewnętrzne, gdyż nie mogę nigdzie znaleźć pod która linie EXTI jest ono podłączone. Manual, rozdział 26.5 RTC interrupts .
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. Ja robię to tak: I. Potrzebne narzędzia: 1. System Workbench for STM32...
Nie napisałeś nic o metodzie konwersji zatem założyłem, że stworzyłeś nowe szablony w CubeIDE, przekopiowałeś pliki źródłowe oraz zmodyfikowałeś ustawienia projektu. Sam bym tak zrobił. Jeśli taka byłaby metodyka to jeszcze należy sprawdzić w ustawieniach projektu: C/C++ General->Path and symbols, gdzie należy zmodyfikować sekcję SYMBOLS, wpisy muszą...
Btw. dlaczego atrybyt "interrupt" jest zbędny i powiększa kod? Dla Cortexów to co robi ten atrybut (zapewnienie wyrównania stosu do 8 bajtów) da się zrobić sprzętowo. W większości Cortexów jest to domyślnie włączone, w przypadku STM32F1 trzeba sobie to akurat włączyć przy użyciu takiej oto linijki "SCB->CCR |= SCB_CCR_STKALIGN_Msk;". Ponieważ atrybut...
Nie wiem czy są ustawione dobrze. Ale wiem że to nie one są tutaj problemem. Wysyłanie jest niezależne od filtrów.
U mnie to makro znajduje się na końcu funkcji obsługującej przerwanie, semafor staram się ustawić jeszcze przed jego wywołaniem. Nieprawda: Oczekiwanie na semafor ? Czy chodzi Ci o xSemaphoreTake(globalSemaphore, portMAX_DELAY) czy o coś innego ? Właśnie o to.
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...
Odpowiem może "wierszem" - poniżej dosyć dobrze przetestowane przerwanie od SPI występującego w STM32F4: https://github.com/DISTORTEC/distortos/b... A tu funkcja nadawania: https://github.com/DISTORTEC/distortos/b...
vol.......
Nie. Często do bloku SPI/I2S możesz podać tylko zegar z głównego oscylatora lub wygenerowany przez PLL. Musisz sprawdzić w Refrence Manul czy masz dostępny dedykowany pin I2S_CKIN (w STM32F4 chyba jest). Oczywiście w popularnym zastosowaniu nie ma to większego znaczenia natomiast przy Audio HiFi, HiEnd gdzie wymagany jest mały jitter i dokładne zegary...
No i mamy przykład jak nie wolno kasować znaczników przerwań: TIM7->SR &= ~TIM_SR_UIF; // clear UIF flag Poprawnie robi się to tak: TIM7->SR = ~TIM_SR_UIF; Jeśli używasz przerwania końca okreu (update), to w przypadku TIM1 będzie to: TIM1_UP_TIM16_IRQn
A czy jest włączone taktowanie SYSCFG? RCC->APB2ENR |= RCC_APB2ENR_SYSCFGEN;
To działa: [syntax=c] #define Port_USART3 USART3 #define Port_USART3_CLK RCC_APB1Periph_USART3 #define Port_USART3_TX_PIN GPIO_Pin_10 #define Port_USART3_TX_GPIO_PORT GPIOB #define Port_USART3_TX_GPIO_CLK RCC_AHB1Periph_GPIOB #define Port_USART3_TX_SOURCE GPIO_PinSource10 #define Port_USART3_TX_AF GPIO_AF_USART3 #define Port_USART3_RX_PIN GPIO_Pin_11...
I właśnie dlatego Twoja procedura jest widziana pod zupełnie inną nazwą. extern "C" przed deklaracją procedury, ale skoro zadajesz takie pytania - to nie wiesz zbyt wiele o C++, więc może lepiej pisz takie rzeczy w C.
najpierw włącz SYSCFG potem ustaw który port potem reszta.
I pomyśleć, że wystarczyłoby napisać: if (RTC_GetITStatus(RTC_IT_SEC)) i problem by znikł... Ogólnie proponuję zacząć od usunięcia tej chorej definicji SET i RESET oraz wszelkich odwołań do tych stałych, bo wynikają z nich wyłącznie problemy (porównania z SET niemal zawsze są błędne), a kod staje się nieczytelny.
Jeśli mierzysz to timerem to nie ma takiej możliwości. Za to na ADC można coś takiego ustawić i nazywa się to "analog watchdog". 4\/3!!
Niczego nie trzeba adoptować poza przerwaniem. I konfiguracja portów i RCC i samego USB. Góra godzina pracy.
Deklaracja jako extern "C" zmienia tylko specyfikację interfejsu binarnego funkcji, a konkretnie sposób wywołania i przekazywania argumentów oraz sposób generowania nazw symbolicznych dla linkera (po polsku: konsolidatora :) ). Ale nie zmienia to języka źródłowego, tzn. jest to dalej C++.
[syntax=c] RCC->APB1RSTR |= RCC_APB1RSTR_TIM2RST; //* [/syntax] ..... [syntax=c] NVIC->ICPR[0]=TIM2_IRQn; // * NVIC->ISER[0]=TIM2_IRQn; [/syntax] od tego jest CMSIS i jest całkowicie źle. [syntax=c]TIM2->SR &= ~TIM_SR_UIF; [/syntax] Nigdy na końcu przerwań. Unikałbym operacji read-modify przy zerowaniu flag. A to, że program niby nie...
Zajrzyj do skryptu linkera, zobacz jaki jest rozmiar stosu. 4\/3!!
1. Zbędny atrybut volatile w deklaracji AdcVal. 2. Czy AWD jest jedynym źródłem przerwania ADC? 3. Kasować bit zgłoszenia przerwania należy na początku procedury obsługi przerwania. nie wiem, aj to jest W STM32, ale w wielu innych Cortexach Zgłoszenie przerwania nie zdąży się w takiej sytuacji skasować i powtórnie wejdziesz w obsługę przerwania.
Twoje problemy rozwiązałby jakiś TMS320 z serii C2000. Ale to tylko moje dywagacje. Jeśli chodzi o STM32F4 to musisz przemyśleć czy rzeczywiście 4 MHz jest niezbędne dla ADC. Kiedyś bawiłem się timerami w Keil'u więc kod wstępny na pewno Ci się przyda (kanały timera3 działają na GPIO->C6-C9): odznacz NVIC_EnableIRQ !!! ): [syntax=c]void TIM3_IRQHandler(void)...
... http://obrazki.elektroda.pl/5529716100_1...
RTC_IRQ_Handler(void)? A nie przypadkiem: RTC_IRQHandler(void)?
Audio Serial Data Bus Supports I2S
myślałem że mogę wpisać praktycznie częstotliwość taktowania procka. Po zastanowieniu wiem że to niemożliwe. Podzielnik przez 8 można włączyć. Dodano po 4 Nie każdy pływa z zamiarem udziału w olimpiadzie ;-) Jest coś takiego jak hobby, ciekawość... na różnym poziomie wiedzy. Tu użyj CubeMX. Prosto, szybko i przyjemnie. Dużo kursów jest na Forbocie,...
sprawdź w dokumentacji czy aby po zresetowaniu flagi przerwania timera nie trzeba odczekać kilka instrukcji (2-3 NOP'y). Jeżeli tak jest, to w przeciwnym wypadku zaraz po wyjściu przerwanie otworzy się drugi raz i w tej sposób dioda mrugnie tak że tego nie zauważysz. Możesz to sprawdzić tak że diodę ustawisz na zapłoną (a nie stan przeciwny), to po...
[syntax=c] GPIOA->MODER = (GPIOA->MODER & ~(0x03 << 2*2)) | (0x00 << 2*2); //PA2 Input GPIOA->PUPDR = (GPIOA->PUPDR & ~(0x03 << 2*2)) | (0x00 << 2*2); //PA2 Floating void EXTI2_3_Config(void) { RCC->APB2ENR |= RCC_APB2ENR_SYSCFGEN; SYSCFG->EXTICR[0] = 0x0000; EXTI->IMR |= EXTI_IMR_MR2; //EXTI->RTSR...
Nie chcę inkrementacji. Wysyłam cały czas tą samą zmienną kilkukrotnie z jednej lokalizacji pamięci. W przerwaniu jest przeliczana na inną wartość w taki sposób: Ok. Niemniej jednak skopiowałem ten kod z #8 do CubeIDE 1.5.0, zrobiłem parę korekt pod moje PCB, dokonałem poprawnej implementacji flagi BUSY i wszytko działa jak powinno z inkrementacją...
Jesli ostatni próbuje się wykonać memcpy, to na 99% jest to zapisz danych pod zero lub inna pamięc RO. Dowiedz się ile wynosi parametr pxQueue->pcWriteTo. Jeśli ta liczba to nie jest adres RAMu (0x20000000+ wskaznikiem , z ktorego korzysta RTOS. Skoro ten wskaznik u ciebie ==0, no to krzaki gotowe...
Tak to jest jak się z tej ogłupiającej biblioteki korzysta. Zajrzałem do core_cm3.h , tam funkcja SysTick_Config(ticks) przyjmuje postać: static __INLINE uint32_t SysTick_Config(uint32_t ticks) { if (ticks > SysTick_LOAD_RELOAD_Msk) return (1); /* Reload value impossible */ SysTick->LOAD = (ticks & SysTick_LOAD_RELOAD_Msk)...
SysTimer jest wykorzystywany w FreeRTOS jako zegar systemowy. Ale jeżeli potrzebujesz timera(dla zliczania czasu będącego wielokrotnością zegara systemowego) dla jakiejs innej biblioteki możesz wykorzystać vApplicationTickHook(), gdy tylko masz symbol configUSE_TICK_HOOK zdefiniowany na 1 (plik FreeRTOSConfig.h). Funkcja ta jest wywoływana w przerwaniu...
Jeśli krytyczność kodu wynika z pobrania zmiennej większej niż 32-bit modyfikowanej w przerwaniu, to nie ma potrzeby blokować wszystkich przerwań a tylko wybrane, np [syntax=c] HAL_NVIC_DisableIRQ( SysTick_IRQn ); uint64_t t = TimSys; HAL_NVIC_EnableIRQ( SysTick_IRQn ); [/syntax] kto nie lubi HAL użyje [syntax=c] NVIC_DisableIRQ( SysTick_IRQn ); uint64_t...
Witam, jakoś nigdy nie zagłębiałem się bardziej w temat System handlers i Fault handlers ale teraz powstało parę pytań. Załóżmy że zbudowałem urządzenie, które ma być skierowane do produkcji. Zostało ono prze zemnie przetestowane i działa prawidło. Stąd czy powinienem jakoś zwrócić uwagę na wymienione prze zemnie grupy przerwań, czy jeśli system jest...
Nie bardzo wiedziałbym jak tego użyć. Chyba że jakiś przykład miałby ktos, kto to już robił. A może tak: [syntax=c] #include <time.h> ... struct tm * loctim ; // struktura zawiera pola typu tm_year czy tm_min time_t tt ; // odczytywanie licznika tt = RTC->CNTH; tt = tt << 16; tt = tt | RTC->CNTL; loctim = localtime(&tt) ; ......
ADC1_2_IRQHand _ er Chyba koło fortuny się ta gra nazywała (; 4\/3!!
Mnie tam brakuje ustawienia przerwania: [syntax=c]TIM1->DIER = 0x00000001;// enable update interrupt[/syntax] Ogólnie takie coś powinno działać: [syntax=c]TIM1->CR1 = 0x00000000;// default TIM1->PSC = 0x000000FF;// set max prescaler TIM1->ARR = 0x00000FFF;// set max reload count TIM1->CCMR1= 0x00000068;// set PWM mode 1 TIM1->CCR1= 0x000000FF;// set...
Zacznij od sprawdzenia stosu.
12 cykli - tyle zajmuje przejście do obsługi przerwania 6 cykli - tyle zajmuje przejście z przerwania do przerwania o wyższym priorytecie 6 cykli - tyle zajmuje przejście do przerwania o niższy priorytecie bezpośrednio po zakończeniu przerwania o wyższym priorytecie 12 cykli - tyle zajmuje wyjście z przerwania. Ta zasada tyczy się wszystkich przerwań
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...
Od pewnego czasu walczę z chińską płytką (blue-pill) z STM32F103 na pokładzie Przeczytaj ten wątek i kup sobie inną płytkę. https://www.elektroda.pl/rtvforum/topic3... Jeśli koniecznie chcesz się męczyć z chińskimi podróbkami, to na mojej stronie ( http://www.freddiechopin.info/ > Download > ARM > Przykłady > stm32_blink_led) znajdziesz szablon...
Zerowanie flagi na końcu przerwania - niedopuszczalne
No to musisz mieć tablicę wektorów w RAM [; 4\/3!!
Debouncing w przerwaniu - tylko nie mów, że robisz to przez aktywne oczekiwanie wewnątrz przerwania. Jeśli tak, to zauważ, że to, że skasowałeś flagę przerwania i jesteś w przerwaniu wcale nie oznacza, że flaga nie może zostać ustawiona ponownie. Możliwy jest taki scenariusz: wciskasz przycisk, pojawia się zbocze opadające które ustawia flagę a więc...
1.Tworzysz Mutexa żeby tylko jeden task miał dostęp do interfejsu SPI I2C ... 2. Tworzysz semafor na dany interfejs. 3. Tworzysz driver do obsługi interfejsu, najlepiej z obsługa przerwań od tego interfejsu. 1. Blokujesz dostęp do interfejsu mutexem 2. Zlecasz driverowi co gdzie ma wysłać lub skąd odebrać. Driver w tym czasie blokuje semafor aż do wykonania...
Nie wiem czy to chciałeś osiągnąć, ale pin masz ustawiony na floating. Definicja w komentarzu była dobra, wartość liczbowa - zła. Przykłady znajdziesz w wyszukiwarce forum, w ostatnich tygodniach tematów o EXTI było kilka. 4\/3!!
W STM32 domyślnie podczas zatrzymania rdzenia timery pracują, więc podczas twojej pracy krokowej zgłaszane są setki kolejnych przerwań. Aby to zwalczyć należy w rejestrze DBGMCU->CR (w manualu DBGMCU_CR) zapalić stosowny bit dotyczący stosownego timera. Niestety nie zawsze jest to możliwe (bo aplikacja może wymagać aby timer naprawdę stale pracował...
Co robi funkcja send_uintUSART2? Nazwa sugeruje, że raczej nie wysyła znaków. Pomysł z nadawaniem z aktywnym oczekiwaniem i odbiorem w przerwaniu zajeżdża amatorszczyzną, ale czasami działa. Za to brak zabezpieczeń przed przepełnieniem bufora odbioru to już poważny błąd.
Wskazówka: zostaw biblioteki. Wtedy będziesz wiedział, które bity wpływają na priorytet wywłaszczania. Być może wartości, które ustawiasz w polach PreemptionPriority, w ogóle nie wchodzą na najbardziej znaczące 3 bity priorytetu w rejestrach NVIC, a tylko te 3 bity decydują o wywłaszczaniu. Skąd wiesz, że nie ma wywłaszczania?
Albo stos, albo watchdog.
1. Przycisków nie obsługuje się na przerwaniach portów. 2. Nie potrzebujesz do tego trzech przerwań - wystarczy przerwania timera i UART. 3. Nie zmieniaj priorytetów przerwań - jeden poziom zdecydowanie wystarczy. Nie potrzebujesz zagnieżdżania, a próbując je zrobić brniesz w ślepą uliczkę, bo 5. Ogólną zasadą jest, że w procedurze obsługi przerwania...
Stos, pamięć, kto to wie? Raczej HAL-a nikt nie będzie debugował. Takie podmianki część plików stąd część nie wiadomo skąd - raczej nigdy nie działają. Zrób sobie projekt z Cube i zaimportuj. Nie sądze abyś miał problemy. Albo napisz sobie to samo na rejestrach i zobacz. Praca na 10 minut.
Chyba z RM'em ;P Tablice w C numerowane są od zera a nie od jedynki; rejestry natomiast są numerowane od 1 - stąd rozbieżność. Spróbuj: [syntax=c]AFIO->EXTICR[1] = AFIO_EXTICR2_EXTI6_PC;[/syntax]
przerwa stm32 stm32 przerwa timer przerwa swiecach
błędu falownika lenze czynnik propan generator unitra
regenerowane tusze regenerowane tusze
Jak podłączyć Nintendo DS Lite do monitora? Samsung HG22EA470UW - Miganie diody 5 razy - Przyczyny i rozwiązania