sobota, 7 grudnia 2013

Konfiguracja Eclipse i STM32F0


W tym artykule opiszę jak skonfigurować Eclipse do programowania STM32F0 (dla innych serii procesorów trzeba co nieco zmienić - w innym wpisie opiszę jakie modyfikacje trzeba wprowadzić w przypadku STM32F4).

     Ściągamy programy i biblioteki STM32:


1. Instalujemy GNU Tools for ARM.

2. Tworzymy na dysku C lub innym folder, gdzie wrzucimy wszystkie potrzebne pliki (u mnie "H:\stm32_dev"). Rozpakowujemy tam ściągnięty firmware.

3. Rozpakowujemy do tego folderu Eclipse i go uruchamiamy (ustawiamy przestrzeń roboczą np. na "H:\stm32_dev\workspace").

4. Klikamy File->New->C Project, dajemy nazwę STM32F0_Template (lub cokolwiek innego). Wybieramy Executable->Cross GCC.

5. Klikamy dalej, odznaczamy opcję Debug. Klikamy Dalej.

6. Na następnej karcie trzeba podać nazwę prefiksu kompilatora. W "Cross Compiler Prefix" wpisujemy "arm-none-eabi-".
Wybieramy ścieżkę kompilatora (u mnie: "C:\Program Files (x86)\GNU Tools ARM Embedded\4.6 2012q2\bin"). Klikamy Finish.



7. Tworzymy w projekcie folder "startup". Do tego folderu wrzucamy plik assemblera  "startup_stm32f0xx" znajdujący się w katalogu zawierającym firmware:
  •  "STM32F0-Discovery_FW_V1.0.0\Libraries\CMSIS\ST\STM32F0xx\Source\Templates\TrueSTUDIO". 
Klikamy w Eclipse prawym na ten plik. Wybieramy Rename i zmieniamy rozszerzenie na duże .S zamiast małego .s.

8. Wchodzimy do katalogu firmware zawierającym przykładowy projekt mrugający diodami:
  • "STM32F0-Discovery_FW_V1.0.0\Project\Peripheral_Examples\IO_Toggle".

Tworzymy w naszym projekcie folder "src" i "inc".

Do "src" wrzucamy pliki z projektu IO_Toggle:
  • main.c
  • stm32f0xx_it.c
  • system_stm32f0xx.c
Natomiast do "inc":
  • stm32f0xx_it.h
  • stm32f0xx_conf.h
9. Wchodzimy do katalogu:
  • "STM32F0-Discovery_FW_V1.0.0\Project\Peripheral_Examples\IO_Toggle\TrueSTUDIO\IO_Toggle
i kopiujemy plik linkera "stm32_flash.ld" do projektu.

Powinno to wyglądać teraz mniej więcej tak:


10. Klikamy Project->Properties. Klikamy C/C++ General->Paths and Symbols.

W zakładce Includes wybieramy GNU C. Kilkamy Add. Wpisujemy "inc" i klikamy OK.

Podobnie dodajemy katalogi z firmware:
  • ../../STM32F0-Discovery_FW_V1.0.0/Libraries/CMSIS/Include 
  • ../../STM32F0-Discovery_FW_V1.0.0/Libraries/CMSIS/ST/STM32F0xx/Include
  • ../../STM32F0-Discovery_FW_V1.0.0/Libraries/STM32F0xx_StdPeriph_Driver/inc
Klikamy Apply, a następnie No na jak wyskoczy okienko.

11. Następnie w Paths and Symbols wybieramy zakładkę Source Location. Klikamy Link Folder.

Folder Name ustawiamy na np. STM32F0xx_StdPeriph_Driver.

Zaznaczamy Link to folder in the file system.

Klikamy Browse i wskazujemy na folder zawierający bibliotekę peryferiów. U mnie to wygląda tak:
  •  "H:\stm32_dev\STM32F0-Discovery_FW_V1.0.0\Libraries\STM32F0xx_StdPeriph_Driver\src".

Klikamy OK. Apply i znów OK. Teraz struktura projektu powinna wyglądać tak:



12. Klikamy ponownie Project->Properties. Następnie rozwijamy C/C++ Build i wybieramy Settings. W zakładce Tool Settings wybieramy Cross GCC Compiler, następnie Symbols. Klikamy Add w Defined Symbols. Dodajemy symbole
  • STM32F0XX
  • USE_STDPERIPH_DRIVER

13. W Miscellaneous w polu Other flags dodajemy "-mthumb -mcpu=cortex-m0".

14. Podobnie w Cross GCC Linker, w Miscellaneous, w Polu Linker flags dodajemy:
  •  -T "${ProjDirPath}/stm32_flash.ld" -mthumb -mcpu=cortex-m0 -Wl,--gc-sections

15. W polu Cross GCC Assembler w sekcji General w polu Assembler flags dodajemy:
  •  -mthumb -mcpu=cortex-m0

16. Wychodzimy z ustawień (przy każdej z powyższych zmian warto kliknąć Apply) i wybieramy Project->Build. Powinno się ładnie skompilować wszystko:


17. Teraz musimy wyprodukować plik .hex. Kilkamy Project->Preferences->C/C++ Build->Settings, zakładka Build Steps.

W Post-build steps dodajemy w polu Command:
  •  arm-none-eabi-objcopy -S -O ihex ${ProjName} ${ProjName}.hex; arm-none-eabi-size ${ProjName}
Klikamy Apply. Budujemy projekt i powinno stworzyć nam pięknego hexa do wgrania na procesor.

18. Na dokładkę warto zaznaczyć w opcjach kompilatora (C/C++ Build->Settings->Tool Settings) w polu optymalizacje opcję -Os (Optimize for size).

Wynik kompilacji:


Wgrywamy plik .hex np. ST-Link Utility (można go dodać jako External Tool w Eclipse, żeby jednym kliknięciem wgrywał) i śmiga. Diody lekko się palą, bo są za szybko przełączane. Można dodać jakąś pętlę, to będą mrugać:

#include "stm32f0xx.h"
#include "stm32f0xx_conf.h"

#define BSRR_VAL        0x0300
GPIO_InitTypeDef        GPIO_InitStructure;

int main(void)
{

  /* GPIOC Periph clock enable */
  RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOC, ENABLE);

  /* Configure PC8 and PC9 in output pushpull mode */
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
  GPIO_Init(GPIOC, &GPIO_InitStructure);

  volatile uint32_t times;

  while (1)
  {
    /* Set PC8 and PC9 */
    GPIOC->BSRR = BSRR_VAL;

    for(times=0;times<1000000;times++);

    /* Reset PC8 and PC9 */
    GPIOC->BRR = BSRR_VAL;

    for(times=0;times<1000000;times++);
   
  }
}


Warto sobie skopiować tak utworzony szablon w bezpieczne miejsce i można już działać na otwartym projekcie (zaczynając np. od zmiany nazwy na pożądaną - prawym na nazwę projektu i Rename).

Pewnie dałoby się parę rzeczy usprawnić (co może i zrobię w przypadku nadmiaru czasu), ale ważne, że działa i można teraz wykorzystać wszystkie możliwości Eclipse do programowania STM32. W innym artykule opiszę jak dodać możliwość debugowania.

 

Uruchamianie ST-Link z poziomu Eclipse


Aby dodać możliwość programowania układu z poziomu Eclipse:

1. Klikamy Run->External Tools->External Tool Configurations.

2. Klikamy New Launch Configuration po lewej stronie u góry.

3. W Name dajemy np. ST_LINK. Klikamy Browse File System i szukamy aplikacji ST-Link_CLI.exe (u mnie: "C:\Program Files (x86)\STMicroelectronics\STM32 ST-LINK Utility\ST-LINK Utility\ST-LINK_CLI.exe")

4. W Working Directory dajemy np. "${workspace_loc:/${project_name}}"

5. W Arguments wpisujemy: "-c SWD -p "Release/${project_name}.hex" -v -Rst -Run"

6. W zakładce Build odznaczamy Build Before Launch. I klikamy Apply.

Zaznaczamy zbudowany projekt w Project Explorer i klikamy Run->External Tools->ST_LINK. Jeżeli procesor jest prawidłowo podłączony, to program powinien zostać poprawnie wgrany do pamięci Flash:



Skonfigurowany projekt 

(może u Was też zadziała :P - podpowiedź: trzeba zacząć od zmiany ścieżek:











3 komentarze:

  1. Próbowałem kilka podejść do STM32F4 i eclipse z marnym skutkiem :( Natknąłem się na ten blog i się udało :) Wielkie dzięki

    OdpowiedzUsuń
  2. Super, działa z Nucleo-L152RE, działa z Discovery F4.

    OdpowiedzUsuń
  3. Skąd wziąć firmware STMa? "STM32F0-Discovery_FW_V1.0.0\Project\Peripheral_Examples\IO_Toggle".

    OdpowiedzUsuń