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-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 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.
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.
Konfigurer UART-indstillingerne under fanen Konfiguration, og vælg UART-indstillingerne som vist nedenfor. Aktiver indstillingen nvic global interrupt under fanen Nvic-indstillinger.
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.
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.
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