V této in-hloubkové článku se dozvíte, jak rozvíjet embedded firmware pro STM32 Cortex-M 32-bitové mikrokontroléry s využitím různých vývojových nástrojů.
STM32 series jsou některé z nejpopulárnějších mikrokontrolérů používá v široké škále produktů. Mají také vynikající podpůrnou základnu z několika fór pro vývoj mikrokontrolérů.
tato rodina mikrokontrolérů ze STMicroelectronics je založena na 32bitovém jádru procesoru ARM Cortex-M.mikrokontroléry STM32 nabízejí velké množství sériových a paralelních komunikačních periferií, které lze propojit se všemi druhy elektronických součástek včetně senzorů, displejů, kamer, motorů atd. Všechny varianty STM32 jsou dodávány s interní Flash pamětí a RAM.
rozsah výkonu, který je k dispozici s STM32, je poměrně rozsáhlý. Některé z nejvíce základní varianty patří STM32F0 a STM32F1 sub-series, které začínají s taktovací frekvencí 24 MHz, a jsou k dispozici v balení s pouhými 16 kolíky.
další extrémní výkon, STM32H7 pracuje na 400 MHz, a je k dispozici v balení s až 240 piny.
pokročilejší modely jsou k dispozici s jednotkami s pohyblivou řádovou čárkou (FPU) pro aplikace s vážnými požadavky na numerické zpracování. Tyto pokročilejší modely rozmazávají hranici mezi mikrokontrolérem a mikroprocesorem.
nakonec je dílčí řada STM32L navržena speciálně pro přenosné aplikace s nízkým výkonem běžící z malé baterie.
Vývojové nástroje
Vývojové nástroje jsou potřebné pro vývoj kódu, programování mikrokontroléru a testování / ladění kódu. Vývojové nástroje patří:
- Kompilátor
- Debugger
- V-Obvod Sériový Programátor (ICSP)
Programování STM32 prostřednictvím In-Circuit-Sériová-Programátor (ICSP).
pro vývoj kódu na mikrokontrolérech STM32 je k dispozici několik nástrojů pro vývoj softwaru. Softwarové nástroje jsou k dispozici jako integrovaná vývojová prostředí (IDE), která kombinuje všechny potřebné nástroje do integrovaného prostředí.
Dva společný rozvoj balíčky zahrnují:
- Keil MDK ARM (uVison5 IDE) – MDK ARM IDE je velmi stabilní vývojové prostředí, které lze stáhnout zdarma. Umožňuje vývoj kódu až do velikosti programu 32 KB. Pro vývoj větších programů je třeba zakoupit licencovanou verzi zde.
- CoIDE – bezplatný nástroj řetěz, který je založen na zdobené dolů verzi Eclipse IDE integrované spolu s embedded ARM verze zdarma GCC kompilátor.
existuje také několik dalších IDE, které jsou k dispozici pro použití s mikrokontroléry STM32. Tento článek se však zaměřuje na vývoj a blikání programu pomocí velmi populárního Keil MDK ARM uVision5 IDE.
kromě softwarových nástrojů je vyžadován sériový programátor v obvodu (ICSP) pro programování a testování kódu na skutečném mikrokontroléru. ICSP je povinen propojit mikrokontrolér se softwarovými nástroji PC přes port USB.
mikrokontroléry ARM Cortex-M podporují dva programovací protokoly: JTAG (pojmenovaný asociací elektronického průmyslu Joint Test Action Group) a Serial Wire Debug (SWD).
Existuje několik ICSP programátoři k dispozici, které podporují tyto protokoly, včetně:
- Keil U-Link 2
- Segger J-Link
- ST-Link
Rozvojových první aplikace
je To vždy nejjednodušší začít s, které jsou snadno dostupné základní rámec kódu. Poté přidejte kód, který je vyžadován pro konkrétní aplikaci a model mikrokontroléru.
Naštěstí, STMicroelectronics nabízí velmi užitečný grafický nástroj, zvaný STM32CubeMx, který pomáhá při vytvoření základní aplikace projektu pro jakýkoliv mikrokontrolér STM32 vašeho výběru. Může být také použit pro konfiguraci periferií na multiplexovaných pinech mikrokontroléru.
nástroj STM32CubeMX si můžete stáhnout zde. Na STM32Cube dodáván s rozsáhlou sadou ovladačů pro všechny typy periferií a podporu pro volitelnou FreeRTOS (volný Real-Time Operační Systém) pre-integrován s kódem.
následující kapitola podrobně popisuje, jak vytvořit jednoduchý UART aplikace pro STM32F030 mikrokontroléru, který odráží, co je napsaný na okně terminálu.
- nainstalujte software STM32CubeMX.
- Spusťte aplikaci a vyberte nový projekt. Poté otevře okno výběru MCU, jak je znázorněno níže.
- dvojitým kliknutím vyberte použitý model mikrokontroléru. V tomto případě používáme STM32F030K6. Poté se dostanete na stránku pinout pro vybraný mikrokontrolér.
STM32F030K6 je jádrem ARM Cortex-M0 s 32KB Flash paměti a 4KB paměti RAM. Příklad kód umožňuje UART, který používá pa9 a PA10 kolíky pro příjem a přenos sériových dat, jak je uvedeno níže se zelenými kolíky.
Konfigurace UART nastavení v Kartě Konfigurace vyberte UART nastavení, jak je uvedeno níže. Povolte možnost globálního přerušení nvic na kartě Nastavení NVIC.
Next, přejděte na Projektu–>Nastavení chcete-li přidat nový název projektu a vyberte nástroj řetězce IDE mají být použity. V tomto příkladu Nastavte název projektu na „UARTEcho“ a vyberte IDE Keil-MDK5 pro vývoj projektu.
nakonec vygenerujte kód projektu kliknutím Project – > vygenerujte kód.
vytváření a blikání kódu
nyní otevřete vygenerovaný Projektový soubor MDK-ARM UARTEcho \ MDK-ARM \ UartEcho.uprojx.
tento program zatím pouze inicializuje periferii UART a zastaví se v nekonečné smyčce.
je důležité si uvědomit, že STM32Cube generuje / * USER CODE BEGIN x * / a / * USER CODE END x * / comment bloky implementovat specifický kód uživatele. Uživatelský kód musí být zapsán do těchto bloků komentářů. Kdykoli je kód znovu generován s upravenými konfiguracemi, nástroj STMCube uchová uživatelský kód v těchto blocích komentářů uživatele.
dále definujte globální proměnnou pro příjem bajtu z UART v hlavní.c zdrojový soubor:
/* USER CODE BEGIN PV *//* Private variables ———————————————————*/static uint8_t recv_data;/* USER CODE END PV */
po veškerém inicializačním kódu povolte ovladači přijímat 1 bajt. Následující funkce umožňuje přerušovací bit RXNE.
/* USER CODE BEGIN 2 */HAL_UART_Receive_IT(&huart1, &recv_data, 1);/* USER CODE END 2 */
nyní Přidejte funkci zpětného volání pro zpracování přijímaného přerušení a přenos přijatého bajtu.
/* USER CODE BEGIN 0 */void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart){HAL_UART_Transmit(huart, huart->pRxBuffPtr, 1, 1000);}/* USER CODE END 0 */
nakonec musíme kód zkompilovat a blikat (stáhnout) do mikrokontroléru.
Když je nainstalován Keil MDK ARM IDE, ovladače pro ST-LINK V2, J-Link a Ulink2 jsou k dispozici. Ve výchozím nastavení bude vybrán debugger ST-Link. Přejděte na projekty – >možnosti pro cíl a na kartě ladění vyberte použitý programátor ICSP.
Flash kód výběrem Flash – > stáhnout.
mikrokontrolér nyní ozve všechna data přijatá přes UART. Lze jej připojit k počítači pomocí převodníku USB-to-Serial. V počítači otevřete port COM pomocí terminálové aplikace pomocí nastavení 115200-8-N-1. Nyní se vše, co je odesláno z terminálu, ozve zpět přes mikrokontrolér.
přerušovací systém
přerušovací systém STM32 je založen na periferii NVIC jádra ARM Cortex M. STM32 MCU podporují více maskovatelných přerušovacích kanálů kromě 16 přerušovacích kanálů jádra ARM.
například řada STM32F0 MCU podporuje 32 maskovatelných přerušení. Výjimka a tabulka vektorů přerušení pro tuto rodinu MCU jsou uvedeny v následující tabulce.
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 Přerušení a Události Regulátor (EXTI)
STM32 MCUs mají Prodlouženou přerušení a Události regulátor, který řídí externí a interní asynchronní události/přerušení a generuje události požadavek na PROCESOR/Řadič Přerušení a probuzení požadavek Správce Napájení.
každý z jednoho nebo více řádků EXTI je mapován na jeden z vektorů přerušení nvic.
pro externí přerušovací linky by měla být linka přerušení nakonfigurována a povolena. To se provádí naprogramováním dvou spouštěcích registrů s požadovanou detekcí hran a povolením požadavku na přerušení zapsáním ‚1‘ na odpovídající bit v registru masky přerušení.
externí přerušení a mapování GPIO
každý z GPIO dostupných v systému lze nakonfigurovat tak, aby generoval přerušení. Ale každý z přerušovacích řádků EXTI je mapován na více pinů GPIO. Například PIO0 na všech dostupných portech GPIO (A ,B, C atd.) budou mapovány na linku EXTI0. PIO1 pro všechny porty budou mapovány na linku EXTI1 a tak dále.
některé řádky EXTI jsou sloučeny do jednoho vektoru NVIC. Například EXTI4_15 je mapován na jednu vektorovou adresu, takže bude existovat jediná rutina přerušení pro všechna přerušení od PIO4 do PIO15. Zdroj přerušení však lze identifikovat přečtením registru čekajícího na přerušení.
jedna důležitá věc, kterou je třeba zvážit při navrhování systému pomocí MCU STM32, je výběr GPIO pinů pro přerušení. MCU může mít v zařízení k dispozici více než 16 GPIO, ale k dispozici je pouze 16 externích přerušovacích linek.
například EXTI_0 lze mapovat buď na PA0 nebo PB0, ale ne na obojí. Takže při výběru pinů pro externí přerušení by měly být vybrány tak, aby mohly být jedinečně mapovány na jednu z linek EXTI.
následující část popisuje, jak nakonfigurovat přerušení pomocí krychle STM32.
Vyberte Kartu Konfigurace a zvolte hardwarový modul pro které přerušení musí být nakonfigurován. Otevře se okno konfigurace modulu.
poté vyberte kartu Nastavení NVIC a povolte globální přerušení.
kód pro povolení přerušení modulu bude vygenerován v stm32f0xx_hal_msp.c v HAL_<modul>_MSPInit(…) funkce.
/* USART1 interrupt Init */HAL_NVIC_SetPriority(USART1_IRQn, 0, 0);HAL_NVIC_EnableIRQ(USART1_IRQn);
kód generovaný STM32 Cube bude mít irq_handler implementaci všech přerušení. Pokud je přerušení povoleno, kód bude zahrnut do aplikace.
obvykle vygenerovaný kód již zpracovává IRQ a vymaže příznak, který generoval přerušení. Poté zavolá zpětné volání aplikace, které odpovídá události, která vygenerovala přerušení modulu.
STM32 Hal (hardwarová abstrakční vrstva) implementuje zpětné volání pro každý z typů událostí v každém modulu jako součást ovladače. V tomto příkladu by mělo být úplné zpětné volání RX transferu zkopírováno ze stm32f0xx_hal_UART.soubor c.
funkce zpětného volání v ovladači budou implementovány s atributem _ _ weak linker. Uživatel potřebuje k provedení kopie potřebné funkce zpětného volání tím, že odstraní __slabý atributu v jedné aplikaci soubory a pak psaní specifické zacházení požadované v této funkci.
/*** @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.*/}
Závěr
Tento kurz je úvodem do psaní aplikace, která pracuje s STM32 rodina mikrokontrolérů. Existuje několik dalších metod pro psaní aplikace, ale STM32Cube diskutované je snadná a intuitivní metoda, jak začít.
tento nástroj zjednodušuje inicializaci periferií mikrokontroléru. Zlepšuje také udržovatelnost kódu, zejména pokud existují hardwarové revize, které vyžadují přemapování signálů na různé piny.
Další výhodou použití nástroje STM32Cube je, že generuje zprávu o uživatelské konfiguraci mikrokontroléru. V této zprávě podrobně popisuje strom hodin, mapování pinů a konfiguraci hardwarového modulu, které jsou velmi užitečné.
existuje také několik dalších knihoven kódu a ukázkových programů dostupných pro všechny varianty STM32. Podpora pro několik IDE je také v ceně.
Pokud váš projekt vyžaduje sofistikovaný 32bitový mikrokontrolér, vřele doporučuji řadu STM32. Nejen, že jsou výkonné a populární, ale mikrokontroléry STM32 jsou také docela cenově dostupné.
potřebujete více školení o programování mikrokontrolérů STM32? Pokud ano, zde je podrobnější úvodní kurz, který byste měli vyzkoušet.
tento článek napsal Mohan Kashivasi z Vithamas Technologies. Je také jedním z dostupných odborníků, kteří vám pomohou s vaším produktem uvnitř hardwarové Akademie.
nakonec si nezapomeňte stáhnout PDF zdarma: Ultimate Guide pro vývoj a prodej nového elektronického hardwarového produktu. Obdržíte také můj týdenní zpravodaj, kde sdílím prémiový obsah, který není k dispozici na mém blogu.
Další obsah, můžete chtít:
- Úvod do STM32CubeIDE pro Mikrokontroléry STM32
- Jak Vybrat Mikrokontrolér pro Svůj Nový Produkt
- Pomocí Arduino jako Embedded Platformu pro Vývoj
- Datasheet Recenzi: Entry-Level STM32 Cortex-M0 Microcontroller (Blog + Video)
- Introduction to the Ultra High-Performance STM32H7 32-bit Microcontroller