stm32Aan de slag met stm32


Opmerkingen

Deze sectie geeft een overzicht van wat stm32 is en waarom een ontwikkelaar het misschien wil gebruiken.

Het moet ook alle grote onderwerpen binnen stm32 vermelden en een link naar de gerelateerde onderwerpen bevatten. Aangezien de documentatie voor stm32 nieuw is, moet u mogelijk eerste versies van die gerelateerde onderwerpen maken.

Wat is STM32?


STM32 is een 32-bit Flash-microcontrollerfamilie ontwikkeld door ST Microelectronics. Het is gebaseerd op de ARM® Cortex®-M processor en biedt een 32-bits productassortiment dat zeer hoge prestaties, realtime mogelijkheden, digitale signaalverwerking en laagvermogen, laagspanningswerking combineert.

Een gedetailleerde beschrijving van elke serie, ontwikkelingstools en onderdeelnummerdecodering is te vinden op Wikipedia .

Serie producten

Cortex-M0 / -M0 + Cortex-M3 Cortex-M4 Cortex-M7
Hoge performantie: STM32F2 STM32F4 STM32F7 , STM32H7
Mainstream: STM32F0 STM32F1 STM32F3
Ultra-low-power: STM32L0 STM32L1 STM32L4

Ontwikkelingsborden

STM32 Nucleo ( mbed ingeschakeld ) Ontdekkits Evaluatieborden
Typisch gebruik: Flexibele prototyping, gemeenschap Prototyping, creatieve demo's Volledige evaluatie van functies
Uitbreidingsmogelijkheden: +++ ++ ++
connectiviteit: Arduino ™, ST, Morpho ST ST

versies

Versie Publicatiedatum
1.0.0 2016/11/01

Eerste installatie met knipperend LED-voorbeeld met behulp van SW4STM32 en HAL-bibliotheek

( Opmerking: er zijn veel IDE, toolchain en bibliotheek die klaar zijn voor gebruik met STM32. De volgende installatie vereist minimale inspanning om het te laten werken, maar het is slechts een van de vele. Voel je vrij om anderen te verkennen, het is niet het doel van dit voorbeeld om iedereen te dwingen de tools te gebruiken die hier worden gebruikt.)


IDE installatie

System Workbench voor STM32 : gratis IDE op Windows, Linux en OS X. Het is gebouwd door AC6 en kan na registratie worden gedownload van de OpenSTM32 Community-website .

De IDE zelf is gebaseerd op Eclipse, maar wordt geleverd met enkele extra's voor STM32-ontwikkeling, zoals:

  • Ac6 STM32 MCU GCC-gereedschapsketen
  • OpenOCD en GDB (arm-geen-eabi-gdb) met automatisch gegenereerde debug-configuraties afhankelijk van het doelbord
  • Ingebouwde opties om een chip te programmeren of te wissen

Om te beginnen met STM32 voordat u uw eigen bord maakt, wordt het aanbevolen om te experimenteren met een Discovery- , een Nucleo- of een Eval-bord , die worden geleverd met een ingebouwde SWD-programmeur / debugger (SWD) genaamd ST-Link.

Een project maken

In dit voorbeeld wordt een STM32F4 Discovery-kit gebruikt met een STM32F407VG-microcontroller. (Elk ander bord kan ook worden gebruikt.)

  1. Open SW4STM32 en maak een nieuw C-project: Bestand → Nieuw → C-project

  2. Geef het een naam zoals "STM32F4_Discovery-Blinky" en kies uit de lijst Projecttype het uitvoerbare / Ac6 STM32 MCU-project . Standaard is de enige beschikbare toolchain Ac6 STM32 MCU GCC . Klik volgende.

    voer hier de afbeeldingsbeschrijving in

  3. De volgende stap is Instellingen voor foutopsporing / vrijgave. U kunt deze nu overslaan door op Volgende te klikken.

  4. Bord selectie . Bestaande boards kunnen worden geselecteerd zoals in dit voorbeeld de STM32F4 Discovery of nieuwe custom boards kunnen worden toegevoegd.

    voer hier de afbeeldingsbeschrijving in

  5. De volgende stap is de configuratie van de projectfirmware . Kies tussen Geen firmware , Standaard perifere bibliotheek (SPL) of Hardware Abstraction Layer (HAL). De vraag is welke meer geschikt is voor ontwikkeling, maar deze vraag valt buiten het bereik van dit voorbeeld. In dit voorbeeld wordt de HAL-bibliotheek gebruikt, omdat deze momenteel wordt ondersteund door ST Microelectronics. Extra beschikbare softwaretool voor HAL is STM32CubeMX , wat een initialisatiecodegenerator is. Ook zijn er verschillende voorbeeldtoepassingen beschikbaar met de softwarepakketten STM32CubeFx of STM32CubeLx. Download de doelfirmware als deze ontbreekt en het wordt aanbevolen om de opties "Stuurprogramma's op laag niveau toevoegen" en "Als bronnen in de toepassing" te selecteren. Klik ten slotte op Voltooien.

    voer hier de afbeeldingsbeschrijving in

Knipperen LED-applicatie

Omdat dit project is gemaakt met een STM32F4 Discovery, zijn er al verschillende kant-en-klare functies in de map / STM32F4_Discovery-Blinky / Utilities / STM32F4-Discovery / project die kunnen worden gebruikt om de randapparatuur van de Discovery kit te koppelen (versnellingsmeter, audio) , LED's, drukknop). In dit voorbeeld worden de void BSP_LED_Init(Led_TypeDef Led) en de void BSP_LED_Toggle(Led_TypeDef Led) gebruikt vanuit het bestand stm32f4_discovery.c om de groene LED te knipperen, wat LED4 . Om te beslissen welke LED is welke de schema's van de Discovery-kit gebruiken .

voer hier de afbeeldingsbeschrijving in

De eigenlijke pin- en poortnamen zijn al verborgen door een aantal #define en enum , gebruik Ctrl + Click om ze te volgen.

  1. HAL_Init() in het main de functie HAL_Init() , die alle randapparatuur reset, de Flash-interface en de Systick initialiseert. (Systick wordt gebruikt om vertraging voor het knipperen te genereren.)
  2. De systeemklok moet worden geconfigureerd. Dit kan met behulp van de STM32CubeMX-klokconfiguratiefunctie of de referentiehandleiding. In dit voorbeeld wordt de systeemklok gevoed door de interne PLL (Phase Locked Loop), die afkomstig is van een externe 8 MHz kristaloscillator (HSE). Prescalers zijn ingesteld om de maximale beschikbare frequentie te bereiken, die 168 MHz is in het geval van de F4 Discovery.
  3. Initialisatie van de randapparatuur, in dit geval een GPIO-pin.
  4. HAL_Delay() in een eindeloze lus de LED-schakelaar en de functie HAL_Delay() aan. HAL_Delay() gebruikt de Systick en genereert een vertraging in miliseconden.

De hele code is de volgende:

#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);
}
 

Bouw met de hamer voer hier de afbeeldingsbeschrijving in en download de toepassing door met de rechtermuisknop op de projectmap te klikken en de optie Doel → Programma-chip ... te selecteren.

Een andere manier om te downloaden is met behulp van debug . Klik hiervoor op de pijl naast het bug-pictogram voer hier de afbeeldingsbeschrijving in in de werkbalk en open het Debug Configuration ... menu. Maak een nieuwe Ac6 STM32-foutopsporingsconfiguratie en vul het volgende in als het veld C / C ++ Application leeg is:

Debug \ STM32F4_Discovery-Blinky.elf

Andere debug-parameters zoals het OpenOCD-configuratiebestand en de gebruikte Telnet- en GDB-poorten worden automatisch gegenereerd en ingevuld door het framework. Klik ten slotte op de knop Foutopsporing.