Sada prelazimo na konkretne stvari koje se ticu STM32F103 mikrokontrolera.
Svaki MCU ima u sebi razne pod module, to je ceo mali mini-racunar sa procesorom, memorijom, internim data/instruction bus-evima i ostalim perifernim modulima za komunikaciju ka spoljnjem svetu.
Kod STM32F103 ono su interno ovako organizovani:
Ovde sa slike je samo bitno zapaziti ove obelezene detalje jer ce vam trebati kasnije da bi videli koja je periferija na kom bus-u.
STM32F103C8T ima sledece interne module (imena su bitna jer se tako obelezavaju i u programu i u dokumentaciji):
-
ADC1 i
ADC2 - Prvi u drugi 12bit A/D konverter (dva nezavisna konvertera, broj ulaznih kanala je drugo, ima ih vise)
-
CAN - CAN komunikacioni modul
-
CRC - Modul za racunanje CRC-32 checksum-a
-
I2C1 i
I2C2 - Prvi i drugi I2C modul
-
RCC - Ovo je glavni modul za konfiguraciju i distribuciju Clock-a, trebca ce nam cesto
-
RTC - Modul za Real Time Clock, radi nezavisno, opciono sa Vbat
-
SPI1 i
SPI2 - Moduli za SPI komunikaciju
-
TIM1 do
TIM4 - Tajmer moduli sa capture/compare, tu je i PWM
-
USART1 do
USART3 - Asinhroni seriski moduli za komunikaciju (a.k.a. RS-232)
-
GPIOA,
GPIOB i
GPIOC - I/O moduli gde se konfigurise pojedinacna nozica (ulaz, izlaz ili alternativna funkcija)
-
EXTI - Modul za Externe (HW) Interapte
-
AFIO - Modul za konfuguraciju i remapiranje alternativnih funkcija pinova (npr, tu se iskljucuje JTAG da bi oslobodili nozice)
-
DMA1 i
DMA2 - Modul za transfer podataka izmedju memorije i periferija bez zauzeca CPU
- ... ima jos nekih modula
PS: Adrese ovih modula preko kojih im se obracamo su promenljive i zavise od konkretnog modela MCU koji upotrebimo.
Da nebi pamtili adrese, uvedena su imena modula i ta imena su povezana na tacno potrebne adrese preko glavnog include fajla (u nasem slucaju
stm32f10x.h) koji definise bukvalno sve do zadnjeg bita u svakom pojedinacnom registru za izabran MCU.
Takodje, svaki modul posebno ima za sebe svoj set registra i flagova (neki moduli po par stotina razlicitih) gde se podesavaju "fino" svi detalji za funkcionisanje tog modula.
Imena bitova/flagova po modulu su isto definisana i njih koristimo tokom pisanja programa.
Dalje, kompletna ova interna logika se pokrece u "ritmu" osnovnog Clock-a koji je kod STM32 malkice slozeniji (opet nista strasno) i interno je organizovan ovako:
Dakle, 8MHz kristal se pokrece preko HSE (High Speed External Oscilator), zatim se pomocu PLL frekvencija mnozi 9 puta i dize na 72MHz i to je baza za SYSCLK, sa tom brzinom radi CPU jezgro.
Periferni moduli rade sa razlicitim brzinama, neki rade sa istim clock od 72MHz dok neki rade na pola od toga tj 36MHz, uslovljeno nekom internom logikom za sinhronizaciju.
Naravno postoje i druge varijante da se sve ovo konfigurise, posebno ako hocemo da koristimo interni oscilator i izbegnemo kristal ili da postavimo neke nestandardne brzine, tu je i RTC oscilator itd.
Na srecu, sve ovo je vecim delom Keil konfigurisao umesto nas kroz svoj Startup fajl i u trenutku kada smo dosli do pocetka naseg programa u main(), Clock je vec podesen i postavljen na optimalne vrednosti.
Startup je takodje inicializovao tabelu interapta (NVIC table), podesio potrebne parametre za rad sa Flash memorijom i rezervisao deo RAM prostora za radni STACK C/C++ okruzenja.