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][Eclipse+openocd] - jak zresetować procesor

18 Paź 2010 00:57 2824 8
  • Poziom 14  
    Witam,
    Dopiero co zaczynam bawić się ARMami, i na początek zakupiłem sobie moduł z propoxa (STM32F103VE) wsadziłem na mała płytkę uniwersalną ze stabilizatorem 3,3V do tego programator BF30...
    Tak więc skonfigurowałem sobie Eclipsa + CodeSourcery + openocd wg opisu na stronce tutro.net oraz skryptów załączonych do programatora.
    No i udaje mi się zaprogramować procka, diody migają, tyle że aby wystartował muszę włączyć i wyłączyć zasilania. Po zaprogramowaniu i resecie za pomocą jtaga procek nie rusza. Reset i programowanie robię poprzez dodanie nowych targetów w pliku makefile.targets
    Code:

    program:

       openocd -f ../scripts/stm32.cfg -c init -c 'script ../scripts/flash-begin.script' -c "flash write_image leds2.elf" -c 'script ../scripts/flash-end.script' -c shutdown || true



    devrst:
       
       openocd -f ../scripts/stm32.cfg -c init -c reset run -c shutdown


    Wynik działania devrst
    Code:

    cs-make devrst
    openocd -f ../scripts/stm32.cfg -c init -c reset run -c shutdown
    Open On-Chip Debugger 0.3.1 (2009-11-20-00:17)
    $URL$
    For bug reports, read
       http://openocd.berlios.de/doc/doxygen/bugs.html
    600 kHz
    jtag_nsrst_delay: 100
    jtag_ntrst_delay: 100
    trst_and_srst separate srst_gates_jtag trst_push_pull srst_open_drain
    Warn : stm32.flash: nonstandard IR mask
    Warn : Specify TAP 'stm32.cpu' by name, not number 0
    Warn : use 'target0' as target identifier, not '0'
    Info : device: 4 "2232C"
    Info : deviceID: 67330064
    Info : SerialNumber: FTQYA8VNA
    Info : Description: OOCDLink A
    Info : clock speed 600 kHz
    Info : JTAG tap: stm32.cpu tap/device found: 0x3ba00477 (mfg: 0x23b, part: 0xba00, ver: 0x3)
    Info : JTAG tap: stm32.flash tap/device found: 0x06414041 (mfg: 0x020, part: 0x6414, ver: 0x0)
    Info : JTAG tap: stm32.cpu tap/device found: 0x3ba00477 (mfg: 0x23b, part: 0xba00, ver: 0x3)
    Info : JTAG tap: stm32.flash tap/device found: 0x06414041 (mfg: 0x020, part: 0x6414, ver: 0x0)
    target state: halted
    target halted due to breakpoint, current mode: Handler HardFault
    xPSR: 0x20000003 pc: 0x20000004 msp: 0x20004fe0



    może coś pokaszaniłem z ustawieniami linkera...
    na podstawie pliku Freddiego Chopina "stm32f103rb_rom.ld" zrobiłem swój dla VE w któym w zasadzie zmieniłem tylko dwie linijki, pytanie czy dobrze....

    Code:

    /*
    +=============================================================================+
    | available memories definitions
    +=============================================================================+
    */

    MEMORY
    {
       rom (rx)   : org = 0x08000000, len = 512k
       ram (rwx)   : org = 0x20000000, len = 64k
    }


    Bibliotek używam od ST ale jakiś starych z 2009 roku....

    Generalnie sprawa jest trochę dziwna bo jak odłączę zasilanie od układu i poczekam na rozładowanie kondensatorów to po włączeniu procek także nie startuje, dopiero po kolejnym włączeniu zasilania (po krótkiej przerwie) wszystko rusza.... może coś z układem resetu jest nie tak...

    pozdrawiam i z góry dzięki za pomoc.
    Krzysiek


    inventco.eu - tytuł poprawiłem. Regulamin p.11.1
  • Użytkownik usunął konto  
  • Poziom 21  
    Witaj,

    Chyba masz gdzieś niezłego buga softwarowego który od razu przechodzi do Handlera Hardware fault.

    Spróbuj się przyjżeć swojemu softowi lub spróbuj zagrać jakiś dobry program z exampla i wtedy popróbuj.

    Pozdrawiam
  • Poziom 14  
    Witam,
    Co do szybkości narastania napięcia to trudno bez oscyloskopu to stwierdzić, niemniej układ zasilany jest przez stabilizator z zasilacza impulsowego (jak od laptopa) 12 V 5A więc nie sądzę żeby mu prądu brakowało. Nawet jak zrobię tak że najpierw włączę stabilizatory i potem dopiero dam napięcie na moduł to jest to samo.

    Problem występuje także podczas resetu za pomocą JTAGa wiec może coś jest nie tak z układem resetu DS1818 który jest tam zamontowany?

    Co do programu to standardowy paragram z przykładów z książki mikrokontrolery stm32 w praktyce mrugający diodami więc nie sądzę, żeby coś było nie tak.....

    pozdrawiam
    krzysiek
  • Poziom 38  
    a używasz gdzieś przerwań ?
  • Poziom 14  
    Nie używam przerwań, nie inicjuje NVIC, generalnie program jest prosty jak konstrukcja cepa (ale i tak coś zwaliłem :), i wiem że nie robi się tak opóźnień w programie :)

    Code:

    #include "stm32f10x_conf.h"
    #include <stdio.h>

    void RCC_Conf(void);
    //void NVIC_Conf(void);
    void GPIO_Conf(void);
    void delay_ms(u16);  //testowo !!!


    int main(void)
    {
       RCC_Conf();
       GPIO_Conf();

       GPIO_ResetBits(GPIOE, GPIO_Pin_11 | GPIO_Pin_12 );
       delay_ms(2000);
       GPIO_SetBits(GPIOE, GPIO_Pin_11 | GPIO_Pin_12 );
       delay_ms(2000);

       while(true)
       {
          GPIO_SetBits(GPIOE, GPIO_Pin_11);
          GPIO_ResetBits(GPIOE, GPIO_Pin_12);
          delay_ms(500);
          GPIO_SetBits(GPIOE, GPIO_Pin_12);
          GPIO_ResetBits(GPIOE, GPIO_Pin_11);
          delay_ms(500);
       }

       return 0;
    }


    void delay_ms(u16 zp99)
    {

        volatile u32 i=0;
        volatile u32 j=0;
        for(i=0;i<zp99*8;i++)
        {
            for(j=0;j<200;j++)
            {
                asm volatile("nop");

            }
        }
    }

    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 taktowanie GPIOA
            RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE, ENABLE);
         }else
         {
            // kiedys cos tu bedzie :)
            while(1)
            {

            }

         }
    }

    void GPIO_Conf(void)
    {
         GPIO_InitTypeDef GPIO_InitStructure;

         // Konfiguracja portu E
         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11 | GPIO_Pin_12;
         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

         GPIO_Init(GPIOE, &GPIO_InitStructure);


    }






    pozdrawiam
    Krzysiek
  • Poziom 14  
    poczyniłem jeszcze taką obserwację, że raz na jakiś czas procek się resetuje poprawnie, wtedy mam output taki
    Code:

    **** Build of configuration Debug for project leds2 ****

    cs-make devrst
    openocd -f ../scripts/stm32.cfg -c init -c reset run -c shutdown
    Open On-Chip Debugger 0.3.1 (2009-11-20-00:17)
    $URL$
    For bug reports, read
       http://openocd.berlios.de/doc/doxygen/bugs.html
    600 kHz
    jtag_nsrst_delay: 100
    jtag_ntrst_delay: 100
    trst_and_srst separate srst_gates_jtag trst_push_pull srst_open_drain
    Warn : stm32.flash: nonstandard IR mask
    Warn : Specify TAP 'stm32.cpu' by name, not number 0
    Warn : use 'target0' as target identifier, not '0'
    Info : device: 4 "2232C"
    Info : deviceID: 67330064
    Info : SerialNumber: FTQYA8VNA
    Info : Description: OOCDLink A
    Info : clock speed 600 kHz
    Info : JTAG tap: stm32.cpu tap/device found: 0x3ba00477 (mfg: 0x23b, part: 0xba00, ver: 0x3)
    Info : JTAG tap: stm32.flash tap/device found: 0x06414041 (mfg: 0x020, part: 0x6414, ver: 0x0)
    Info : JTAG tap: stm32.cpu tap/device found: 0x3ba00477 (mfg: 0x23b, part: 0xba00, ver: 0x3)
    Info : JTAG tap: stm32.flash tap/device found: 0x06414041 (mfg: 0x020, part: 0x6414, ver: 0x0)



    natomiast jak się nie zresetuje to jest tak
    Code:


    **** Build of configuration Debug for project leds2 ****

    cs-make devrst
    openocd -f ../scripts/stm32.cfg -c init -c reset run -c shutdown
    Open On-Chip Debugger 0.3.1 (2009-11-20-00:17)
    $URL$
    For bug reports, read
       http://openocd.berlios.de/doc/doxygen/bugs.html
    600 kHz
    jtag_nsrst_delay: 100
    jtag_ntrst_delay: 100
    trst_and_srst separate srst_gates_jtag trst_push_pull srst_open_drain
    Warn : stm32.flash: nonstandard IR mask
    Warn : Specify TAP 'stm32.cpu' by name, not number 0
    Warn : use 'target0' as target identifier, not '0'
    Info : device: 4 "2232C"
    Info : deviceID: 67330064
    Info : SerialNumber: FTQYA8VNA
    Info : Description: OOCDLink A
    Info : clock speed 600 kHz
    Info : JTAG tap: stm32.cpu tap/device found: 0x3ba00477 (mfg: 0x23b, part: 0xba00, ver: 0x3)
    Info : JTAG tap: stm32.flash tap/device found: 0x06414041 (mfg: 0x020, part: 0x6414, ver: 0x0)
    Info : JTAG tap: stm32.cpu tap/device found: 0x3ba00477 (mfg: 0x23b, part: 0xba00, ver: 0x3)
    Info : JTAG tap: stm32.flash tap/device found: 0x06414041 (mfg: 0x020, part: 0x6414, ver: 0x0)
    target state: halted
    target halted due to breakpoint, current mode: Handler HardFault
    xPSR: 0x20000003 pc: 0x20000004 msp: 0x20004fe0



    tak samo z resetem "sprzętowym" poprzez zwarcie do masy odpowiedniego wyprowadzenia, raz zadziała a raz nie....

    Czy możliwe, że moduł/procek jest uszkodzony?
    pozdrawiam
    Krzysiek
  • Pomocny post
    Specjalista - Mikrokontrolery
    Ustawiłeś odpowiednio piny BOOT0 i BOOT1? Po tym:

    Cytat:
    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!!
  • Poziom 14  
    Witam,
    Oczywiście piny wisiały sobie nie podpięte do niczego, połączyłem przez 10k BOOT0 do masy i działa super.
    Wielkie dzięki za pomoc
    Pozdrawiam
    Krzysiek