Introduktion til programmering af STM32 ARMBARK-M 32-bit mikrocontrollere

i denne dybdegående artikel lærer du, hvordan du udvikler indlejret firma til STM32 hjernebark-M 32-bit mikrocontrollere ved hjælp af de forskellige udviklingsværktøjer.

STM32 mikrocontroller

77 aktier

STM32-serien er nogle af de mest populære mikrocontrollere, der anvendes i en lang række produkter. De har også en fremragende support base fra flere microcontroller udviklingsfora.

denne familie af mikrocontrollere fra STMicroelectronics er baseret på ARMBARKEN-M 32-bit processorkerne.

STM32 mikrocontrollere tilbyder et stort antal serielle og parallelle kommunikationsudstyr, der kan forbindes med alle slags elektroniske komponenter, herunder sensorer, skærme, kameraer, motorer osv. Alle STM32-varianter leveres med intern flashhukommelse og RAM.

rækkevidden af ydeevne, der er tilgængelig med STM32, er ret ekspansiv. Nogle af de mest basale varianter inkluderer stm32f0 og STM32F1 underserier, der starter med en klokfrekvens på kun 24 MHG, og fås i pakker med så få som 16 stifter.

på den anden ydeevne ekstrem, stm32h7 opererer på op til 400 MHG, og fås i pakker med så mange som 240 ben.

de mere avancerede modeller fås med Floating Point Units (FPU) til applikationer med alvorlige numeriske krav til behandling. Disse mere avancerede modeller slører linjen mellem en mikrocontroller og en mikroprocessor.

endelig er STM32L-underserien designet specielt til bærbare applikationer med lav effekt, der kører fra et lille batteri.

udviklingsværktøjer

udviklingsværktøjer er nødvendige for at udvikle koden, programmere mikrocontrolleren og teste / debug koden. Udviklingsværktøjerne inkluderer:

  • Compiler
  • Debugger
  • in-Circuit Serial programmør (ICSP)
Programmering af STM32

Programmering af STM32 via in-Circuit-Serial-programmereren (ICSP).

Der findes flere værktøjer til udvikling af kode på STM32 mikrocontrollere. Programmerne er tilgængelige som Integrated Development Environments (IDE), som kombinerer alle de nødvendige værktøjer til et integreret miljø.

to fælles udviklingspakker omfatter:

  • Keil MDK ARM (uVison5 IDE) – MDK ARM IDE er et meget stabilt udviklingsmiljø, som kan hentes gratis. Det tillader udvikling af kode op til en programstørrelse på 32 KB. For at udvikle større programmer skal en licenseret version købes her.
  • CoIDE – en gratis værktøjskæde, der er baseret på en trimmet version af Eclipse IDE integreret sammen med en indlejret ARMVERSION af free gcc compiler.

der er også flere andre ide ‘ er, der er tilgængelige til brug med STM32 mikrocontrollere. Denne artikel fokuserer dog på at udvikle og blinke et program ved hjælp af den meget populære Keil MDK ARM uVision5 IDE.

bortset fra programværktøjerne kræves en in-Circuit Serial programmør (ICSP) for at programmere og teste koden på den aktuelle mikrocontroller. ICSP er påkrævet for at interface mikrocontrolleren til PC-værktøjsværktøjerne via en USB-port.

armbarken-m-mikrocontrollere understøtter to programmeringsprotokoller: JTAG (navngivet af electronics industry association The Joint Test Action Group) og seriel Trådfejlfinding (SD).

der er flere ICSP-programmører til rådighed, der understøtter disse protokoller, herunder:

  • Keil U-Link 2
  • Segger J-Link
  • ST-Link

udvikling af den første applikation

det er altid nemmest at starte med en let tilgængelig grundlæggende koderamme. Tilføj derefter den kode, der kræves til den specifikke applikation og model af mikrocontroller.heldigvis giver STMicroelectronics et meget nyttigt grafisk værktøj kaldet Stm32cubemks, der hjælper med at skabe et grundlæggende applikationsprojekt til enhver STM32 mikrocontroller efter eget valg. Det kan også bruges til at konfigurere perifere enheder på mikrocontrollerens multipleksede stifter.

værktøjet STM32 kan hentes herfra. STM32Cube leveres med et omfattende sæt drivere til alle typer perifere enheder og understøttelse af et valgfrit FreeRTOS (et gratis Realtidsoperativsystem), der er præintegreret med koden.

det følgende afsnit beskriver detaljeret, hvordan man opretter en simpel UART-applikation til stm32f030-mikrocontrolleren, der gentager det, der er skrevet i et terminalvindue.

  • Installer programmet Stm32cubem.
  • Kør programmet og vælg Nyt projekt. Det åbner derefter MCU-Vælgervinduet som vist nedenfor.
  • dobbeltklik for at vælge den anvendte mikrocontrollermodel. I dette tilfælde bruger vi STM32F030K6. Det fører dig derefter til pinout-siden for den valgte mikrocontroller.

skærmbillede om opsætning af nyt projekt i Stm32cubemh

STM32F030K6 er en ARMBARK-M0-kerne med 32 KB flashhukommelse og 4 kB RAM-hukommelse. Eksempelkoden muliggør UART, der bruger pa9-og PA10-stifterne til modtagelse og transmission af serielle data som vist nedenfor med de grønne stifter.

skærmbillede, der viser pinout for STM32F030K6 i Stm32cubemh

Konfigurer UART-indstillingerne under fanen Konfiguration, og vælg UART-indstillingerne som vist nedenfor. Aktiver indstillingen nvic global interrupt under fanen Nvic-indstillinger.

skærmbillede, der viser, hvordan du konfigurerer UART–indstillinger Stm32cubemh

naviger derefter til Project – >Indstillinger for at tilføje det nye projektnavn og vælge værktøjskæden IDE, der skal bruges. I dette eksempel skal du indstille projektnavnet til ‘UARTEcho’ og vælge Keil-MDK5 IDE til projektudviklingen.

generer endelig projektkoden ved at klikke på Project- > Generer kode.

opbygning og blinkning af koden

åbn nu den genererede MDK-ARM-projektfil UARTEcho\MDK-ARM\UartEcho.oprør.

dette program indtil videre initialiserer UART-periferien og stopper i en uendelig løkke.

det er vigtigt at bemærke, at STM32Cube genererer /* brugerkode start */ og /* brugerkode slut */ kommentarblokke for at implementere den brugerspecifikke kode. Brugerkoden skal skrives inden for disse kommentarblokke. Når koden er re-genereret med modificerede konfigurationer stmcube værktøj bevarer brugerkoden inden for disse bruger kommentar blokke.

Definer derefter en global variabel for at modtage en byte fra UART i hovedsagen.c kildefil:

/* USER CODE BEGIN PV *//* Private variables ———————————————————*/static uint8_t recv_data;/* USER CODE END PV */

efter alle initialiseringskoden skal du aktivere driveren til at modtage 1 byte. Følgende funktion gør det muligt at afbryde bit.

/* USER CODE BEGIN 2 */HAL_UART_Receive_IT(&huart1, &recv_data, 1);/* USER CODE END 2 */

Tilføj nu en tilbagekaldsfunktion for at håndtere modtageafbrydelsen og sende den modtagne byte.

/* USER CODE BEGIN 0 */void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart){HAL_UART_Transmit(huart, huart->pRxBuffPtr, 1, 1000);}/* USER CODE END 0 */

endelig skal vi kompilere koden og flash (Hent) den til mikrocontrolleren.

når Keil MDK ARM IDE er installeret, er drivere til ST-LINK V2, J-Link og Ulink2 tilgængelige. St-Link debugger vælges som standard. Gå til projekter–>Indstillinger for mål og i fanen Debug skal du vælge den anvendte ICSP-programmør.

Flash koden ved at vælge Flash- >Hent.

Bemærk: Sørg for at hente din gratis PDF-guide 15 trin til at udvikle dit nye elektroniske Udstyrsprodukt.

mikrocontrolleren gentager nu alle data, der modtages over UART. Den kan tilsluttes til en PC ved hjælp af en USB-til-seriel konverter. På PC ‘ en åbnes COM-porten med en terminalapplikation ved hjælp af indstillingerne 115200-8-N-1. Nu vil alt, hvad der sendes fra terminalen, ekko tilbage gennem mikrocontrolleren.

afbrydelsessystem

STM32-afbrydelsessystemet er baseret på ARMBARKEN m-Kerne nvic perifer. STM32 MCU ‘ erne understøtter flere maskerbare afbrydelseskanaler bortset fra de 16 afbrydelseskanaler i ARMKERNEN.for eksempel understøtter STM32F0 MCU-serien 32 maskerbare afbrydelser. Undtagelsen og afbrydelsesvektortabellen for denne familie af MCU ‘ er er angivet i nedenstående tabel.

Interrupt Description Vector Address
Reserved 0x00000000
Reset Reset 0x00000004
NMI Non maskable interrupt. The RCC clock security system (CSS) is linked to the NMI vector 0x00000008
HardFault All class of faults 0x0000000C
SVCall System service call via SWI Instruction 0x0000002C
PendSV Pendable request for system service 0x00000038
SysTick System tick timer 0x0000003C
WWDG Window watchdog interrupt 0x00000040
PVD_VDDIO2 PVD and VDDIO2 supply comparator interrupt (combined with EXTI lines 16 and 31) 0x00000044
RTC RTC interrupts (combined EXTI lines 17, 19 and 20) 0x00000048
Flash Flash global interrupt 0x0000004C
RCC_CRS RCC and CRS global interrupts 0x00000050
EXTI0_1 EXTI line interrupts 0x00000054
EXTI2_3 EXTI line interrupts 0x00000058
EXTI4_15 EXTI line interrupts 0x0000005C
TSC Touch sensing interrupt 0x00000060
DMA_CH1 DMA channel 1 interrupt 0x00000064
DMA_CH2_3
DMA2_CH1_2
DMA channels 2 and 3 interrupts
DMA2 channel1 and 2 interrupts
0x00000068
DMA_CH4_5_6_7
DMA2_CH3_4_5
DMA channel 4,5,6 and 7 interrupts
DMA2 channel 3, 4, and 5 interrupts
0x0000006C
ADC_COMP ADC and COMP interrupts (Combined EXTI lines 21 and 22) 0x00000070
TIM1_BRK_UP_TRG_COM TIM1 break, update, trigger and commutation interrupts 0x00000074
TIM1_CC TIM1 capture compare interrupt 0x00000078
TIM2 TIM2 global interrupt 0x0000007C
TIM3 TIM3 global interrupt 0x00000080
TIM6_DAC TIM6 global interrupt and DAC underrun interrupt 0x00000084
TIM7 TIM7 global interrupt 0x00000088
TIM14 TIM14 global interrupt 0x0000008C
TIM15 TIM15 global interrupt 0x00000090
TIM16 TIM16 global interrupt 0x00000094
TIM17 TIM17 global interrupt 0x00000098
I2C1 I2C1 global interrupt (combined with EXTI line 23) 0x0000009C
I2C2 I2C2 global interrupt 0x000000A0
SPI1 SPI1 global interrupt 0x000000A4
SPI2 SPI2 global interrupt 0x000000A8
USART1 USART1 global interrupt (combined with EXTI line 25) 0x000000AC
UART2 USART2 global interrupt (combined with EXTI line 26) 0x000000B0
USART3_4_5_6_7_ 8 USART3, USART4, USART5, USART6, USART7, USART8 global interrupts (combined with EXTI line 28) 0x000000B4
CEC_CAN CEC and CAN global interrupts (combined with EXTI line 27 0x000000B8
USB USB global interrupt (combined with EXTI line 18) 0x000000BC

Extended STM32 MCU ‘ erne har en udvidet afbrydelses-og Begivenhedscontroller, der administrerer de eksterne og interne asynkrone begivenheder/afbryder og genererer begivenhedsanmodningen til CPU/Afbrydelsescontrolleren og en vækkeanmodning til strømstyringen.

hver af de en eller flere EKSTI linjer er kortlagt til en af NVIC interrupt vektorer.

for de eksterne interrupt-linjer skal interrupt-linjen konfigureres og aktiveres for at generere en interrupt. Dette gøres ved at programmere de to triggerregistre med den ønskede kantdetektering og ved at aktivere afbrydelsesanmodningen ved at skrive en ‘1’ til den tilsvarende bit i afbrydelsesmaskeregistret.

ekstern afbrydelse og GPIO-kortlægning

hver af de GPIO, der er tilgængelige på systemet, kan konfigureres til at generere en afbrydelse. Men hver af de eksterne afbrydelseslinjer er kortlagt til flere GPIO-stifter. For eksempel PIO0 på alle de tilgængelige GPIO-porte (A,B,C osv.) vil blive kortlagt til EKSTI0-linjen. PIO1 for alle porte vil blive kortlagt til EKSTI1-linjen og så videre.

Nogle af EKSTI-linjerne kombineres til en enkelt NVIC-vektor. For eksempel er EKSTI4_15 kortlagt til en enkelt vektoradresse, så der vil være en enkelt afbrydelsesrutine for alle afbrydelser fra PIO4 til PIO15. Men kilden til afbrydelsen kan identificeres ved at læse afbrydelsesregistret.

en vigtig ting at overveje, når du designer et system ved hjælp af STM32 MCU ‘ er, er valget af GPIO-stifterne til afbrydelserne. MCU ‘en kan have mere end 16 GPIO’ er tilgængelige på enheden, men der er kun 16 eksterne afbrydelseslinjer tilgængelige.

for eksempel kan EKSTI_0 kortlægges til enten PA0 eller PB0, men ikke begge dele. Så mens du vælger stifterne til eksterne afbrydelser, skal de vælges således, at de entydigt kan kortlægges til en af EKSTI-linjerne.

i det følgende afsnit beskrives, hvordan du konfigurerer en afbrydelse ved hjælp af STM32-terningen.

screenshot configuring interrupt Stm32cubemh

vælg fanen Konfiguration, og vælg det udstyrsmodul, som afbrydelsen skal konfigureres til. Modulkonfigurationsvinduet åbnes.

vælg derefter fanen nvic-indstillinger, og aktiver den globale afbrydelse.

koden for at aktivere afbrydelsen for modulet vil blive genereret i stm32f0h_hal_msp.c i HAL_ <modul> _MSPInit(…) funktion.

/* USART1 interrupt Init */HAL_NVIC_SetPriority(USART1_IRQn, 0, 0);HAL_NVIC_EnableIRQ(USART1_IRQn);

koden genereret af STM32-terningen vil have implementeringen af alle afbrydelser. Når afbrydelsen er aktiveret, vil koden blive inkluderet i applikationen.

normalt håndterer den genererede kode allerede irk og rydder det flag, der genererede afbrydelsen. Det kalder derefter et program tilbagekald, der svarer til den begivenhed, der genererede afbrydelsen for modulet.

STM32 HAL implementerer en tilbagekald for hver af hændelsestyperne inden for hvert modul som en del af driveren. I dette eksempel skal den komplette tilbagekald kopieres fra stm32f0h_hal_uart.C-fil.

tilbagekaldsfunktionerne i driveren implementeres med en __svag linkerattribut. Brugeren skal implementere en kopi af den nødvendige tilbagekaldsfunktion ved at fjerne den __svage attribut i en af applikationsfilerne og derefter skrive den specifikke håndtering, der kræves inden for denne funktion.

/*** @brief Rx Transfer completed callback.* @param huart UART handle.* @retval None*/__weak void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart){/* Prevent unused argument(s) compilation warning */UNUSED(huart);

/* NOTE : This function should not be modified, when the callback is needed,the HAL_UART_RxCpltCallback can be implemented in the user file.*/}

konklusion

denne vejledning er en introduktion til at skrive et program, der arbejder med STM32-familien af mikrocontrollere. Der er flere andre metoder til at skrive en ansøgning, men den diskuterede STM32Cube er en nem og intuitiv metode til at komme i gang.

dette værktøj forenkler initialiseringen af mikrocontrollerens perifere enheder. Det forbedrer også vedligeholdelsen af koden, især når der er udstyrsrevisioner, der kræver omlægning af signalerne til forskellige stifter.

en anden fordel ved at bruge stm32cube-værktøjet er, at det genererer en rapport om brugerkonfigurationen til mikrocontrolleren. I denne rapport beskriver det urtræet, pin-kortlægning og udstyrsmodulkonfiguration, som alle er meget nyttige.

der er også flere andre kodebiblioteker og eksempelprogrammer tilgængelige for alle STM32-varianterne. Støtte til flere ide ‘ er er også inkluderet.

Hvis dit projekt kræver en sofistikeret 32-bit mikrocontroller, anbefaler jeg stærkt STM32-serien. Ikke alene er de magtfulde og populære, men STM32 mikrocontrollere er også ret overkommelige.

Har du brug for mere træning i programmering af STM32 mikrocontrollere? I så fald er her et mere dybtgående introduktionskursus, som du bør tjekke ud.

denne artikel er skrevet af Mohan Kashivasi fra Vithamas Technologies. Han er også en af de eksperter, der er tilgængelige for at hjælpe dig med dit produkt inden for Isenkramakademiet.

endelig, glem ikke at hente din gratis PDF: Ultimate Guide til at udvikle og sælge dit nye elektroniske produkt. Du modtager også mit ugentlige nyhedsbrev, hvor jeg deler premium-indhold, der ikke er tilgængeligt på min blog.

andet indhold, du måske kan lide:

  • Introduktion til STM32CubeIDE til STM32 mikrocontrollere
  • Sådan vælges mikrocontrolleren til dit nye produkt
  • brug af Arduino som en integreret udviklingsplatform
  • datablad gennemgang: Entry-Level STM32 Cortex-M0 Microcontroller (Blog + Video)
  • Introduction to the Ultra High-Performance STM32H7 32-bit Microcontroller
4.52votes
Article Rating

Skriv et svar

Din e-mailadresse vil ikke blive publiceret.