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...
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.
Może coś takiego: [syntax=C]//****************************... // +--+ // | ++----+ // +-++ | // | | // +-+--+ | // | +--+--+ // +----+ Copyright (c) 2009 Code Red Technologies Ltd. // // Microcontroller Startup code for use with Red Suite // // Software License Agreement // // The software is owned by Code...
Wskaźnik (ptr) jest z pewnością poprawny (okolica 0x200004b7), w przypadku: (uint32_t*)ptr; jest nie poprawny.. musi być wielokrotnością 4.
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 ?
A jeśli chciałbym mój program wgrać do RAM to musiałbym w tym Twoim skrypcie linkera dla sekcji np .text zamiast > rom AT > rom wpisać > ram AT > ram czy wewnątrz {} tez trzeba coś zmieniać? Jeśli wystarczy Ci, że program będzie działał jedynie przez debugger, to wystarczy ta pierwsza opcja. Jeśli byś chciał, żeby program normalnie działał z RAM, to...
Inne miejsce z manuala: "Modules that are disabled via their clock gate control bits in the PCC/SIM registers disable the associated AIPS-Lite slots. Access to any address within an unimplemented or disabled peripheral bridge slot results in a transfer error termination." Teraz pytanie, czy "error termination" oznacza faulta. No ale generalnie zegar...
Używanie komendy soft_reset_halt jest źródłem niezliczonej ilości problemów... Tak pozatym to przed wgrywaniem flasha warto byłoby go wyczyścić, np rozbudowując nieco obecną u Ciebie komendę: flash write_image erase ... Dodawanie "0 elf" jest zbędne. Jakiego masz JTAGa? Pokaż CAŁĄ konfigurację targeta, bo wydaje mi się, że Twój problem może rozwiązać...
Jakakolwiek zmiana string literals (u Ciebie to "Why!") w C to undefined behavior. Spróbuj tak: [syntax=c] void lcd_print(int x, int y, char* txt) { txt[0] = 0; // tutaj HardFault } main() { char str[] = "Why not ;)"; lcd_print(0,0,str); } [/syntax]
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...
Czyli nie dość, że na stosie masz 1 kB tablicę, to jeszcze używasz funkcji która jest znana z tego, że używa naprawdę DUŻO stosu. Zacznij od zmniejszenia tej tablicy albo przeniesienia jej do zmiennych globalnych, a następnie - jeśli nie pomoże - znajdź jak w Keilu zwiększyć rozmiar stosu.
Dlaczego w zasadzie nie wolno wykonać skoku do adresu resetu(a sprzęt wykonuje tą operację w przypadku startu z drugiego Flasha), skoro chcę w zasadzie zasymulować takie zdarzenie? Dlaczego musi to być skok do samej procedury RESETU? Bo to nie jest AVR. Rdzeń robi tak samo, sprzętowo pobiera wektor procedury startowej i skacze do niej! Zarówno w urządzeniu...
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...
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)...
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.
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!!
Sprawdź czy przypadkiem nie lądujesz w obsłudze HardFault (HardFault_Handler, w pliku stm32F4xx_it.c) Wstaw tam np. zapalenie jakiegoś LEDa. JarekC
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...
Masz debugger? Powyżej piszesz o HardFault, ale czy jesteś PEWNY, że właśnie to się dzieje? Objawy które opisujesz (poza ewentualnym HardFault) są normalne, bo stdout domyślnie jest buforowany - jak już zauważono powyżej. 4\/3!!
Gdzie trafi zmienna lokalna w main zainicjowana i nie niezainicjowana ? Zależy co rozumiesz przez "lokalna". Generalnie do celu tej dyskusji proponuję się ograniczyć do podziału na "statyczne" (m.in. globalne) i "automatyczne" (czyli zmienne "w" funkcjach, oczywiście bez "static"). Te pierwsze lądują w .data lub .bss (zależnie od tego czy są zainicjalizowane...
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.
Jeżeli skok jest z przerwania to HardFault jest spowodowany tym, że zmieniasz wskaźnik stosu w obsłudze przerwania.
... 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
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...
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!!
(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
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,...
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!!
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!!
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...
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...
Witam. Mam pewien problem z programem na mikrokontrolerze STM32L151CBU6A. Mianowicie podczas wywoływania funkcji free, czyli zwalniania wskaźnika do zaalokowanej wcześniej pamięci wyrzuca mnie do HardFault. Co może powodować ten problem? Wiem, że może on nastąpić w sytuacji, że ten sam rejon jest kolejny raz zwalniany, jednak w moim programie na pewno...
Co ciekawe zapis pamięci się powodzi Tak naprawdę nie powodzi się, rozkaz/instrukcja która powoduje hardfault znajduje się zwykle kilka rozkazów wcześniej niż to co pokazuje debugger, ponieważ w tych układach masz 3 poziomowy pipeline. Jeśli chcesz to zweryfikować, to wywal odczyt i tak czy siak będzie Ci przechodziło do HF w linijce która jest po...
Bzdura. Wystapienie dowolnego wyjatku pod rozbiegowkami z Keila (nie wiem jak z innymi) powoduje wpadniecie w nieskonczona petle bedaca napisana w asmie dokladnie pod adresem tego wektora. HardFault_Handler: B HardFault_Handler - dotyczy glownie wyjatkow niemaskowalnych. Przerwanie od DMA jest maskowalne wiec jest obslugiwany przez handler defaultowy...
Witam, Jakiś czas temu na forum pytałem o koncepcję prostownika mikroprocesorowego. Od tamtego czasu zacząłem działać i stworzyłem płytkę, wlutowałem komponenty i zacząłem pisać program i testować układy. Wszystko szło dobrze dopóki nie rozbudowałem programu i zacząłem testy pod obciążeniem. W aplikacji wykorzystuję 3 wejścia ADC do pracy z DMA: pomiar...
Zapoznaj się ze stosem CycloneTCP http://www.oryx-embedded.com/cyclone_tcp...
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)....
Problem w tym, że gdy HardFault występuje (aktualnie aplikację zmodyfikowałem sobie na siłę aby za każdym razem waliła) procesor wydaje się utykać na wejściu do tej funkcji. Debuger wisi na samym wejściu i przy użyciu step over czy step nie idzie w ogóle dalej. Całkiem możliwe, że pierwsza instrukcja z Twojego handlera wywołuje znów Hard Fault, więc...
Czyli jednak wprowadzałeś zmiany w kodzie ESP, czego mój klient nie chciał. W przyszłości również oprócz ESP będzie moduł Bluetooth. Moduły na którym odbywać się będzie komunikacja steruje się komendami AT, a to chyba domyślna forma komunikacji. Ciekawe zresztą czy zmiana firmware wpływa na precertyfikację modułu. Czy ten tryb bez danych typu "+IPD.."...
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. czy ktoś miał taki problem?
Robił ktoś coś na uIP ? Jak to jest z uip_process ? w buforze powinna być ramka z MACadresami na początku czy powinna je pominąć ?
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...
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.
Witam, w projekcie uzywam kontrolera msp432p4011, kompiluje IARem, uzywam FreeRTOSa jako system operacyjny. Natrafilem na problem, ktory mi juz praktycznie fizyczny bol zaczyna sprawiac, bo nie mam pojecia co moze byc przyczyna. Otoz potrzebuje alokowac duza tablice bajtow - 27k. Kiedy ja deklaruje jako globalna, leci Hardfault z watku calkowicie nie...
Witam! Piszę aplikacje pod FreeRTOS / STM32 i napotkałem się na taki problem. W systemie uruchomione mam przerwania które to ustawiają semafory a te zezwalają na pracę tasków uruchomionych pod FreeRTOS. No i wszystko jest fajnie pięknie puki ustawienie semafora nastąpi już po uruchomieniu systemu czyli vTaskStartScheduler() Pomijam już fakt, że z chwilą...
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()...
Przepraszam, coś namieszałem przy kopiowaniu, już poprawione. Kod się o dziwo kompiluje.
Tak dla porządku: wywołujesz funkcję "initialise_monitor_handles"?
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...
Temu zadaniu przydzieliłem 128 słów stosu, kod wygląda prosto i bez komplikacji: Wow... 128 słów! (; Samo wywołanie sprintf() zwykle wciąga ze 2x tyle... Jeśli używasz gcc i newlib, to proponowałbym użycie odchudzonej (z obsługi zmiennego przecinka) wersji siprintf(), która zużywa trochę mniej stosu, co wcale nie znaczy że mało. 4\/3!!
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ę,...
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...
Udało mi się trochę dokładniej namierzyć problem zewnętrznego resetu. HardFault pojawia się przy dostępie do AHB/APB. Echhh, nakłamali w dokumentacji. PY32F002AA15M6TU ma 32kB FLASH i 4kB RAM. :) Poszukam jeszcze DMA. ================ update ================ Wygląda na to, że jest i DMA. Napisałem prosty kod wysyłający dane do SPI i jest zegar na SCK....
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...
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...
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.
Z tą parzystością jest tak że dla funkcji BL/B (w bliskim zasięgu nie ma problemu) problem jest z BLX/BX gdzie adres jest w rejestrze. Dla trybu thumb mają być nie parzyste a dla trybu ARM parzyste. W cortexM3 nie ma trybu ARM i wywala HardFault-a. Wybrałem rozwiązanie podobne (at)makreka5 choć nie było łatwo zmusić kompilator i linker do tego co chciałem...
Ustawiłem adresy powyżej 0xC000 i niestety procek nadal ląduje w hardfault, a co ciekawe przechodzi funkcję odczytu z flash'a i jeszcze kilka funkcji i później hardfault...
Jeśli go nie włączę, to wchodzi w HardFault
No ale pokaż kod ISRa, skąd mamy wiedzieć co robisz w biedne DMA?
A jak wygląda zarządzanie pamięcią w tym RTOSie? Czy można bez przeszkód używać dynamicznej alokacji nie obawiając się HardFault co kilka minut?
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...
No to teraz jeszcze zobacz gdzie to zdarzenie HardFault jest wywoływane. 4\/3!!
Załączam mój projekt... Przed wejściem do main() uC ląduje w HardFault. Jeszcze mocno toporne to jest, ale jakoś muszę zacząć.
Wykorzystujesz semihosting? Instrukcja BKPT bez debuggera wywoła wyjątek DebugMonitor lub HardFault.
Niestety do tej pory nie udało mi się rozwiązać problemu. Częste zawiechy HardFault Zauważyłem jeszcze, że podczas debugowania nie zatrzymuje się na niektórych break poinatch pomimo iż wiem że przez nie przechodzi i są aktywne. Bardzo często, (a nawet zawsze za pierwszym uruchomieniem) nie mogę debugować. zielona strzałka nieaktywna lub HardFault. Czasami...
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 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.
Też o tym myślałem (upchnięcie rozmiaru aplikacji w jakimś stałym miejscu na początku), ale też średnio mi się to podoba, bo trzeba bardziej ingerować w skrypty linkera samej aplikacji... I tak musisz zaingerować przesuwając początek romu... Więc czy dodatkowy wpis w wektor przerwań to tak wiele? Ale za to masz rozmiaro odporne rozwiązanie...., proste...
Akurat w przypadku Cortex próba odwołania do niezaimplementowanego adresu powinna spowodować, i w większości przypadków powoduje, wyjątek HardFault.
Ja nie za bardzo rozumien dlaczego nie mozesz zobaczyc w DH co go wywołało. Nie DH tylko HardFault. Poza tym należy mieć obsługę tego wyjątku aby poprawnie pobrać adres instrukcji, która go wywołała. Poza tym nadpisanie pamięci mogło nastąpić dużo wcześniej niż konkretna instrukcja, która bezpośrednio spowodowała przypadku HardFault. (at)Damian7546...
Nie wiemy nic o środowisku i skrypcie linkera - HardFault może wynikać z zamazywania danych na stosie spowodowanego zbyt małą pojemnością stosu (np. słynna "pułapka Freddiego").
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,...
Miałem na myśli startup, zawierający tablicę wektorów i czy nie zachodzi np. HardFault/UsageFault/BusFault... Najprościej podpiąć pod te wektory zapalenie LED-a...
Masz problem? - pokaż startup i procedurę. Skoro jesteś pewny, że wszystko ok, to o co chodzi? Może na początku procedury wylatujesz na HardFault albo czymś podobnym?
Oczywiście FatFs (np: odczyt plików) działa poprawnie ? Masz uruchomione debug'ownie kodu? Może rdzeń ląduje w HardFault ? :) To wysyłanie po UART masz w pętli głównej zrealizowane?
Już znalazłem błąd. Nie ustawiałem FSMC_BCR1->WREN; [url=http://www.elektroda.pl/rtvforum/to... Obsługa LCD poprzez FSMC - HardFault
Tabela wektorów jest w pliku startupu, dostarczanym przez ST. Z kolei definicje niektórych wektorów są w pliku stm32f0xx_it.c, również standardowym. Są tam konkretnie: NMI, HardFault, SVC, PendSV, SysTick oraz USART1.
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
To o czym pisałem miałoby by sens gdybyś dostał HardFault, wtedy program utyka w "pętli" i łatwo pod debugerem podejrzeć skąd szły wywołania i w jakiej funkcji nastąpił błąd, a podgląg jest chyba w okienku Debug (lewe górne okienko)
Sprzętu się nie czepiaj. HardFault może być powodowany przez różne rzeczy, z popularniejszych to za mały stos lub popsute operacje na wskaźnikach. Zamieść cały kod jaki masz. I po co ten FlashUnlock na początku?
(at)GrzegorzKostka chyba pomyliłeś PRIMASK z BASEPRI (którego zresztą w ARMv6-M nie ma). cpsid i zablokuje wszystko poza HardFault, NMI i resetem.
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...
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...
NuttX używa HardFault do obsługi zdażeń systemowych - trzeba debugger zmusić, żeby nie łapał domyślnie tego wyjątku, bo w NuttX to jest normalne... Kolejna "niezbyt mądra" decyzja - kolejna w "serii"... 4\/3!!
Witam, Mam taką sytuację, jak uruchamia się program w STM32F4 to działa poprawnie. Jak na krótki czas go usypiam i ponownie włącza go watchdog, to ten sam program w którymś miejscu ulega HardFault. Czy po restarcie od watchdoga zmienne na starcie mogą być niewyzerowane? A stos tak samo wygląda po restarcie od watchdoga jak i zwykłym uruchomieniu? Pozdrawiam.
Jeżeli HardFault to prawdopodobnie wynikowy adres nie jest odpowiednio wyrównany. Takim zapisem jawnie zapisujesz 4 bajty i prawdopodobnie (nie jestem specjalista od ARM, ale przynajmniej w niektórych jest to problem) adres musi mieć ostatnie dwa bity zerowe.
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
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...
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.
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.
Błąd w dokumentacji niestety jest: Da się ustawić 24Mhz, 48Mhz, 72 Mhz, 96Mhz niestety próby ustalenia M=3 (36Mhz) wg ustawien w tabelce M=3 P=4 (36Mhz) oraz wszystkie nieparzyste powodują hardfault.
Pierwsza rzecz to ponowna próba odbezpieczenia "obszaru opcji" powoduje u mnie lądowanie w HardFault. Piszę o tym: [syntax=c] FLASH->OPTKEYR = 0x08192A3B; FLASH->OPTKEYR = 0x4C5D6E7F; while( FLASH -> SR & FLASH_SR_BSY ) {}; -> FLASH->KEYR = 0x08192A3B; -> FLASH->KEYR = 0x4C5D6E7F; -> while( FLASH -> SR & FLASH_SR_BSY ) {}; [/syntax] Po drugie po co...
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
FPU w Cortex-M4 obsługuje TYLKO liczby float (32-bity). Pozatym - to jest KLUCZOWA sprawa - fpu_enable() musi być PRZED kodem który z FPU by korzystał, w przeciwnym wypadku HardFault. Być może dobrze by było fpu_enable() przypiąć do __low_level_init0/1(). 4\/3!!
Hmm, chyba jednak nie tędy droga. Po dodaniu tej formułki do skryptu linkera efekt jest taki że zmienne z przestrzeni .data przestały "się ustawiać", a gdzieś w połowie "main'a" rdzeń ląduje w HardFault z bliżej nieznanych mi jeszcze przyczyn.
Czyli najpierw powiedziałeś kompilatorowi, że domyślnie 32-bitowa stała 19u musi być 32-bitowa (19ul), a potem, że jeszcze bardziej ma ona być 32-bitowa (uint32_t). "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,...
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...
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...
Wracając do tematu, czyli STM32F4DISCOVERY rozpoczęcie programowania. Chciałem sprawdzić działanie FPU wykonując proste dodawanie, mnożenie itd. float'ów w przerwaniu od timera. Ku mojemu zdziwieniu przy każdym wykonaniu instrukcji na float'ach wywala mi HardFault. Gdy wyłączyłem w opcjach korzystanie z FPU wszystko hula. Używam Keil'a w wersji dla...
hardfault handler stm32 hardfault
przepalony element modułu zmywarki indesit wymiana termostatu pompa ciepła usterka
regulator poziomu traktorek rally
Waga RAWN – komunikat ERR: przyczyny, kody błędów, diagnostyka, Radwag, tensometria Vectra TV Smart 4K – niezgodność czasu w menu z rzeczywistym, błędna synchronizacja TOT/TDT