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:
- Eclipse IDE for C/C++ Developers (Kepler)
- GNU Tools for ARM Embedded Processors
- STM32F0Discovery Firmware
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".
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
- stm32f0xx_it.h
- stm32f0xx_conf.h
- "STM32F0-Discovery_FW_V1.0.0\Project\Peripheral_Examples\IO_Toggle\TrueSTUDIO\IO_Toggle"
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
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}
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:
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ńSuper, działa z Nucleo-L152RE, działa z Discovery F4.
OdpowiedzUsuńSkąd wziąć firmware STMa? "STM32F0-Discovery_FW_V1.0.0\Project\Peripheral_Examples\IO_Toggle".
OdpowiedzUsuń