220 likes | 502 Views
32-bitni mikrokontroleri i primena - MS1BMP 4 . deo. 2013 Nenad Jovičić. Razvojni sistem STM32VLDISCOVERY. Programiranje i debagovanje. Kratkosponicima na konektoru CN3 se određuje da li je ST-link povezan na ovu pločicu ili neki posljašnji mikrokontroler.
E N D
32-bitni mikrokontroleri i primena - MS1BMP4. deo 2013 Nenad Jovičić
Programiranje i debagovanje • Kratkosponicima na konektoru CN3 se određuje da li je ST-link povezan na ovu pločicu ili neki posljašnji mikrokontroler. • Više podataka o razvojnom sistemu se može naći u dokumentu UM0919.
Memorijaibutovanjeprograma • Neposredno pre reseta na osnovu stanja na pinovima BOOT1 i BOOT2 određuje se zona iz koje se startuje izvršavanje programa.
CMSIS - Cortex Microcontroller Software Interface Standard • Razvijen u težnji da se standardizuje pristup hervderskim resursima Cortex mikrokontrolera i obezbedi portabilnost softvera među različitim proizvođačima. • CMSIS omogućava razvoj ponovo iskoristljivih (reusable) komponenti softvera za sisteme bazirane na ARM Cortex-M. • Sistemi bazirani na ARM Cortex-M tehnologiji imaju veliki broj zajedničkih komponenti hardvera pa i HardwareAbstractionLayer (HAL) može biti veoma sličan.
CMSIS - komponente • CorePeripheral Access Layer • Ova CMSIS komponenta definiše adrese i metode pristupa zajedničkim komponentama i funkcionalnostima (osnovni registri, NVIC, debug podsistem, posebnim registrima) koje se nalaze na svakom Cortex-M sistemu. Ovu komponentu obezbeđuje ARM. • Middleware Access Layer • Ova komponenta definiše set zajedničkih API funkcija za pristup periferijama. Ovaj sloj je definisan od strane ARM i prilagođen od strane proizvođača prema specifičnostima. • Device Peripheral Access Layer • Ovaj sloj definiše adrese registara kao i specifične pristupne funkcije. • CMSIS podržavaju C-kompajleri: • ARM RealView (armcc) • IAR EWARM (iccarm) • GNU CopmilerCollection (gcc) • U novije vreme deo CMSIS-a je postao i DSP middleware
Prvi projekat • U okviru workspace-a MS1BMP2013.eww nalazi se projekat GPIO.pew. • U glavnom programu se u beskonačnoj petlji neizmenično uključuju i isključuju diode LED3 i LED4 sa čekanjem implementiranim korišćenjem dummy petlje. void Delay(__IO uint32_t nCount) { for(; nCount != 0; nCount--); } while (1) { /* Turn on LD3 and LD4 */ STM32vldiscovery_LEDOn(LED3); STM32vldiscovery_LEDOn(LED4); /* Insert delay */ Delay(0xAFFFF); /* Turn off LD3 and LD4 */ STM32vldiscovery_LEDOff(LED3); STM32vldiscovery_LEDOff(LED4); /* Insert delay */ Delay(0xAFFFF); }
CMSIS Struktura projekta Osnovni konfiguracioni heder fajl za odabranu familiju mikrokontrolera Cortex-M3 prekidi i izuzetci Peripheral header file Ovaj fajl prilagodjava korisnik NVIC i SysTick drivers • Low-level & API funkcije koje čine biblioteku periferijskih drajvera.
CMSIS - fajlovi • Fajlovi koje definiše isključivo ARM: • core_cm3.c - Core Peripheral Access Layer Source File • Ovajfajlsadžiimplementaciju CMSIS intrinsic funkcijakojesuzarazlikuodintrinsicfunkcija u oviru C kompajleranezavisneodvrstekompajlera • core_cm3.h - Core Peripheral Access Layer Header File • Ovajfajlsadržidefinicijeregistaraperiferijajezgraifunkcijezapristuptimregistrima, kaoideklaracijuintrinsic funkcija • CMSISlayer Device Peripheral Access Layer činesledećifajlovi: • system_stm32f10x.c - Device Peripheral Access Layer Source File • OvajfajlsadžidefinicijufunkcijeSystemInitkojavršiinicijalizacijudelamikrokontrolerazaduženogzagenerisanjekloksignalaikoja se poziva u okvirustartup koda • system_stm32f10x.h - Device Peripheral Access Layer Header File • OvajfajlsadžideklaracijufunkcijeSystemInit • stm32f10x.h - Device Peripheral Access Layer Header File • Ovajfajlsadržidefinicijuregistaraperiferijamikrokontrolerakaoidefinicijubitova u okvirusvakogdefinisanogregistra, bazneadreseregistarainumeracijuvektoraprekida
CMSIS - fajlovi • stm32f10x_conf.h - Device Peripheral Access Layer Configuration Header File • Ovajfajlsadržikontroliše korišćenje periferijskih biblioteka koje definiše isključivo proizvođač mikrokontrolera. • misc.h , misc.c • Ovifajlovidefinišu specifičnosti kontrole prekida, sistemskog takta i reset-a. Formu propisuje ARM, ali ga neznatno redefiniše svaki proizvođač. • stm32f10x_PPP.x • Ovifajlovipšredstavljaju drajvere za odgovarajuće periferije i razlikuju se od proizvođača do proizvođača. • Specifičnosti različitih razvojnih okruženja se definišu sledećim fajlom: • startup_stm32f10x_md_vl.s - STM32F10x Medium Density Value Line Devices vector table • OvajfajlsadrživektortabeluiReset_HandlerISRu kojoj se vršisetovanje SP, inicijalizacijadelamikrokontrolerazaduženogzagenerisanjekloksignalaipozicioniranje PC nalabelu __iar_program_startgde se nalazikodzainicijalizacijupromenljivih, nakončega se pozivamain funkcija • Napomena: Ovajfajl se po pravilurazlikuje od okruženja do okruženja!
Fajlovikojemenjakorisnik • stm32f10x_conf.h /* Includes ------------------------------------------------------------------*/ /* Uncomment the line below to enable peripheral header file inclusion */ /* #include "stm32f10x_adc.h" */ /* #include "stm32f10x_bkp.h" */ #include "stm32f10x_gpio.h" … … • main_X.c #include "stm32f10x.h“ int main(void) { ... GPIO_WriteBit(GPIOD, GPIO_Pin_1, Bit_SET); … } • stm32f10x_It.c #include "stm32f10x_it.h" … void EXTI1_IRQHandler(void) { GPIO_WriteBit(GPIOD, GPIO_Pin_1, Bit_SET); } • stm32f10x_It.h /* Exported functions ----------------------------------------------- */ void NMI_Handler(void); void HardFault_Handler(void); …
Korišćenje CMSIS-a • Počev od verzije IAR 6.20 CMSIS Core je sastavni deo kompjalera i uključuje se kroz opcije projekta. • Iz tog razloga unutar projektnog direktnorijuma nema fajlova core_3m.c i core_3m.h. • Na sličan način vrši se i kontrola korišćenja DSP biblioteka.
Opcije projekta Konretanmikrokontroler se definiše preko globalnog simbola što utiče na deklaracije u glavnom hederfajlu
Opcije projekta Korišćenje periferijskih biblioteka se kontroliše globalnim simbolom koji povezuje konfiguracione heder fajl.
Periferijske biblioteke U konfiguracionom fajlu se uključuju biblioteke vendor-specific periferija koje obezbeđuje proizvođač mikrokontrolera. U tim hederima se nalaze deklaracije registara, ali i prototipovi specifičnih funkcija za pristup toj periferiji. Korišćenje funkcija zahteva uključivanje i odgovarajućih source fajlova u projekat!
Provera parametara inicijalizacije Poželjno je obezbediti kontrolu inicijalizacije periferija i proizvođači to čine preko funkcija za proveru parametara assert_param() Parametri funkcije su logički izrazi definisani obično u heder fajlovima odgovarajuće periferijske biblioteke
Kontrola provere parametara Funkcije i logički uslovi za proveru parametara su deo proizvođačkih biblioteka i kao takvi se ne menjaju, a globalna kontrola provere se vrši definisanjem globalnog simbola USE_FULL_ASSERT Na kraju korisnik ima mogućnost da u definiše sopstvenu funkciju koja se poziva u slučaju da neki parametar nije prošao runtime proveru.
Generisanjetakta • Sistemskitakt: • Klok HSI oscillatora • Klok HSE oscillatora • Klok PLL - a • Dodatnitaktovi: • 40kHz low speedinterni RC oscilatorkoji se možekoristitiza WDT ili RTC • 32.768Khz low speed eksternikristalkoji se možekoristitiiza RTC
SystemInit() funkcija Kroz SystemInit() funkciju proizvođač obezbeđuje jednostavnu konfiguraciju takta.
Inicijalizacija periferija 1)Pre konfigurisanja bilo koje periferije potrebno je dovesti joj takt korišćenjem odgovarajuće funkcije iz CMSIS biblioteke: • RCC_AHBPeriphClockCmd(RCC_AHBPeriph_PPPx , ENABLE); • RCC_APB2PeriphClockCmd(RCC_APB2Periph_PPPx , ENABLE); • RCC_APB1PeriphClockCmd(RCC_APB1Periph_PPPx , ENABLE); 2) PPP_DeInit(..)Funkcije se mogu koristiti da se resursi bilo koje periferije postave u inicijalna stanja: • PPP_DeInit(PPPx); 3) Inicijalizacija periferija se uvek izvodi korišćenjem struktura karakterističnih za te periferije: • PPP_InitStucture.memberX = valX; • PPP_InitStructure.memberY = valY; • PPP_Init(PPPx, &PPP_InitStructure); 4) Nakon osnovne inicijalizacije neke periferije se dalje konfigurišu zadavajući odgovarajuće komande kroz funkcije koje su u sledećem formatu:PPP_Cmd(..) function: PPP_Cmd(PPPx, ENABLE); Ovo se na primer koristi za komunikacione periferije kao što su UART, SPI, I2C ...
Magistrale • Poznavanje rasporeda periferija po magistralama je bitno zbog njihove konfiguracije.
Pirmer Inicijalizacije Primer konfiguracije UART1-a: /* Enable USART1 Clock */ RCC_APB2PeriphClockCmd( USART1, ENABLE ); /* set all UART1’s peripheral registers to their reset values */ USART_DeInit( USART1 ) ; /* USART1 configuration ------------------------------------------------------*/ /* USART1 configured as follow: - BaudRate = 19200 baud - Word Length = 8 Bits - One Stop Bit - Even parity - Hardware flow control disabled (RTS and CTS signals) - Receive and transmit enabled */ USART_InitStructure.USART_BaudRate = 9600; USART_InitStructure.USART_WordLength = USART_WordLength_8b; USART_InitStructure.USART_StopBits = USART_StopBits_1; USART_InitStructure.USART_Parity = USART_Parity_Even; USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; /* Configure USART1 */ USART_Init( USART1, &USART_InitStructure); /* Enable USART1 */ USART_Cmd( USART1, ENABLE );