tässä perusteellisessa artikkelissa opit kehittämään sulautettuja firmwareja STM32 Cortex-M 32-bittisille mikrokontrollereille käyttäen erilaisia kehitystyökaluja.
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ä
- in-Circuit Serial Programmer (ICSP)
Debugger
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.
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ä.
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.
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.
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.
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