Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek dla www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

STM32 [biblioteki fatfs] HardFault

17 Lip 2011 22:35 2631 3
  • Poziom 10  
    Witam
    od dwóch dni walczę z bibliotekami Fatfs, i mam niezidentyfikowany błąd, wykończyły mi się pomysły.
    Sprawa wygląda tak posiłkuje się przykładami z książki STM32 w praktyce Autor: Krzysztof Paprocki. W zasadzie chce skompilować gotowy kod , (przykład R9 sd_fatfs) działam na układzie STM mini
    http://allegro.pl/zestaw-uruchomieniowy-stm32-mini-2-8-lcd-tft-i1701069030.html
    sprawdzałem ten przykład dla atollica i keila v4 ,w obu przypadkach na samym początku wykonywania programu wszystko sie wysypuje i program ląduje w Hard Fault, czyli klapa.W całym kodzie przykładowym poprawiłem tylko linie cs do sd karty i w kilku miejscach zdefiniowałem typ BOOL, bo tam były błędy. Początkowo podejrzewałem pierwszą funkcję inicjującą sygnały zegarowe, używałem zamiennie dwóch funkcji inicjującej taktowania książkowej RCC_Conf(); , i z przykładów które miałem Stm32_Clock_Init(); (w zasadzie obie robią to samo) Ale obie te funkcje w innych projektach działają bez zarzutów. Zastanawiam się też nad timerem SysTick czy on tam jest ok. Ogólnie to skończyły mi sie pomysły. Może ktoś ma jakieś sugestie co może być nie tak.
    Wklejam kod pliku main. Cały kod projektu jest do pobrania ze strony BTC z przykładami do książki.

    Code:

    #include "stm32f10x.h"
    //#include "sys.h"
    #include "fatfs/src/ff.h"
    #include "fatfs/src/diskio.h"

    void RCC_Conf(void);
    void NVIC_Conf(void);
    void SysTick_Conf(void);

    static FATFS g_sFatFs;


    #define PATH_BUF_SIZE   80

    int main(void)
    {
       FRESULT fresult;
       FIL plik;
       //FILINFO plikInfo ;
       DIR Dir;
       FILINFO Info[1000];
       FILINFO *p;

       //   Stm32_Clock_Init();
       //   delay_init(72);
       WORD zapisanych_bajtow;
       RCC_Conf();
       SysTick_Conf();

        fresult = f_mount(0, &g_sFatFs);

       // Tworzenie pliku
       fresult = f_open (&plik,"plik.txt", FA_CREATE_ALWAYS);
       fresult = f_close (&plik);

          // Tworzenie katalogu
       fresult = f_mkdir("katalog1");

       // Zapis pliku
       fresult = f_open (&plik,"plik.txt", FA_WRITE);
       fresult = f_write(&plik, "zawartosc pliku", 15, &zapisanych_bajtow);
       fresult = f_close (&plik);

       // Usuniecie pliku
       fresult = f_unlink("plik.txt");

       p = Info;

        fresult = f_opendir(&Dir, "katalog1");
         while (1);
    }

    void RCC_Conf(void)

         ErrorStatus HSEStartUpStatus;

         // Reset ustawien RCC
         RCC_DeInit();

         // Wlacz HSE
         RCC_HSEConfig(RCC_HSE_ON);

         // Czekaj za HSE bedzie gotowy
         HSEStartUpStatus = RCC_WaitForHSEStartUp();

         if(HSEStartUpStatus == SUCCESS)
         {
           FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);

           // zwloka dla pamieci Flash
           FLASH_SetLatency(FLASH_Latency_2);
        
           // HCLK = SYSCLK
           RCC_HCLKConfig(RCC_SYSCLK_Div1);
     
           // PCLK2 = HCLK
           RCC_PCLK2Config(RCC_HCLK_Div1);

           // PCLK1 = HCLK/2
           RCC_PCLK1Config(RCC_HCLK_Div2);

           // PLLCLK = 8MHz * 9 = 72 MHz
           RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);

           // Wlacz PLL
           RCC_PLLCmd(ENABLE);

           // Czekaj az PLL poprawnie sie uruchomi
           while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET);

           // PLL bedzie zrodlem sygnalu zegarowego
           RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);

           // Czekaj az PLL bedzie sygnalem zegarowym systemu
           while(RCC_GetSYSCLKSource() != 0x08);

          // Wlacz sygnal zegarowy dla GPIOC
          RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOC | RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO, ENABLE); // Wlacz sygnal zegarowy dla GPIOC
         }
    }

    void SysTick_Conf(void)
    {   
         if (SysTick_Config(720000))
         {
            // W przypadku bledu konfiguracji peca w nieskonczonej petli
          while(1);
         }               
    }

    void NVIC_Conf(void)
    {
    #ifdef  VECT_TAB_RAM 
         // Jezeli tablica wektorow w RAM, to ustaw jej adres na 0x20000000
         NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0);
    #else  // VECT_TAB_FLASH
         // W przeciwnym wypadku ustaw na 0x08000000
         NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);   
    #endif
    }

    #ifdef  DEBUG
    void assert_failed(uint8_t* file, uint32_t line)
    {
         while (1);
    }
    #endif
  • Pomocny post
    Poziom 34  
    Nie znam tej biblioteki, pół minuty temu pobrałem jej źródła, ale z tego co patrzę, to struktura FILINFO zadeklarowana jakoś tak:
    Kod: C
    Zaloguj się, aby zobaczyć kod

    Zajmuje 22 bajty lub więcej, a procesor który masz w zestawie ma 20KB pamięci RAM. Stąd prosty wniosek, że rezerwując tą zmienną
    Kod: C
    Zaloguj się, aby zobaczyć kod

    Powodujesz przepełnienie stosu.
  • Specjalista - Mikrokontrolery
    Masakra... Tysiąc-elementowa tablica struktur alokowana na stosie i "czemu nie działa?"...

    4\/3!!
  • Poziom 10  
    Dzięki BoskiDialer , pomogłeś, no sory Freddie że cie tak zawiodłem ale każdy sie kiedyś uczy teraz już sobie zapamiętam i nie popełnie podobnego błędu 2gi raz,