ARM:0009 STM32CubeMX ir kaip jis valgosi

Yra tokia kiniška plokštelė Bluepill, su STM32F103C8 procesoriuku. Ji kogero pigiausia iš visų. Procesorius ten gana galingas ir šiuolaikinis, todėl kad pamirksėti LEDu, tenka pripumpuoti kalną softo. Mikroschemos gamintojas pats irgi suprato, kad su mikroschemos (ir kitų serijų taip pat) konfiguravimu galima susipainioti galutinai. Todėl sukūrė savo “duino”- STM32CubeMX. Pirmosios programos versijos buvo bugavotos ir labai žalios. Bet laikas bėga ir programa jau daug maž veikianti ir suprantama paprastam vartotojui. Netgi man. Kad veiktu pilnai, mums reikia, kad kompiuteryje veiktu gcc skirtas arm procesoriams. Tai irgi žiaura bėda. Mano didžiajam kompiuteryje (stacionariam) tų gcc gyvas velnias ir vieną dieną jie taip susipainiojo, kad kažkodėl ARM gcc nebeveikia. Gerai, kad yra atsarginis kompiuteris ir ten viskas veikia.

Kaip sakoma, geriau vieną kartą pamatyti, todėl žiūrom:
SM32CubeMX blue pill stm32f103c8
Pasileidžiam programą ir pasirenkam procesoriuką (STM32F103C8). Du kartus baGstelim ant dešinėje esančio procesoriaus kodo. Galima netgi pasirinkti pagal turimą devboardą, bet man atrodo, kad bluepill ten nėra.

Dabar kairėje pasirenkam reikalingas periferijas ir sisteminius dalykėlius:
SM32CubeMX blue pill stm32f103c8
GPIO (general purpose input output) pinas. Kažkur gi priklijuotas LEDas. Pas šią plokštę, LED kabo ant PC13 kojos. Todėl ant mikroschemos paveikslėlio susirandam tą PC13 koją ir pasirenkam, kad ji bus “išėjimas” push-pull. Kiti parametrai- kokia būklė inicializavimo metu ir kokiu greičiu dirbs tas IO blokas. Kuo mažesnis greitis, tuo mažiau ėda elektros. Todėl jei vos vos ten mirksės, galima mažinti ir čia greitį ir net mažinti CLK.

Visi CLK prasideda kažkur viduje, jei tai vidinis RC arba išorėje:
SM32CubeMX blue pill stm32f103c8
Mūsų PCB turi keraminį rezonatorių, 8MHz, todėl ir pasirenkam tokį. RCC dalyje aprašomi mikroschemos CLK šaltiniai. Mikroschema turi kelis šaltinius- išorinius greitą (procesoriui), lėtą (RTC arba kam nors dar). Pasirinkus “kvarciuką” mums atimamos dvi kojos iš “D” serijos.

Toliau reikia sukonfiguruoti kaip tie CLK veiks ir kaip juos pakeisti. Tam reikalui spaudžiam “Clock configuration”:
SM32CubeMX blue pill stm32f103c8
Raudonos rodyklės rodo, kai CLK iš “kvarciuko” per visas žarnikes keliauja iki periferijos. Čia galima visaip paeksperimentuoti ir pažaisti. Galima procesoriuką sulėtinti iki sraigės ar užturbinti iki rodos 72MHz vidinio dažnio (nu jei reikia stipriai kažką skaičiuoti).
Męs nenaudojam jokių imantrybių, todėl mano procesorius dirba “lėtokai” – 16MHz SYSCLK. Va, jei reikėtu kokio USB įrenginio, tai tikrai didesni skaičiai stovėtu. Taip pat reikia pagalvoti apie CLK, jei naudosim kokius standartizuotus dažnius ar greičius periferijai.

Mums nereikia jokios “midleware” anei USB, todėl daugiau nieko nereikia.

Dabar kiek pakeičiam šią konfiguraciją:
SM32CubeMX blue pill stm32f103c8
Aš gi naudoju gryna gcc, todėl naudoju tik “makefile”. Čia jau atsiranda vis daugiau visokių “tulčainų”, todė “kubikas” darosi universalesnis.

Poto spaudžiam “generate code” ir mums sukuriams “skeletas” kuriam yra visko ir žymiai per daug. Dar viena bėda- net jei ir korektiškai rašom savo kodą, “kubikas” dažnai pergeneruodamas kodą sunaikina jūsų triūsą. Todėl reikia gana stipriai planuoti į priekį ir reikiamas periferijas sukonfiguruoti iš karto. Oj kaip aš siutau, kai dariau vieną USB įrenginį- skubiai ir pigiai. Sukonfiguravau visus USB aprašus rankutėmis ir rodos ne tą GPIO pasirinkau. Pakeitus konfiguraciją, sugeneruotas kodas ištrynė visą mano USB rašliavą. Todėl darykit rezervines kopijas.

SM32CubeMX blue pill stm32f103c8
Spaudžiam “open folder” ir pradedam hardcorinį programavimą.

Mane domina tik “main.c”:

int a=0;

ir

a++;
if(a<2000)
{HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, GPIO_PIN_RESET);}
else
{HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, GPIO_PIN_SET);}

if(a>4000) a=0;

SM32CubeMX blue pill stm32f103c8
( tik vėliau pastebėjau, kad ” /* USER CODE END WHILE */” reikia perkelti, kad kubikas netrintu mano eilučių)

Dabar nešnekam apie šios programos efektyvumą ar “kad taip niekas nedaro”. Mums reikia paprasto ir veikiančio daiGto. Jokie taimeriai čia nenaudojami, grynai tūpas procesoriaus išnaudojams uždelsimui.

HALo komandos tikriausiai aprašytos kokioje dokumentacijoje. HAL_GPIO_WritePin(???) tai konstruktas kuris nėra nei efektyvus, nei greitas. Tačiau jis veikia ir gal net “rekomenduotinas gamintojo”. Nors realiai tai ko gero viena asemblerio eilutė darytu tą patį. Jei reikėtu daryti megahercinius signalus, gal ir reikėtu pasinagrinėti žemesnio lygio programavimą apeinant tą “user friendly” HALą. Tačiau programuojant kokį USB tai labai patogu. Ypač, kai turi tik vieną vakarą projektui atlikti.

Aš dar pridedu kelias eilute į “makefile”, kad galėčiau programuoti mikroschemą tiesiai iš teksto redaktoriaus:
SM32CubeMX blue pill stm32f103c8

Rezultate LED mirksi isteriškai.

6 replies on “ARM:0009 STM32CubeMX ir kaip jis valgosi”

  1. Jau yra ir black pill du variantai su gerokai galingesniais ST procais (kaina irgi didesnė), bet kažkaip visiems projektams vis dar užtenka senos F103 serijos galimybių 🙂

  2. Kol dirbau su Atmel AVR ir aš naudojau “pliką” gcc. Kai migravau į STM32, “pliko” gcc naudojimas tapo tikru “galvos skausmu”. Įsidiegiau System Workbench for STM32 ir, kiek pasikeiksnojęs, dabar dirbtu tik su juo.
    Dar pabandžiau Atollic TrueStudio (kol dar nebuvo “not recommended for new design”) ir Cube IDE. Pastarasis patiko labiausiai, bet tuomet dar buvo labai “žalias”, tai teko atsisakyti. Gal po poros metų vėl reikės pasibandyti, kai didžiąją dalį klaidų ištaisys.
    Prie HAL irgi pripratau, bet GPIO valdymui naudoju LL. Lyginant su HAL ir kodas trumpesnis, ir greitaeigiškumas didesnis.

  3. Dar verta paminėti, kad visi BluePill naudoja suklastotą SMT32F103C8. Taigi, klastotė turi 128kB vietoj 64kB ir naudojant ST-Link programatorių reikia kažkokiam konfigūraciniame faile (seniai dariau, nebeatsimenu) pakeisti MCU identifikatorių, nes randa, kad klastotė. Tame faile tiesiog ID eilutėje vietoj 1 reikia prašyt 2.

  4. “ir suprantama paprastam vartotojui. Netgi man. ” – prajuokino :). Kiek LT elektronikų su fetišu arkliams, vien tai negali būti paprasta 🙂

  5. Justui. Nepastebėjau nieko su klastote. Bent jau STLink nieko nesiskundė. Gal todėl kad pats programeris irgi klastotė? 🙂

    Face vs original STM32F chip

    Neturiu nei vieno 103 kur tikrai žinočiau jo originalumą. Tačiau 102 manau originalus.

  6. Gal ne visi tie bluepill pasitaiko suklastoti, bet mano tai neorginalus tikrai 😀

Leave a Reply

Your email address will not be published. Required fields are marked *