Szukaj…


Uwagi

Ta sekcja zawiera omówienie czym jest STM32 i dlaczego deweloper może chcieć go użyć.

Powinien również wymieniać wszelkie duże tematy w ramach STM32 i zawierać linki do powiązanych tematów. Ponieważ Dokumentacja dla STM32 jest nowa, może być konieczne utworzenie początkowych wersji tych pokrewnych tematów.

Co to jest STM32?


STM32 to 32-bitowa rodzina mikrokontrolerów Flash opracowana przez ST Microelectronics. Opiera się na procesorze ARM® Cortex® ‑ M i oferuje 32-bitową gamę produktów, która łączy w sobie bardzo wysoką wydajność, możliwości w czasie rzeczywistym, cyfrowe przetwarzanie sygnału oraz pracę przy niskim napięciu i niskiej mocy.

Szczegółowy opis każdej serii, narzędzi programistycznych i dekodowania numerów części można znaleźć na Wikipedii .

Seria produktów

Cortex-M0 / -M0 + Cortex-M3 Cortex-M4 Cortex-M7
Wysoka wydajność: STM32F2 STM32F4 STM32F7 , STM32H7
Główny nurt: STM32F0 STM32F1 STM32F3
Ultra-niska moc: STM32L0 STM32L1 STM32L4

Płyty rozwojowe

STM32 Nucleo ( włączony mbed ) Zestawy odkrywcze Tablice ewaluacyjne
Typowy przypadek użycia: Elastyczne prototypowanie, społeczność Prototypowanie, kreatywne pokazy Pełna ocena funkcji
Możliwości rozszerzenia: +++ ++ ++
Łączność: Arduino ™, ST, Morpho ST ST

Wersje

Wersja Data wydania
1.0.0 01.11.2016

Pierwsza konfiguracja z przykładem migającej diody LED przy użyciu SW4STM32 i biblioteki HAL

( Uwaga: Istnieje wiele IDE, toolchain i bibliotek, które są gotowe do użycia z STM32. Poniższa konfiguracja wymaga minimalnego wysiłku, aby działała, ale jest tylko jednym z wielu. Zapraszam do odkrywania innych, nie jest celem tego przykładu jest zmuszenie kogokolwiek do użycia narzędzi, które zostaną tutaj użyte).


Instalacja IDE

System Workbench dla STM32 : bezpłatne IDE dla systemów Windows, Linux i OS X. Został zbudowany przez AC6 i dostępny do pobrania po rejestracji ze strony internetowej społeczności OpenSTM32 .

Samo IDE jest oparte na Eclipse, ale zawiera pewne dodatki do rozwoju STM32, takie jak:

  • Ac6 STM32 MCU GCC łańcuch narzędzi
  • OpenOCD i GDB (arm-none-eabi-gdb) z automatycznie generowanymi konfiguracjami debugowania w zależności od płyty docelowej
  • Wbudowane opcje programowania lub kasowania układu

Aby rozpocząć od STM32 przed utworzeniem własnej płyty, zaleca się eksperymentowanie z płytą Discovery , Nucleo lub Eval , która jest wyposażona w programator / debugger SWD (Serial Wire Debug) o nazwie ST-Link.

Tworzenie projektu

W tym przykładzie wykorzystany zostanie zestaw Discovery STM32F4 , który zawiera mikrokontroler STM32F407VG. (Można użyć dowolnej innej planszy.)

  1. Otwórz SW4STM32 i utwórz nowy projekt C: Plik → Nowy → Projekt C

  2. Nadaj mu nazwę „STM32F4_Discovery-Blinky” iz listy Typ projektu wybierz Projekt MCU wykonywalny / Ac6 STM32 . Domyślnie jedynym dostępnym zestawem narzędzi jest Ac6 STM32 MCU GCC . Kliknij Następny.

    wprowadź opis zdjęcia tutaj

  3. Kolejnym krokiem są ustawienia debugowania / wydania. Można je teraz pominąć, klikając przycisk Dalej.

  4. Wybór zarządu . Istniejące płyty można wybrać, tak jak w tym przykładzie, odkrycie STM32F4 lub można dodać nowe płyty niestandardowe.

    wprowadź opis zdjęcia tutaj

  5. Następnym krokiem jest konfiguracja oprogramowania układowego projektu . Wybierz Bez oprogramowania , Standardową bibliotekę urządzeń peryferyjnych (SPL) lub Warstwę abstrakcji sprzętu (HAL). Pytanie, które z nich jest bardziej odpowiednie dla rozwoju, jest jednak kwestionowane w tym przykładzie. W tym przykładzie wykorzystana zostanie biblioteka HAL, ponieważ jest ona obecnie obsługiwana przez ST Microelectronics. Dodatkowym dostępnym narzędziem programowym dla HAL jest STM32CubeMX , który jest generatorem kodu inicjalizacji. Również kilka przykładowych aplikacji jest dostępnych w pakietach oprogramowania STM32CubeFx lub STM32CubeLx. Pobierz docelowe oprogramowanie układowe, jeśli go brakuje i zaleca się wybranie opcji „Dodaj sterowniki niskiego poziomu w projekcie” i „Jako źródła w aplikacji” . Na koniec kliknij przycisk Zakończ.

    wprowadź opis zdjęcia tutaj

Ponieważ ten projekt został utworzony za pomocą STM32F4 Discovery, w folderze / STM32F4_Discovery-Blinky / Utilities / STM32F4-Discovery / project znajduje się już kilka gotowych funkcji, których można użyć do interfejsu urządzeń peryferyjnych zestawu Discovery (akcelerometr, audio , Diody LED, przycisk). W tym przykładzie funkcje void BSP_LED_Init(Led_TypeDef Led) i void BSP_LED_Toggle(Led_TypeDef Led) zostaną użyte z pliku stm32f4_discovery.c do migania zielonej diody LED, którą jest LED4 . Aby zdecydować, która dioda LED jest używana, użyj schematów zestawu Discovery .

wprowadź opis zdjęcia tutaj

Rzeczywiste nazwy pinów i portów są już ukryte przez niektóre #define i enum , użyj Ctrl + Click, aby je śledzić.

  1. Wewnątrz main wywołaj funkcję HAL_Init() która resetuje wszystkie urządzenia peryferyjne, inicjuje interfejs Flash i Systick. (Systick zostanie użyty do wygenerowania opóźnienia migania).
  2. Zegar systemowy musi zostać skonfigurowany. Można tego dokonać za pomocą funkcji konfiguracji zegara STM32CubeMX lub w instrukcji obsługi. W tym przykładzie zegar systemowy jest zasilany przez wewnętrzną pętlę PLL (Phase Locked Loop), która pochodzi z zewnętrznego oscylatora krystalicznego 8 MHz (HSE). Preskalery zostały ustawione tak, aby osiągnąć maksymalną dostępną częstotliwość, która wynosi 168 MHz w przypadku F4 Discovery.
  3. Inicjalizacja urządzeń peryferyjnych, w tym przypadku pin GPIO.
  4. Wewnątrz nieskończonej pętli wywołaj przełączanie diod LED i funkcję HAL_Delay() . HAL_Delay() używa Systick i generuje opóźnienie w milisekundach.

Cały kod jest następujący:

#include "stm32f4xx.h"
#include "stm32f4_discovery.h"
            
void SystemClock_Config(void);

int main(void)
{
    /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
    HAL_Init();

    /* Configure the system clock */
    SystemClock_Config();

    /* Initialize one of the LED GPIO pin */
    BSP_LED_Init(LED4);

    while(1)
    {
        BSP_LED_Toggle(LED4);
        HAL_Delay(1000);       // in miliseconds
    }
}

/**
 * @brief  System Clock Configuration
 *         The system Clock is configured as follow :
 *            System Clock source            = PLL (HSE)
 *            SYSCLK(Hz)                     = 168000000
 *            HCLK(Hz)                       = 168000000
 *            AHB Prescaler                  = 1
 *            APB1 Prescaler                 = 4
 *            APB2 Prescaler                 = 2
 *            HSE Frequency(Hz)              = HSE_VALUE
 *            PLL_M                          = (HSE_VALUE/1000000u)
 *            PLL_N                          = 336
 *            PLL_P                          = 2
 *            PLL_Q                          = 7
 *            VDD(V)                         = 3.3
 *            Main regulator output voltage  = Scale1 mode
 *            Flash Latency(WS)              = 5
 * @param  None
 * @retval None
 */
void SystemClock_Config(void)
{
  RCC_ClkInitTypeDef RCC_ClkInitStruct;
  RCC_OscInitTypeDef RCC_OscInitStruct;

  // Enable Power Control clock
  __PWR_CLK_ENABLE();

  // The voltage scaling allows optimizing the power consumption when the
  // device is clocked below the maximum system frequency, to update the
  // voltage scaling value regarding system frequency refer to product
  // datasheet.
  __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);

  // Enable HSE Oscillator and activate PLL with HSE as source
  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
  RCC_OscInitStruct.HSEState = RCC_HSE_ON;
  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
  RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;

  // This assumes the HSE_VALUE is a multiple of 1MHz. If this is not
  // your case, you have to recompute these PLL constants.
  RCC_OscInitStruct.PLL.PLLM = (HSE_VALUE/1000000u);
  RCC_OscInitStruct.PLL.PLLN = 336;
  RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2;
  RCC_OscInitStruct.PLL.PLLQ = 7;
  HAL_RCC_OscConfig(&RCC_OscInitStruct);

  // Select PLL as system clock source and configure the HCLK, PCLK1 and PCLK2
  // clocks dividers
  RCC_ClkInitStruct.ClockType = (RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_HCLK
      | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2);
  RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
  RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
  RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV4;
  RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2;
  HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_5);
}

Buduj za pomocą młotka wprowadź opis zdjęcia tutaj i pobierz aplikację, klikając prawym przyciskiem myszy folder projektu i wybierając opcję Cel → Chip programowy ...

Innym sposobem pobierania jest użycie debugowania . Aby to zrobić, kliknij strzałkę obok ikony błędu wprowadź opis zdjęcia tutaj na pasku narzędzi i otwórz menu Konfiguracja debugowania ... Utwórz nową konfigurację debugowania Ac6 STM32, a jeśli pole Aplikacja C / C ++ jest puste, wypełnij następujące pola:

Debuguj \ STM32F4_Discovery-Blinky.elf

Inne parametry debugowania, takie jak plik konfiguracyjny OpenOCD oraz używane porty Telnet i GDB, są automatycznie generowane i wypełniane przez środowisko. Na koniec kliknij przycisk Debuguj.



Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow