ARM:0001 versija B arba STM32

Kažkada gavau Atmelio ARM šroto. O dabar gavau ST produkcijos beveik šroto. Tiksliau pamačiau, kai metė į šiukšlyną “paletėlę”* su STM32 čipais. Dalis čipų nukrito neatgaunamai, o keliasdešimt buvo sugauta ir parkeliavo namo. Tai buvo STM32F103RET6 – 512kB flash ROM, 64kB RAM ir 64 plonos kojos (gana daug kojų palinko gelbėjimo operacijos metu) … LEDų mirkčiojimui pats tas čipukas. 🙂

STM32F103RE
Gryni čipai neveikia, todėl sukurpiau savo PCB. Ji gavosi kraupiai raudona. Dar pakeliui nupirkau kinišką dev boarduką su mažesniu čipuku. Bet PCB iš kinijos atėjo greičiau. Į tą UNIBUS dalį nereikia kreipti dėmesio, čia eksperimentai- ten nebesiekia Eagle free softas ir ta dalis PCB kaip ir nesinaudojasi. Ten “menas” gerberiuose.
Aišku padariau kaip minimum dvi klaidas. Abi gana lengvai pataisomos- užmiršau RESET liniją patempti į pliusą. Ir panašus patempimas reikalingas prie USB jei jį naudoti. Ten reikėtu statyti gal net tranzu valdomą pull-up.

Apie softą kita šneka. Kažkaip seniokiškai piktybiškai nenorėjau jokio IDE. Man užteko tų “user friendly” nesamonių. Tik oldskūlas, tik hardkoras. Žodžiu dabar kompiliuojasi iš to pačio notepado- ir AVR ir STM ir atmelio ARMas. Ir iš ten pat ir programuojasi.

Kad ir ką nešnekėtu vartotojai- nėra labai patogaus softo. Kažkaip eina tendencija, kad jei reikia pamirksėti LEDą, tai reikia į čipuką supusti visa operacinę sistemą ir krūvas pričindalų… Aišku periferiją reikia suprogramuoti ir kuo toliau, ji sudėtingesnė. Bet dėti šimtus eilučių chaotiško kodo? ST išleido gerą įdėją- grafinį periferijos konfiguratorių STM Cube, ten aš jo sugeneruoto kodo nesugebėjau netik suprasti, bet ir sukompiliuoti su gcc. Poto skaičiau nemūsiškus forumus ir atsiliepimai buvo ne kokie… Matyt tokie oldfagai rašė.

Todėl teko pažaisti kokius trys vakarus ir pavyko visdėlto paleisti MCU kojas taip, kad jos duotu kažkokius signalus.
Deja, nepavyko svetimų bibliotekų privesti tiek, kad nerodytu nei vieno warning. Man nepatinka warningai…


gcc version 5.4.1 20160919 (release) [ARM/embedded-5-branch revision 240496] (GNU Tools for ARM Embedded Processors)
Building file: stm32f10x_vector.o
Invoking: MCU C Compiler
arm-none-eabi-gcc -Os -Wall -fno-strict-aliasing -fmessage-length=0 -fno-builtin -mthumb -mcpu=cortex-m3 -MMD -MP -ffunction-sections -fdata-sections -I ../src -I ../src/includes -I ../libSTM32F103 -I ../libSTM32F103/inc -MF objs/stm32f10x_vector.d -MT objs/stm32f10x_vector.d -c ../src/includes/stm32f10x_vector.c -o objs/stm32f10x_vector.o
../src/includes/stm32f10x_vector.c:114:4: warning: taking address of expression of type 'void'
&_estack, // The initial stack pointer
^
Finished building: stm32f10x_vector.o

Building target: blinky_stm32f103.elf
Invoking: MCU Linker
arm-none-eabi-gcc -Wl,--gc-sections,-Map=blinky_stm32f103.map -Os -Wall -fno-strict-aliasing -fmessage-length=0 -fno-builtin -mthumb -mcpu=cortex-m3 -MMD -MP -ffunction-sections -fdata-sections -L ../ -T ../loaders/stm32.ld -I ../src -I ../src/includes -I ../libSTM32F103 -I ../libSTM32F103/inc objs/main.o objs/stm32f10x_it.o objs/stm32f10x_vector.o ../libSTM32F103/Release/libstm32f103.a -oblinky_stm32f103.elf
Finished building target: blinky_stm32f103.elf

Visas source kodas čia, su visom bibliotekom.

*) jei kas nesuprato, “paletelė” tai toks plastikinis laikiklis mikroschemom. Kaip šitas iš to pačio šaltinio:
STM32F205ZGT6
Tik čia daugiau kojų turinti mikroschema STM32F205ZGT6 (1M flash, 132kb RAM ir 144 kojos…) biški per daug.

8 replies on “ARM:0001 versija B arba STM32”

  1. O, welcome į STM klubą 😀

    Jo… su libais ten ne kažkas. Aš stengiuosi net ir STL (Standard Peripherals Library) vengti, kiek įmanoma, iš jo išsikarpyti grynesnį CMSIS kodą ir vietoj visokių ten GPIO_Init eiti tiesiai į CRL/CRH registrus ir kitur. Na, nebent ten kokį CAN ar USB reikia inicializuoti, kur biškį užsipistis, tada tie libai padeda. Bet USB toks vaizdas, darė tik tam, kad padarytų: viskas labai kreivai, nepatogiai ir nerealiai daug softwarės vien paprastam HID užkūrimui. Aparatūrinis USB sluoksnis labai jau menkas.

    Dėl estack warningo tai sakyčiau, kad reikėtų .ld skriptuką persižiūrėt, ar kokios sekcijos nepersidengia. Nes man buvo, kad .bss su steku persidengė pavyzdiniam GCC skripte ir visokia velniava vyko neprognozuojamai.

    OS tai reikia dideliems projektams kokiems nors, kur realus multitaskingas prasideda. O šiaip tai ir hardkoriniu būdu daug padaryt galima, labai faini šitie procesoriukai, ypač kainos atžvilgiu.

  2. O dėl perėjimo į žemesnį lygi ir bibliotekų atsysakymo… pradedu ir pats manyti. Nutariau parašyti kitą programą ir supratau, kad kuo toliau, tuo blogiau. Softo ilgis tik didėja, kad padaryti vieną elementarų veiksmą tenka daryti dvi-trys “standartines bibliotekos” procedūras… Kai tuo tarpu atrodo, kad užteks tik tiesiai įkalti į registrą kaip paprasčiausiam AVRe…

    Kaip daryti šitam čipe: 5 betkokios kojos dirba išvedimo režime, trumpam perprogramuojam į priėmimą, priimam duomenis ir poto vėl išvedimo režimas. Ir taip daug kartų, dažnai ar net pastoviai. Pažiūrėjus ką daro bibliotekos… ten vos ne kiekvieną kartą ciklų skaičiuoja kojas ir po vieną rašo atskirai. O užtektu trijų registrų ir loginių operacijų.

  3. jau beveik metai kaip naudoju stm32f103 board is kinu kaina maza

    STM32

    , plokstes dydis minimalus. resursu per akis. programavimui naudoju ECLIPSE, irankius susiinstaliuoji, naudoju STM32F10x StdPeriph Lib V3.5.0 nes lysti i registrus nera reikalo, resursu uztenka, jei kazko reik nebijau tu registru. tik sunkiau ivaldyti visokiu, PWM, timer, pertraukimujs, daug visokiu nustatymu. led matrix (96×64) pasikuriau, uztenka greiciau. dabar bandysiu inkubatoriui valdyma ant stm32f103 pasidaryti.

  4. Taip, SPL inicializacijos dar sueina vienkartiniams veiksmams, kai viskas užkuriama ir paliekama. O kad ir tokio DHT22 nuskaitymui mainyt kojų režimus tai tikrai neverta tų kelių ciklų su visokiom abstrakcijom sukti. Va tik ta subtilybė, kad vieno GPIO kojų banko inicializacijai yra atskiri registrai pirmoms aštuonioms kojoms ir kitoms aštuonioms. Tai tada arba du veiksmai su dviem registrais režimo keitimui, arba reik pasiplanuot, kad pvz. tos penkios kojos į vieną kurį aštuonetą sutilptų.

    BRR ir BSRR registrai yra gėris kojos loginiam vienetui ar nuliui nustatyt, be to, STM naudojant šiuos registrus operacija laikoma atomine, t.y. vienas procesoriaus ciklas.

    Tam pačiam reikalui galima naudoti ir ODR registrą su maskais, kaip AVR panašiai, bet tada gaunasi trys operacijos: registro nuskaitymo, masko uždėjimo ir įrašymo atgal, tai neverta.

    ADC su registrais gan paprastai susivaldo. USART inicializacijos irgi labai paprastos. DMA gan lengvai irgi, ypač, kai reikia iš naujo panaudot tuos pačius buferius. Taimeriai tai biškį chujovesnis reikalas, ten jau smegenis reikia įtempt. Su USART navarotas, kad USART1 yra ant 72 MHz laikroduko, o 2 ir 3 ant 36 MHz, tai baud rate’ai skirtingom konstantom nusistato.

    Tikiuosi, per daug neprispaminau 😀 Bet čia tik iš meilės šitiems procesoriukams…

  5. Tikrai neprispaminai. Kol kas nėra kuom pasigirti, O pirmas priblūdas jau pastėtas: buvo blogas kondikų nominalas prie kvarco ir reset grandinė kiek kreiva. Ko pasekoje MCU nesugebėdavo teisingai inicializuoti savo laikrodukų jei daromas cold boot. Jei darai reset arba per JTAG paleidi programą viskas veikia gerai. Buvo mįslė, kodėl vienu metu impulsai vieno ilgio, kitu – kito. Dabar įterpiau kelias kodo eilutes ir jei nepavyksta susitvarkyti su laikrodukais, daro reset (per watchdogą) ir iš antro (tikriausiai) karto pasikuria teisingu greičiu.

Leave a Reply

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