Johdanto ohjelmointiin STM32 ARM Cortex-M 32-bittiset Mikrokontrollerit

tässä perusteellisessa artikkelissa opit kehittämään sulautettuja firmwareja STM32 Cortex-M 32-bittisille mikrokontrollereille käyttäen erilaisia kehitystyökaluja.

STM32 Mikrokontrolleri

77 osaketta

STM32-sarja on yksi suosituimmista mikrokontrollereista, joita käytetään monenlaisissa tuotteissa. Heillä on myös erinomainen tukipohja monilta mikrokontrollerin kehitysfoorumeilta.

Tämä STMicroelectronicsin mikrokontrolleriperhe perustuu ARM Cortex-M 32-bittiseen suoritinytimeen.

STM32 mikrokontrollerit tarjoavat suuren määrän sarja-ja rinnakkaisviestinnän oheislaitteita, jotka voidaan liittää kaikenlaisiin elektronisiin komponentteihin, kuten antureihin, näyttöihin, kameroihin, moottoreihin jne. Kaikissa STM32-versioissa on sisäinen Flash-muisti ja RAM-muisti.

STM32: n suorituskykyalue on varsin laaja. Joitakin perusmuunnoksia ovat stm32f0 ja STM32F1-alasarjat, jotka alkavat vain 24 MHz: n kellotaajuudella ja ovat saatavilla niinkin harvoissa kuin 16-nastaisissa paketeissa.

toisessa performance Extremessä STM32H7 toimii jopa 400 MHz: n taajuudella, ja se on saatavana jopa 240-nastaisina paketteina.

kehittyneempiä malleja on saatavana Liukulukuyksiköillä (FPU) sovellutuksiin, joilla on vakavia numeerisia käsittelyvaatimuksia. Nämä kehittyneemmät mallit hämärtävät mikrokontrollerin ja mikroprosessorin välistä rajaa.

Stm32l-alasarja on suunniteltu erityisesti pienitehoisille kannettaville sovelluksille, jotka toimivat pienellä akulla.

kehitystyökaluja

kehitystyökaluja tarvitaan koodin kehittämiseen, mikrokontrollerin ohjelmointiin ja koodin testaamiseen / debugointiin. Kehitystyökaluja ovat:

  • Kääntäjä
  • Debugger

  • in-Circuit Serial Programmer (ICSP)
ohjelmointi STM32

ohjelmointi STM32 in-Circuit-Serial-Programmer (ICSP) kautta.

koodinkehitykseen on saatavilla useita ohjelmistokehitystyökaluja STM32-mikrokontrollereissa. Ohjelmistotyökalut ovat saatavilla Integrated Development Environments (IDE) – nimellä, joka yhdistää kaikki tarvittavat työkalut integroituun ympäristöön.

kaksi yleistä kehityspakettia ovat:

  • Keil MDK ARM (uVison5 IDE) – MDK ARM IDE on erittäin vakaa kehitysympäristö, jonka voi ladata ilmaiseksi. Se mahdollistaa koodin kehittämisen 32 KB: n kokoiseen ohjelmaan asti. Isompien ohjelmien kehittämiseen lisensoitu versio on ostettava täältä.
  • CoIDE – vapaa työkaluketju, joka perustuu typistettyyn versioon Eclipse IDE: stä integroituna sekä vapaan GCC-kääntäjän upotettuun ARM-versioon.

STM32-mikrokontrollereiden kanssa on saatavilla myös useita muita Id-laitteita. Tässä artikkelissa keskitytään kuitenkin kehittämään ja vilauttamaan ohjelmaa, jossa käytetään erittäin suosittua Keil MDK ARM uVision5 IDE: tä.

ohjelmistotyökalujen lisäksi tarvitaan Piirisarjaohjelmoija (ICSP) ohjelmoimaan ja testaamaan koodia varsinaisella mikrokontrollerilla. ICSP: n on liityttävä Mikrokontrolleri PC – ohjelmistotyökaluihin USB-portin kautta.

ARM Cortex-M-mikrokontrollerit tukevat kahta ohjelmointiprotokollaa: JTAG (electronics industry association the Joint Test Action Group) ja Serial Wire Debug (SWD).

näitä protokollia tukevia ICSP-ohjelmoijia on useita, MM.:

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

ensimmäisen sovelluksen kehittäminen

on aina helpointa aloittaa helposti saatavilla olevasta peruskoodikehyksestä. Lisää sitten koodi, jota tarvitaan mikrokontrollerin tiettyyn sovellukseen ja malliin.

onneksi STMicroelectronics tarjoaa erittäin hyödyllisen graafisen työkalun nimeltä STM32CubeMx, joka auttaa luomaan perussovellusprojektin mille tahansa haluamallesi STM32-mikrokontrollerille. Sitä voidaan käyttää myös mikrokontrollerin multiplexed-pinnien oheislaitteiden määrittämiseen.

STM32CubeMX-työkalun voi ladata täältä. STM32Cube mukana laaja joukko ajureita kaikentyyppisille oheislaitteille ja tuki valinnaiselle FreeRTOS (ilmainen reaaliaikainen käyttöjärjestelmä) valmiiksi integroitu koodi.

seuraavassa osassa kuvataan yksityiskohtaisesti, miten stm32f030-mikrokontrollerille luodaan yksinkertainen UART-sovellus, joka toistaa mitä tahansa pääteikkunassa kirjoitetaan.

  • Asenna stm32cubemx-ohjelmisto.
  • Suorita sovellus ja valitse uusi projekti. Tämän jälkeen se avaa MCU-valintaikkunan alla esitetyllä tavalla.
  • kaksoisnapsauta valitaksesi käytettävän mikrokontrollerimallin. Tässä tapauksessa käytämme stm32f030k6. Se vie sinut pinout-sivulle valitulle mikrokontrollerille.

kuvakaappaus uuden projektin perustamisesta STM32CubeMX: ssä

STM32F030K6 on ARM Cortex-M0-ydin, jossa on 32KB Flash-muistia ja 4KB RAM-muistia. Esimerkkikoodi mahdollistaa UART: n, joka käyttää pa9-ja PA10-nastoja sarjatiedon vastaanottamiseen ja lähettämiseen alla esitetyllä tavalla vihreillä pinneillä.

kuvakaappaus stm32f030k6: n pinoutista stm32cubemx: ssä

Määritä UART-asetukset kokoonpano-välilehdellä ja valitse UART-asetukset alla esitetyllä tavalla. Käytä NVIC global interrupt-asetusta NVIC-Asetukset-välilehden alla.

kuvakaappaus, josta näkyy, miten UART–asetusten asetukset stm32cubemx

seuraavaksi siirry projektiin – >asetukset, jotta voit lisätä uuden projektin nimen ja valita käytettävän työkaluketjun IDE. Aseta tässä esimerkissä projektin nimeksi ”UARTEcho” ja valitse Keil-MDK5 IDE projektinkehitystä varten.

luo lopuksi projektikoodi napsauttamalla projekti -> Luo koodi.

luo ja vilauttaa koodia

avaa nyt luotu MDK-ARM-projektitiedosto UARTEcho\MDK-ARM\UartEcho.uprojx.

Tämä ohjelma toistaiseksi vain alustaa UART-oheislaitteen ja pysähtyy äärettömään silmukkaan.

on tärkeää huomata, että STM32Cube luo / * USER CODE BEGIN x * / ja / * USER CODE END x * / comment blocks toteuttaa käyttäjäkohtaisen koodin. Käyttäjäkoodi on kirjoitettava näihin kommenttilohkoihin. Aina kun koodi luodaan uudelleen muokatuilla kokoonpanoilla, stmcube-työkalu säilyttää käyttäjäkoodin näissä käyttäjäkommenttilohkoissa.

määrittele seuraavaksi kokonaismuuttuja, joka saa tavun UART: sta pääosassa.C-lähdekooditiedosto:

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

kaiken alustuskoodin jälkeen anna ajurille mahdollisuus vastaanottaa 1 tavu. Seuraava toiminto mahdollistaa rxne keskeytysbitin.

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

nyt lisätään callback-toiminto vastaanottokeskeytyksen käsittelemiseksi ja vastaanotetun tavun lähettämiseksi.

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

lopuksi täytyy kääntää koodi ja väläyttää (ladata) se mikrokontrolleriin.

kun Keil MDK ARM IDE on asennettu, on käytettävissä ajurit ST-LINK V2, J-Link ja Ulink2. St-Link-debuggeri valitaan oletusarvoisesti. Siirry projektit – >Asetukset kohteelle ja valitse Vianetsintä-välilehdeltä käytetty ICSP-ohjelmoija.

väläytä koodia valitsemalla Flash->Download.

HUOM: muista ladata ilmainen PDF-opas 15 askelta uuden elektroniikkalaitteen kehittämiseksi.

Mikrokontrolleri toistaa nyt kaikki UART: n kautta saadut tiedot. Se voidaan liittää tietokoneeseen USB-to-Serial-muuntimen avulla. Tietokoneessa avaa COM-portti terminaalisovelluksella käyttäen 115200-8-N-1-asetuksia. Nyt kaikki, mitä terminaalista lähetetään, kaikuu takaisin mikrokontrollerin kautta.

Keskeytysjärjestelmä

STM32-keskeytysjärjestelmä perustuu ARM Cortex M-ytimen NVIC-perifeeriseen ytimeen. STM32 MCUs tukee useita maskable keskeyttää kanavia lukuun ottamatta 16 keskeytys kanavaa ARM core.

esimerkiksi STM32F0 MCU-sarja tukee 32 maskikelpoista keskeytystä. Tämän MCUs-perheen poikkeus-ja keskeytysvektoritaulukko on esitetty alla olevassa taulukossa.

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 Keskeytykset ja tapahtumat ohjain (EXI)

STM32 MCU: ssa on laajennettu keskeytykset ja tapahtumat ohjain, joka hallinnoi ulkoisia ja sisäisiä asynkronisia tapahtumia/keskeytyksiä ja luo tapahtumapyynnön CPU / Keskeytysohjaimelle ja herätyspyynnön Power Managerille.

jokainen yksi tai useampi EXTI-suora on merkitty yhteen NVIC-keskeytysvektorista.

ulkoisten keskeytysrivien osalta keskeytysrivi on määritettävä ja otettava käyttöön keskeytysrivin muodostamiseksi. Tämä tapahtuu ohjelmoimalla kaksi laukaisurekisteriä halutulla reunatunnistuksella ja ottamalla keskeytyspyyntö käyttöön kirjoittamalla ” 1 ” keskeytysmaskirekisterin vastaavaan bittiin.

ulkoinen keskeytys ja GPIO-kartoitus

jokainen järjestelmässä oleva GPIO voidaan määrittää tuottamaan keskeytys. Mutta jokainen EXI keskeytys linjat on kartoitettu useita GPIO nastat. Esimerkiksi PIO0 kaikissa käytettävissä GPIO portit (A, B, C, jne.) kartoitetaan EXTI0-linjalle. Kaikkien porttien PIO1 kartoitetaan EXTI1-linjalle ja niin edelleen.

osa eksi-suorista on yhdistetty yhdeksi NVIC-vektoriksi. Esimerkiksi EXTI4_15 on yhdistetty yhteen vektoriosoitteeseen, joten kaikille keskeytyksille PIO4: stä PIO15: een on olemassa yksi keskeytysrutiini. Mutta lähde keskeytys voidaan tunnistaa lukemalla keskeytys vireillä Rekisteri.

STM32 MCU: ta käyttävää järjestelmää suunniteltaessa on tärkeää ottaa huomioon keskeyttävien GPIO-pinnien valinta. MCU: ssa voi olla yli 16 GPIO: ta laitteessa, mutta ulkoisia keskeytyslinjoja on vain 16.

esimerkiksi EKSI_0 voidaan kartoittaa joko PA0: ksi tai PB0: ksi, mutta ei molempia. Joten kun valitset pinnejä ulkoisille keskeytyksille, ne on valittava siten, että ne voidaan yksilöllisesti kartoittaa johonkin ulkoisista viivoista.

seuraavassa osassa kuvataan, miten keskeytys määritetään STM32-kuutiolla.

kuvakaappaus keskeytyksen määrittämisestä STM32CubeMX

valitse Määritysvälilehti ja valitse laitteistomoduuli, jolle keskeytys on määritettävä. Moduulin asetusikkuna avautuu.

valitse tämän jälkeen NVIC-Asetukset-välilehti ja ota käyttöön yleinen keskeytys.

moduulin keskeytyksen mahdollistava koodi luodaan stm32f0xx_hal_msp-järjestelmässä.c funktiossa hal_<module>_MSPInit (…).

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

STM32-kuution tuottamalla koodilla on IRQ_Handler-toteutus kaikista keskeytyksistä. Kun keskeytys on käytössä, koodi sisällytetään sovellukseen.

yleensä luotu koodi käsittelee jo IRQ: n ja tyhjentää keskeytyksen aiheuttaneen lipun. Sen jälkeen se kutsuu sovelluksen takaisinsoittoa, joka vastaa tapahtumaa, joka tuotti keskeytyksen moduulille.

STM32 HAL (Hardware Abstraction Layer) toteuttaa jokaisen moduulin tapahtumatyypin takaisinkutsun osana ajuria. Tässä esimerkissä RX Transfer Complete callback tulee kopioida stm32f0xx_hal_uart.C-tiedosto.

ajurin takaisinkutsutoiminnot toteutetaan __heikolla linker-attribuutilla. Käyttäjän on toteutettava kopio tarvittavasta takaisinkutsutoiminnosta poistamalla __heikko attribuutti yhdestä sovellustiedostosta ja kirjoittamalla sitten kyseisen toiminnon edellyttämä erityinen käsittely.

/*** @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.*/}

johtopäätös

Tämä opetusohjelma on johdatus STM32-mikrokontrolleriperheen kanssa toimivan sovelluksen kirjoittamiseen. On olemassa useita muita menetelmiä kirjoittaa hakemuksen, mutta stm32cube keskusteltu on helppo ja intuitiivinen tapa päästä alkuun.

Tämä työkalu yksinkertaistaa mikrokontrollerin oheislaitteiden alustusta. Se parantaa myös koodin ylläpidettävyyttä erityisesti silloin, kun on olemassa laitteistoversioita, jotka vaativat signaalien uudelleenmuokkausta eri pinneille.

toinen stm32cube-työkalun käytön etu on se, että se tuottaa mikrokontrollerille raportin käyttäjän kokoonpanosta. Tässä raportissa se yksityiskohtaisesti kellon puu, pin kartoitus ja laitteisto moduuli kokoonpano, jotka ovat kaikki erittäin hyödyllisiä.

kaikille STM32-muunnelmille on saatavilla myös useita muita koodikirjastoja ja esimerkkiohjelmia. Mukana on myös tuki useille IDE: ille.

Jos projektisi vaatii hienostuneen 32-bittisen mikrokontrollerin, suosittelen lämpimästi STM32-sarjaa. Ne eivät ole vain tehokkaita ja suosittuja, vaan STM32-mikrokontrollerit ovat myös melko edullisia.

Tarvitsetko lisää koulutusta STM32-mikrokontrollereiden ohjelmointiin? Jos näin on, tässä on syvällisempi johdantokurssi, että sinun pitäisi tarkistaa.

tämän artikkelin on kirjoittanut Mohan Kashivasi vithamas Technologiesista. Hän on myös yksi käytettävissä olevista asiantuntijoista, jotka auttavat sinua tuotteesi kanssa Laitteistoakatemiassa.

lopuksi, älä unohda ladata ilmaista PDF-tiedostoasi: Ultimate opas kehittää ja myydä uuden elektronisen laitteiston tuote. Saat myös viikkotiedotteeni, jossa Jaan premium-tason sisältöä, jota ei ole saatavilla blogissani.

muu sisältö, josta voit pitää:

  • Johdatus Stm32cubeidiin STM32-mikrokontrollereille
  • Miten valita Mikrokontrolleri uudelle tuotteellesi
  • käyttäen Arduinoa sulautettuna kehitysalustana
  • Datasheet Review: Entry-Level STM32 Cortex-M0 Microcontroller (Blog + Video)
  • Introduction to the Ultra High-Performance STM32H7 32-bit Microcontroller
4.52votes
Article Rating

Vastaa

Sähköpostiosoitettasi ei julkaista.