Hard Fault może oznaczać włączenie przerwania do którego nie napisano obsługi. Mylisz się. Standardowa rozbiegówka definiuje "słabe" handlery przerwań zawierające puste nieskonczone pętle. To nie ma nic wspolnego z hardfault'em. Hardfault leci generalnie na 1) dostęp do nieistniejącej pamięci, 2) nierozpoznaną instrukcję rdzenia, 3) nad użycie magistral...
Nie znam tej biblioteki, pół minuty temu pobrałem jej źródła, ale z tego co patrzę, to struktura FILINFO zadeklarowana jakoś tak: [syntax=C]// FatFS R0.08b, ff.h typedef struct { DWORDfsize; /* File size */ WORDfdate; /* Last modified date */ WORDftime; /* Last modified time */ BYTEfattrib; /* Attribute */ TCHARfname[13]; /* Short file name (8.3 format)...
Proponowałbym NIE używać komendy soft_reset_halt, gdy nie jest to konieczne (na STM32 nie jest to konieczne), bo czasem wynikają z niej naprawdę DZIWNE problemy. 4\/3!!
Przede wszystkim program po wgraniu pod eclipsem i przejściu do perspektywy Debug jest od razu wystartowany. To chyba nie jest zdrowy objaw, bo jak debugowanie działa poprawnie to zawsze program jest zatrzymany na początku funkcji main. To jest mało istotny problem i tym bym się akurat nie przejmował. Daj znać jak wyjdzie test z uruchamiania GDB bez...
To chyba nie wina stosów. Jest różnica nazewnictwa funkcji obsługi przerwań pomiędzy FreeRTOS a biblioteką CMSIS. U mnie w identycznej sytuacji pomogło dodanie do pliku port.h (z katalogu SOURCE/portable/gcc/ARM_CM3) tych linijek: // To be complaint to CMSIS and ST standard peripherals library name convention. #define vPortSVCHandler SVC_Handler #define...
Witam Pisałem już o problemie ale nieco zamieszałem. Nie potrafię nic zapisać przez FSMC do kontrolera LCD. Kontroler nie jest fizycznie podłączony do stm32 (na razie). Przy próbie zapisu dostaję HardFaulta. Nieprzespana noc i nic :evil: Na zrzucie poniżej moment tuż przed HardFault http://obrazki.elektroda.pl/2504254100_1...
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.
Witam, piszę program na STM32 F100RB(Discovery), który ma za zadanie dane odebrane od GPS(USART2) wysłać przez moduł radiowy(USART1). Nie wiem dlaczego, ale po przyjściu przerwania od odbioru USART2 program ucieka do przerwania HardFault_Handler(void) . W debuggerze całość działa poprawnie, natomiast w trybie "run" problem ten sie pojawia. Dodatkowo...
Przepraszam, coś namieszałem przy kopiowaniu, już poprawione. Kod się o dziwo kompiluje.
(at)szczywronek , a masz erratę do erraty? ;) Oczywiście żartuję, ale zauważyłem, że w erracie masz przy poprawce nr 13: rozdział 5.2, tabela 5.1, opis wyjątku Reset A w poradniku ten opis jest dla HardFault
Jeżeli skok jest z przerwania to HardFault jest spowodowany tym, że zmieniasz wskaźnik stosu w obsłudze przerwania.
Keil jako kompilator i IDE. Wszystko do tej pory działało, program rozwijam od co najmniej miesiąca i dopiero teraz jest problem. Malloc dla 20 elementów działa bez zarzutów. Jednak teraz mam potrzebę przesyłać paczki większe 0,5k - 2k i gdy alokuje taką ilość bajtów, wywoływane jest przerwanie HardFault.
Już znalazłem błąd. Nie ustawiałem FSMC_BCR1->WREN; [url=http://www.elektroda.pl/rtvforum/to... Obsługa LCD poprzez FSMC - HardFault
BlueDraco nie mieszaj, nsvinc nie daj się wkrecać, bo nie o tym mowa. DMA obsługuje transfery 8-, 16-, 32-bitowe. HardFault tak jak pisałem generuje np. próba zapisania do adresu "tylko do odczytu". W przypadku wciągnięcia śmieci ze zmiennej albo rejestru peryferium najczęściej dostajemy adres 0x00 lub z przedziału 16b i nie ma nic do rzeczy to czy...
Kaj już kol (at)LChucki napisał - dynamiczna alokacja nie jest szczególnie dobrym pomysłem szczególnie jeżeli często alokujesz/zwalniasz. HardFault zostawia śladd na stosie i w rejestrach. Zobacz po prostu gdzie on wystąpił i co go spowodowało. https://mcuoneclipse.com/2012/11/24/debu... Albo zainstaluj sobie IDE, które...
A masz gdzieś w programie zdefiniowany HardFault handler? Bo mi w truestudio program też niby leciał w WWDG handler ale to przez to, że nie miałem właśnie obsługi hardfault.
Tutaj masz opisane jak należy postępować z NVIC dla FreeRTOS w CM3: http://www.freertos.org/index.html?http:... Ogólnie ustawiasz Priority Group 4. Przerwania, które wykorzystują funkcji systemowych przy Twoim ustawieniu 191 muszą mieć preemption priority od 'b' wzwyż. Ta wartość 191...
Zawsze możesz próbować grzebać na stosie i w rejestrach (adres "powrotu" powinien być w LR), ALE... HardFault wyskakuje jak pojawia się inny - krytyczny - problem, który jest nieobsługiwany. 4\/3!!
Pomiar linii 3,3V przed dodaniem kondensatorów wskazał na szpilki sięgające do 3,6V przy wyższych prądach co w zasadzie łapie się w granicach, w których producent deklaruje poprawną pracę urządzenia: 2-3,6V. Pytanie co jeszcze mogę poprawić jeśli chodzi o filtrację linii 3,3V bo wszystko obecnie wskazuje, że tu leży problem? Może koralik ferrytowy...
Ja za to obstawiam, że po prostu jest źle ustawiony stos i instrukcja push powoduje dostęp do nieistniejącej pamięci. Z mojej stronki można pobrać przykładowy projekt dla STM32F103, ale po wywaleniu konfiguracji PLL będzie on równie dobry dla STM32F100 - projekt nazywa się stm32_blink_led. 4\/3!!
... z racji, że HardFault zawsze mi się źle kojarzył, chciałem to zrobić w inny, może prostszy sposób :) Możesz zawsze sprawdzić czy argument jest w zakresie RAMu
Patrzyłeś o co chodzi w tym przerwaniu w dokumentacji NVIC? Podpada mi jeden bit w rejestrze od HardFault: DEBUGEVT: This bit is set if there is a fault related to debug. This is only possible when halting debug is not enabled. For monitor enabled debug, it only happens for BKPT when the current priority is higher than the monitor. When both halting...
Witam Robię teraz testy na HardFault z STM32. "Skaczę" sobie pod jakiś adres, po kilku próbach. Jak jestem w while(1), sprawdzam rejestry. W R12 -zawsze jest adres w który skacze, hmmm... w LR - jest zawsze FFFFFFFD
Gdy dodałem jako atrybut do funkcji "weak" żeby kompilator nie dodawał na wejciu odkładania na stos Atrybut "weak" służy do zupełnie czego innego. To o co Ci chodzi to atrybut "naked" - funkcja z tym atrybutem w zasadzie powinna zawierać tylko assemblera. Co do plików których używasz, to ja mogę polecić jak zwykle to samo, czyli mój szablon dla STM32F1...
Program received signal SIGINT, Interrupt. 0x1ffff1ee in ?? () to wskazuje na hardfaulta
Ustawiłeś odpowiednio piny BOOT0 i BOOT1? Po tym: target halted due to breakpoint, current mode: Handler HardFault xPSR: 0x20000003 pc: 0x20000004 msp: 0x20004fe0 wydaje mi się, że Twój układ próbuje wykonywać kod z RAMu. 4\/3!!
Hehehhehehe i kolejny hardfault z racji wykorzystania bibliotek do STM32...! Ciekawi mnie niezmiernie, co dokładnie robi magiczna funkcja USART_SendData, a sądzę, że nikt, z ludzi na tym forum, dobrze znających się na STM32, nie będzie w stanie odpowiedzieć na to pytanie ;] Niestety z racji tego, że biblioteka którą wykorzystujesz, jest tu potępiana...
Poza tym sprzętowy I2C potrafi uwiesić procesor 'na amen':) tak że nawet watchdog nie potrafi zresetować procesora Możesz, proszę rozwinąć myśl, bo trudno mi sobie to wyobrazić. Zawsze myślałem, że watchdog resetuje rdzeń jak się przepełni i nie da się tak zawiesić STM32 żeby watchdog nie był w stanie zresetować procka, nawet, a zwłaszcza jak ten utknie...
Próbuje uruchomić przerwania: vector.c wygląda tak [syntax=c]static void __Default_Handler(void) __attribute__ ((interrupt)); static void __Default_Handler(void) { while (1); } /* +=======================================... | assign all unhandled interrupts to the default handler +=======================================...
To jest ARM. Instrukcja LDRB/STRB. Tablica bajtów powinna się zaczynać w miejscu wyrównanym do 4 (lub do czegokolwiek), ale dalej jest dokladnie jeden adres na bajt, i ani rdzeń ani kompilator nie komplikują dostępu do adresów nie wyrównanych do 4, niezależnie od tego, czy dane są we flashu czy w ramie. Przestrzeń adresowa ARMów jest ciągła, instrukcje...
Witam Może masz błąd w konfiguracji FSMC w moim przypadku zapomniałem o zezwoleniu na zapis FSMC_BCRx->WREN i też program się zatrzymywał na strb (HardFault) Pokaż konfiguracje fsmc. Pozdrawiam
Witam Niestety do tych funkcji w których mialem wstawić breakpoint nie dochodzi, bo wywala się już przy LCD_Init(). A dokładniej przy odczycie rejestru przez FSMC wyzwalany jest HardFault_Handler. A ten adres jest dobry.. [syntax=c]#define LCD_BASE ((uint32_t)(0x60000000 | 0x08000000))[/syntax] jeśli FSMC_Bank1_NORSRAM1 =0 to ja używam 0x60000000 Pozdrawiam
Czy działa Systick to łatwo sprawdzić w debuggerze. Zresztą wiele spraw można sprawdzić. Ja bym zaczął od tego czy właściwe rejestry podlegają zmianom. To nie jest nic trudnego, w krokowym trybie Też jaka wartość jest SystemCoreClock, to zmienna globalna. Może ląduje gdzieś w HardFault, zaraz po uruchomieniu. EDIT. Często problemem przy kopiowaniu plików,...
No dobra, ale wywoływanie HardFault to jest wina kodu, a nie OpenOCD... 4\/3!!
Jak kod generujesz w CubeMX to daj breakpoint w pliku stm32...xx_it.c w funkcji: [syntax=c]/** * (at)brief This function handles Hard fault interrupt. */ void HardFault_Handler(void) { /* USER CODE BEGIN HardFault_IRQn 0 */ /* USER CODE END HardFault_IRQn 0 */ while (1) { /* USER CODE BEGIN W1_HardFault_IRQn 0 */ /* USER CODE END W1_HardFault_IRQn 0...
NFR51422 udostępnia jedynie Bluetooth Low Energy, który jest bardzo wolny. Nordic do mikrokontrolerów z wbudowanym radiem udostępnia cały stos bluetooth pod nazwą SoftDevice. Ciebie powinien interesować S310 jest to stos BLE i ANT. API pod nazwą SoftDevice są dość dobrze udokumentowane i opisane przykładami. W trakcie uruchamiania zwróć uwagę czy masz...
Dosyć sprawnie działający kod do debuggowania HFa: #include <cstdint> extern "C" { void getRegistersFromStackFrame(uint32_t* stack_frame) __attribute__ ((noreturn)); void getRegistersFromStackFrame(uint32_t* const stack_frame) { const volatile uint32_t r0 = stack_frame[0]; const volatile...
Nie ma jakiegoś sposobu na sprawdzenie co go kieruje na default handler? Pewnie że jest i to nie jeden (; Dorzuć do swojego projektu gdzieś coś takiego: w okolicy miejsca które spowodowało problem. Patrzysz wtedy do pliku .lss i patrzysz co znajduje się w zakresie +/- 3 instrukcje od tego miejsca. 4\/3!!
(at)kuczy Może nie będzie to to co chcesz usłyszeć i może wiele osób się z tym nie będzie zgadzać... Ale po jakiś tam różnych doświadczeniach i projektach powiedziałem jedno koniec z LwIP... Mi abym stwierdził to samo wystarczyło przeczytanie książki: "Mikrokontrolery STM32 w sieci Ethernet w przykładach" i analiza przykładowych kodów źródłowych. :)
Chyba tak jest, tutaj plik startup_stm32f10x_md.c [syntax=c]/** ****************************************... * (at)file startup_stm32f10x_md.c * (at)author Coocox * (at)version V1.0 * (at)date 12/23/2009 * (at)brief STM32F10x Medium Density Devices Startup code. * This module performs: * - Set the initial SP * - Set...
Ekhem, mój błąd ;] Przysięgam, że widziałem HardFault_Handler zamiast Reset_Handler... Co nie zmienia faktu, że spacerek do reset handlera nie powinien występować na dowolny zonk z serii hardfault, a jeszcze tym bardziej, przy wyłączonym watchdogu. Najwidoczniej, występujący tutaj fault jest jeszcze bardziej 'hard' niż standardowy hardfault. Chyba że...
Witam, a więc działam sobie na płytce ZL31 z kamami, w wersji z odłączonym st-linkiem, za programator i debugger służy mi jtag-arm z andtechu, jest to urządzenie na bazie ft2232. Soft to toolchain skonfigurowany podług tutka freddiego chopina. Wszystko ładnie działało jak trzeba do dzisiaj, gdy w którymś momencie zauważyłem, że skompilowany program...
Witam Zwiększenie stosu na przerwania rozwiązało sprawę (który to już raz....) Jeśli chodzi o sprawę __attribute__ musiałem to zostawić tak jak było w port.c czyli [syntax=c]void xPortPendSVHandler( void ) __attribute__ (( naked )); void xPortSysTickHandler( void ); void vPortSVCHandler( void ) __attribute__ (( naked ));[/syntax] bo FreeRtos się nie...
Soft mam trochę "zakręcony" bo jest kilka przerwań które jedno wywłaszcza drugie Być może na stosie kończy się zwyczajnie miejsce ?
Mogę wpisać max 1.5kB - #define STACK_SIZE 0x00000600, kiedy wpiszę - #define STACK_SIZE 0x00000800, to dostaje błąd - region `ram' overflowed by 1096 bytes. Ale nawet z 0x00000600 dalej to samo. Dodano po 15 Nie wiem czy to jakieś znaczenie, ale kiedy wchodzi do log10(a) i natychmiast wskakuje do HardFault_Handler, to jest też komunikat - signal handler...
Nawet dla takiego małego Miki jak ja już na pierwszy rzut oka jest jasne że te kody to potężne źródło problemów. Co widać bez wgłębienia się w szczegóły: * Funkcja main() jako rozbiegówka to słaby pomysł. Kolega stmx napisał coś na ten temat (nawet podaje link w promowanych tematach), warto to przeczytać. * Stos musi mieć odpowiednie wyrównanie, zwykle...
Sprawdź czy przypadkiem nie lądujesz w obsłudze HardFault (HardFault_Handler, w pliku stm32F4xx_it.c) Wstaw tam np. zapalenie jakiegoś LEDa. JarekC
http://obrazki.elektroda.pl/2463034100_1... Witam wszystkich, Chciałbym tym razem przedstawić projekt gotowego radiomagnetofonu internetowego. Jest to rozwinięcie opublikowanego wcześniej na Elektrodzie małego odtwarzacza MP3. Radiomagnetofon umożliwia granie strumieni radiostacji internetowych, nagrywanie tych strumieni na kartę SD,...
Kto wie, co w tych bibliotekach od ST siedzi, znalazłem gdzieś na forum, że przy wywołaniu tej funkcji (i przy używaniu tych bibliotek) komuś wywala HardFault Exception (tylko przy podpiętym debugerze i IDWG). Po odpięciu JTAGa śmiga. Dobranoc :D
Albo za mały stos, albo błąd w kodzie (np. włączone przerwanie które nie jest obsługiwane, używanie nieprawidłowego wskaźnika, ...). Żeby wyeliminować pierwszą opcję wystarczy stos powiększyć i sprawdzisz co się wtedy stanie.
Czy hardfault wystepuje gdy wyłączysz przerwania i zbliżysz palca do układu? Włącz systick - to mniej lub bardziej pozwoli zweryfikować, gdzie masz zonk; jak systick będzie ci działał i od zbliżania palca nie będzie hardfaulta, to trzeba od początku powoli i spokojnie przekopać się przez EXTI.
Witam, Chcę wykorzystać w uK Uart4 do pracy w przerwaniu jednak wszystkie moje wysiłki jak na razie kończą się niepowodzeniem. Skonfigurowałem Uart4 do pracy z prędkością 9600/rx/tx włączyłem odpowiednio taktowanie i ustawiłem porty. Wysyłam znaki do uK i z uK wszystko idzie poprawnie dopóki nie ustawię przerwania UART4_IRQHandler. // włączenie portów...
Tzn, że program może działać dalej poprawnie a debuger wskazuje na to, że jesteśmy w np HardFaultHandlerze ? Mógłbyś nieco rozwinąć myśl ? Czasem może być jakiś problem sprzętowy/programowy/systemowy, który może spowodować wywalenie się debuggera, który będzie np. uparcie twierdził, że jesteśmy wciąż w jakiejś linii, choć mikrokontroler sobie wtedy...
Sprawdź na której instrukcji asemblera hardfault występuje. Ja sądzę, że na instrukcji STR. 1. Ona przyjmuje adres, sprawdź co to za adres pod który instrukcja zapisuje. 2. Dostęp do FSMC kończy się hardfaultem jeśli nie działa zegar FSMC. Sprawdź czy optymalizacja nie eliminuje lub nie krzaczy twojego configa (a całkiem możliwe, że krzaczy, bo nikt...
Mi już nie raz TrueSTUDIO takie rzeczy robił - musiałem wyczyścić cały projekt i jeszcze raz kompilować (clean) u mnie było ciekawej bo procek lądował w hardfault :D Co ja się z tym nagłowiłem... Co ciekawe takie dziwne rzeczy się dzieją jak kompilujesz wersje release.
Jeśli puszcze program bez debugowania to ląduję w tej pętli (użyłem diody do zasygnalizowania): [syntax=c] void HardFault_Handler(void) { /* Go to infinite loop when Hard Fault exception occurs */ while (1) { GPIOD->BSRRL = 0x1000; } } /**[/syntax] Próbuje z brekpointami w którym miejscu to wyrzuca ale się nie da albo nie umię
[syntax=armasm]g_pfnVectors: .word _estack .word Reset_Handler .word NMI_Handler .word HardFault_Handler .word MemManage_Handler .word BusFault_Handler .word UsageFault_Handler .word 0 .word 0 .word 0 .word 0 .word SVC_Handler .word DebugMon_Handler .word 0 .word PendSV_Handler .word SysTick_Handler /* External Interrupts */ .word WWDG_IRQHandler /*...
Używam sobie takiej chińskiej płytki: http://obrazki.elektroda.pl/8610848000_1... aby ten mikrokontroler zadziałał z zewnętrzną pamięcią RAM jako pamięcią danych programu?
"19u" w zupełności wystarczy, bez rzutowania typów, z którego w #define mogą być tylko kłopoty. Podejrzewałem właśnie błąd tego typu - wyjście poza pamięć i wynikający z tego HardFault, ale bez kodu nie sposób było tego stwierdzić. A tak z ciekawości bo nie rozumiem jakie kłopoty w tym przypadku(poza zgrzytaniem zębami oglądającego - alr kompilatorowi...
Ja raczej nie rozumiem tego: (0x0808004)- oczywiście adres wpisywany to 0x0808005. Konkretnie dlaczego 8000+1 i co to znaczy "adres wpisywany"? Napisz jak inicjalizujesz wskaźnik stosu i pod jaki adres skaczesz z bootloadera.
No a może tam jest więcej przerwań ze złymi nazwami? Sprawdź co wywołuje HardFaulta, potem obsłuż to przerwanie i jeśli będzie to zapis pod nieistniejący adres, to można zrobić breakpointa na zapis pod adres. 4\/3!!
witam posiadam STM32F103RET6 i jeśli ustawię PLL mnożnik na więcej niż 6 razy (co odpowiada 48MHz) to procek wysypuje się, przechodzi do HardFault_Handler, jesli konfiguracje przeprowadziłem w THUMBie to jeszcze na 56MHz pracuje. Po pierwsze chciałbym zauważyć, że STM32 (Cortex-M3) obsługuje tylko thumb-2, więc niby w jakim trybie jesteś normalnie?...
instrukcja BLX oznacza Branch with Link and Exchange. Kluczową kwestią jest owe Exchange. Chodzi o to, że instrukcją tą można zmienić tryb instrukcji z ARM na Thumb (lub odwrotnie) lub go nie zmieniać. Jeśli ostatni bit adresu (czyli twojego rejestru R3) jest zapalony, to rdzeń skoczy pod adres ignorując ten bit (traktując go jako zero, bo PC i tak...
Witam wszystkich. Od jakiegoś czasu ćwiczę STMy. Przyszedł czas na bootloader, ale stanąłem w zasadzie na początku drogi. Mój zestaw to: - ARM GCC (Linaro) w wersji 4.7 2012q4 - CooCox - STM32F4 Discovery - przykład AN3965 "STM32F40x/STM32F41x in-application programming using the USART" Po kolei: - istniejący i działający program zlinkowałem z użyciem...
MCBSTM32C\emWin\Template i sterowniku LCD_X_SPI_STM32.c......już to przerabiałem i chyba wszelakie pomysły co do plików template również. Dzięki za pliki. Mianowicie w pliku LCDConf.c jest taka definicja [syntax=c]extern void LCD_X_Write00_16(U16 c); extern void LCD_X_Write01_16(U16 c); extern U16 LCD_X_Read01_16 (void); extern void LCD_X_WriteM01_16(U16...
Jeżeli proc ląduje mi w HardFault'cie to chyba ta szansa jest duża ;) No nic, trza będzie sbrk sobie napisać, dzięki ;) Pzdr.
Wyświetlacz na szczęście się odpala, wybrałem dla niego sterownik liniowy. Doszedłem już dzisiaj do tego że problem faktycznie tkwi w pamięci, ponieważ nawet pomijając gui_init() procesor wywala mi HardFault_Handler przy próbie korzystania z zewnętrznego ramu. Z tej okazji pojawiła mi się nowa zagadka: mam źle inicjowaną pamięć czy złą konfigurację...
Pełny kod ( nie wiem w jaki sposób wysłać, wiec wklejam zwyczajnie) : #include "stm32f1xx_it.h" extern __IO uint8_t BlinkSpeed; void NMI_Handler(void) { } void HardFault_Handler(void) { while (1) { } } void MemManage_Handler(void) { while (1) { } } void BusFault_Handler(void) { while (1) { } } void UsageFault_Handler(void) { while (1) { } } void SVC_Handler(void)...
W skrypcie linkera zmieniłem rozmiary stosów : __main_stack_size = 2048; __process_stack_size = 2048; Do projektu dołączyłem biblioteki gcc: #include <errno.h> #include <sys/types.h> oraz funkcję _sbark: caddr_t _sbrk (int size) { extern char __heap_start; extern char __heap_end; static char *current_heap_end = &__heap_start;...
kombinuję też, że może za późno wywołuję funkcję fpu_enable()? W sumie to przed nią tworzy się obiekt IMU. To mogłoby mieć znaczenie tylko jeśli konstruktor tego obiektu w jakiś sposób robi coś "zmiennoprzecinkowego". Jeśli tylko zeruje zmienne w pamięci, to raczej bez znaczenia. Jednak gdy robię to tak: W pliku .cpp ta funkcja musi być zdefiniowana...
Wczoraj przeglądałem książkę o Cortex-M3 i dowiedziałem się, że przy skokach, najmłodszy bit adresu powinien być ustawiony, gdyż oznacza on skok do kodu typu thumb. Także adres w LR powinien mieć ustawiony bit 0. Jeśli ten bit jest nieustawiony, wystąpi HardFault. (Mogłem coś pokręcić :) Polecam książkę "The Definitive Guide to the ARM Cortex-M3" Joseph...
Problem wynika z tego, że w Cortexach jeden ze stosów jest inicjalizowany SPRZĘTOWO, po resecie, tak samo pobierany jest adres funkcji Reset_Handler(). Problem o którym piszesz jest znany i polega na tym, że procka resetujesz, on w tym momencie wczytuje sobie SP oraz adres funkcji Reset_Handler(), a następnie programujesz do niego coś nowego, zupełnie...
Witam wszystkich. Uzywam Eclipse + OpenOCD (0.9.0) + GCC. Do tej pory używałem STM32F103 (Cortex-M3), a teraz przesiadłem się na STM32F373 (Cortex-M4). Wziąłem ze starego programu skrypt linkera, startup, vectors.c i posklejałem do kupy odpowiednio je modyfikując. Program generalnie odpala się, mogę sterować GPIO. Następnie spróbowałem uruchomić SysTicka....
Witajcie, Mam taki problem, w moim hobbystycznym projekcie, ze kilka razy program zaliczył hard fault sygnalizowany na razie tylko zaświeceniem leda. Całość to kontroler lotu quadrocoptera, na razie w locie takie coś się jeszcze nie zdarzyło, niemniej chciałbym tego uniknąć. Generalnie trudno jest z powtarzalnością błędu, dzisiaj kontroler był włączony...
Przepraszam, dopiero teraz zauważyłem, że drugie rozwiązanie już przetestowałeś.....
Dzięki za szybką odpowiedź. Ściągnąłem odpowiednią wersję vectors.c Ale nadal wchodzi mi w HardFault_Handler w szczególnym miejscu w kodzie. Jeśli debuguje krokowo, linijka po linijce w c, to wchodzi w HardFault_Handler (chodzi o miejsce w którym skacze do innej funkcji) Jeśli to samo miejsce debuguje krokowo, linijka po linijka w asemblerze, to przechodzi...
Skrypt linkera definiuje sekcję .isr_vector. Jej zawartość jest zdefiniowana w asemblerowym pliku startupu. Jest to zrobione w typowy sposób. Z resztą hard fault następuje przed włączeniem systicka, więc nie widzę związku tabelą wektorów przerwań. Na to, że jest ona w porządku wskazuje też fakt, że wykonywana jest funkcja void HardFault_Handler(void),...
Oczywiscie tak. Dodam ze uzywam programu System Workbench [syntax=c] /** ****************************************... * (at)file startup_stm32.s dedicated to STM32F103C8Tx device * (at)author Ac6 * (at)version V1.0.0 * (at)date 2018-04-06 ****************************************...
HardFault wynika z błędu oprogramowania - niewyrównane dane, zły indeks tablicy albo błędna wartość wskaźnika. Trzeba zapolować na ducha (ja przedwczoraj polowałem na takiego ducha 3 godziny). Na początek zrób obsługę HardFault, która wyświetli lub gdzieś zapamięta jakieś 20 słów z wierzchołka stosu. Przejrzyj 6..8 słów za pierwszym o wartości zaczynającej...
Witam Problem dotyczy procesora STM32F373RB, nie mniej jednak raczej odnosi się do każdego podobnego cortex'a. Mianowicie często w "odpowiednich" ubraniach się elektryzuję dość, mocno, dlatego mogę pracować jako generator ESD :P. Procesor steruje diodą laserową, która wisi na mojej płytce zabezpieczającej (100 nF, 1uF, 10k i odwrotnie do zasilania 1N4148)....
Hej, No nie mam HardFault_Handler :( Jak wrócę jutro do domu to dorobię.... A jakie masz podejrzenia? Pozdrawiam Krzysiek
Najpewniej Nie Zerujesz Flag Przerwań . To, że NVIC automatycznie zeruje flagę pending po wejsciu w przerwanie (pending->active) nie znaczy, że peryferia robią to samo - nie robią , więc musisz tego dopilnować sam. W DMA musisz w ISRrze ręcznie gasić flagę która wywołuje przerwanie, najpewniej w twoim przypadki TCIF. Możliwe oczywiście jest również,...
w ISR - robię (robiłem): void DMA2_Channel3_IRQHandler(void) { DMA_ClearITPendingBit(DMA2_IT_GL3 | DMA2_IT_TC3); Switch_DAC_Tables(); } miałem złe przeczucia dot. stosu(ów) i faktycznie jeden z problemów był ze stosem. mianowicie źle został zainicjowany PSP. Ostatecznie zrezygnowałem z kombinowania z drugim stosem wrócę pewnie do tego jak więcej poczytam...
Tabela wektorów jest niekompletna, brakuje kilku zarezerwowanych pozycji między wyjątkami HardFault a SVCall i SVCall a PendSV [syntax=c] ( void ( * )( void )) &__main_stack_end, // 0 Reset_Handler, // 4 NMI_Handler, // 8 HardFault_Handler, // C 0, // 10 0, // 14 0, // 18 0, // 1c 0, // 20 0, // 24 0, // 28 SVC_Handler, // 2C 0, // 30 0, // 34 PendSV_Handler,...
Może problem jest w innym miejscu, gdy przesuwam się za pomocą Debuggera to wszystko jest teoretycznie poprawnie, jednak gdy puszczam kod swobodnie wyskakuje błąd "void HardFault_Handler(void)" teraz pytanie czy sprzęt jest wadliwy, czy jednak te ustawienia?
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()...
2-3. Sterta to jest to miejsce z którego kożysta malloc itd. Czyli przestrzeń pamięci dynamicznie przydzielana. Ja osobiście robię tak, że wskaźnik stosu umieszczam na końcu ramu, a stertę zaraz po danych. Przydzielając kolejne kawałki pamięci w _sbrk sprawdzam czy sterta nie bedzie nachodziła na stos (Oczywiście z pewnym małym marginesem) i przydzielam...
Nie nic takiego nie mam chyba. Zauważyłem że jak odpalam debbuger to to nie wykonuje sie nic z main.. a jak przerywam to wbija mi w hardfault_handlera.. wiesz może dlaczego ?
Jeśli pisząc "wiesza" masz na myśli HardFault to nie. Wygląda na to, że cały czas stoi w linii z whilem gdzie sprawdzana jest właśnie ta flaga. Nie chce w tym czasie wejść do przerwania. Generalnie po tych wszystkich zmianach program zachowuje się tak jak przedtem, tzn. gdy wszystko chodziło z FLASHa.
Nie wiem dlaczego kod generuje HardFault'a [syntax=c]void lcd_print(int x, int y, char* txt) { txt[0] = 0; // tutaj HardFault } main() { lcd_print(0,0,"Why!"); }[/syntax] Z tablicy txt da się oczywiście czytać ale zapis generuje błąd. Funkcja lcd_print jest w osobnym pliku może to ma znaczenie. Pozdrawiam
Cześć, Platforma: STM32F769I-DISCO OS: FreeRTOS Środowisko: System Workbench for STM32 Próbuję zaimplementować PTP na podanej platformie, jednak od dłuższego czasu męczę się z regularnie pojawiającym się Hard Faultem. Jak zdołałem wybadać, błąd pojawia się prawdopodobnie, gdy upłynie czas jednego z timerów programowych, które są tworzone. Tworzonych...
Trzeba było dodać ';' przed wklejeniem. Otrzymany plik rozmiary.txt. 00000428 d impure_data 000000e0 t SetSysClock 000000d4 T __register_exitproc 0000008c T SystemInit 00000048 T __libc_init_array 00000034 W Reset_Handler 00000034 T __libc_fini_array 00000018 t register_fini 00000010 T atexit 00000006 T main 00000004 R _global_impure_ptr 00000002 W...
Witam. Mam dziwny problem z typami float na Stm32f4 pod keilem. Mianowicie poniższa funkcja w zależności od ustawienia "Use FPU" w ustawieniach działa lub nie(tzn. z ustawionym przechodzi do "HardFault_Handler"). [syntax=c] static void fpu_enable(void) { #if (__FPU_PRESENT == 1) && (__FPU_USED == 1) SCB->CPACR |= ((3UL << 10*2)|(3UL...
Program kompiluje się i wykonuje aż do komendy (debugowałem krok po kroku): A co się dzieje w funkcji NVIC_Init, na której komendzie w tej funkcji rdzeń się zatrzymuje ? W NVIC_Init nie ma żadnego "while'a" i rdzeń raczej się nie zatrzyma, chyba że wyląduje w jakimś wyjątku typu Hard Fault.
Debugger coś mieszał. Podłączyłem ulinka i zaczelo śmigać... Ale mniejsza - teraz trafilem na znacznie gorszy error ;/ Mianowicie napisałem sobie ISRa który daje semafor funkcją xSemaphoreGiveFromISR(). Konfiguracja priorytetów 4:4. configMAX_SYSCALL_INTERRUPT_PRIORITY = 9 ISR ma priorytet 10 Grzebanie w NVICu jest w sekcji critical. Niestety funkcja...
Kod jest ok, pamięć nadpisywana jest w zarezerwowanym obszarze. To chyba złe miejsce na ten temat, bo program ląduje w HardFault_Handler - to bardziej sprzętowy problem tego procesora, muszę temat wstawić w kontrolery ARM.
Jego definicję chciałem zawrzeć w pliku port.c należącym do plików FreeRTOS (adekwatnie do np. SVCHandler) W pliku port.c są komponenty systemu, a przecież przerwanie UARTu nie jest składnikiem systemu... Wrzuć tą funkcje gdziekolwiek chcesz i daruj sobie te fantastyczne xPortPrivSecretpvulPrefixy, bo po co Ci to? Lokalizacja tej funkcji nie ma znaczenia,...
HEAP miał 8kB, STM32F103 ma 20kB SRAM, to może 12kB na stos USB, jakieś globale, konteksty zagnieżdżonych przerwań itp. to momentami dla niego za mało? Raczej nie ma opcji, żeby 12 kB na stos było zbyt mało. Poza sytuacjami extremalnymi mi się jeszcze nie zdarzyło używać więcej niż 4 kB, ale tylko w sytuacjach gdy "głęboko" są używane funkcje typu...
Na testy dałem je typy void, program zaczynał w nie skakać i po chwili HardFault. Nie wiem czy mogę zastosować zwykłe memcp i memset zamiast tych __aeabi i zobaczyć czy pojawi mi się coś na wyświetlaczu to by znaczyło że lib z IAR działa z GCC Myślę, że spokojnie możesz je zastąpić standardowymi funkcjami - na pewno będzie lepiej niż teraz, może akurat...
Używam obszaru pamięci podtrzymywanej z baterii. Jeżeli mam coś takiego: [syntax=c] uint32_t adr; adr=*(ram+CONF_BASE+XSAMPLE); [/syntax] to jest ok, ale jeżeli zrobię tak: [syntax=c] uint32_t adr; adr=*(ram+CONF_BASE+XSAMPLE); if(adr>31 || adr==0) adr=1; zm1=*(ram+CONF_BASE+XSAMPLE+adr+1); [/syntax] to w ostatniej linijce program ląduje w HardFault_Handler...
hardfault handler stm32 f103rb ssd1963 stm32
schematy onkyo sterowanie syrius uziemienie przetwornica
mikrokomputer cobra1 aktualizacja radio 7018b
Jak zatrzymać i wznowić obraz w telewizorze Manta Invalid format przy przenoszeniu zdjęć na telefon