Úvod do Programování STM32 ARM Cortex-M 32-bit Mikrořadičů

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 Mikroregulátorové

77 Akcie

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

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.

screenshot na nastavení nového projektu v STM32CubeMX

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.

screenshot ukazuje pinout pro STM32F030K6 v STM32CubeMX

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.

screenshot ukazuje, jak nakonfigurovat UART nastavení STM32CubeMX

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.

Poznámka: Nezapomeňte si stáhnout bezplatný průvodce PDF 15 kroků k vývoji nového elektronického hardwarového produktu.

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.

screenshot konfigurace přerušení STM32CubeMX

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
4.52votes
Article Rating

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna.