STM32F103RCT6 fejlesztői lap - a következő fokozat

Ahogy azt már korábban hangoztattam, a Maple Mini egy ígéretes kis lapka, de szűkös 128kB tárterületével nem vagyok teljesen kibékülve... lássuk hát az STM32 F103 családjának következő tagját: a hangzatos nevű STM32F103RCT6-ot, ami már 256kB tárterülettel bír. (az adatlapja szerint, a valóságban egyébként - feltehetőleg gyártástechnológiai okokból - 512kB-al szállítják, mint nagyobb testvérét a RET6-ot - erről a lentebb írt stm32flash alkalmazás segítségével győződhetünk meg biztosan)

rct_0.jpg

Az Aliexpressen 6,7 dollár körüli áron lehet megvásárolni STM32F103RCT6 Development Board néven.
A közösség "Generic Board" néven, néha "Blue Button" művésznéven hivatkozik a lapkára, mely egy 72Mhz-es, 48kB memóriával és 256kB tárhellyel bíró erőművet rejt, 51 GPIO tűvel.

A nagydarab sárga csatlakozó azok számára lehet érdekes, akik rendelkeznek JTAG programozóval, de akinek nincs (ahogy nekem sincs) azok is könnyen tölthetik fel programjukat a rövidebb (a kék gomb mellett levő) sárga tűsoron keresztül egy egyszerű CP2102 UART-USB illesztő segítségével. A miniUSB csatlakozó is használható lenne, de a korábbi MapleMini-től eltérően ezt a modellt "üresen" szállítják, vagyis bootloader sincs rajta, azt saját magunknak kell feltennünk előbb soros programozóval, majd ez után már használhatjuk direkt módon a miniUSB-t is feltöltésre az Arduino IDE-n keresztül.

rct_1.jpg

Érkezésekor a 2 db 2x15-ös tűsor nincs beforrasztva, ránk bízzák, melyik irányban akarjuk ezt saját kezünkkel beforrasztani. Az alján levő foglalatba 3V-os CR1220 elem illeszthető, de e nélkül is működik az egység.

A miniUSB mellett a fenti képen balra fent található tüskék segítségével lehet programozni, a kék gomb megnyomása kapcsolja be az eszközt. A miniUSB-től jobbra levő két DIP kapcsoló segítségével lehet váltani az indítási módok közül.

A lábak megnevezése az alábbi:

rct_pinout.jpg

Bár az egész MCU 3.3V-os jelszintekkel dolgozik, a lábak egy része toleráns az 5V bemenetekkel szemben, vagyis köthetünk rá ilyeneket, az alábbi táblázatban jelölve vannak, melyek ezek.

Láb megnevezés GPIO láb sorszám (RC Core) 5V toleráns bemenet Analóg bemenet PWM kimenet Említésre érdemes alternatív funkció
A0 0 x x
A1 1 x x
A2 2 x x UART2 TX
A3 3 x x UART2 RX
A4 4 x SPI1 NSS
A5 5 x SPI1 SCK
A6 6 x x SPI1 MISO
A7 7 x x SPI1 MOSI
A8 8 x x
A9 9 x x UART1 TX
A10 10 x x UART1 RX
A11 11 x USB DM
A12 12 x USB DP
A13 13 x JTMS-SWDIO
A14 14 x JTCK-SWCLK
A15 15 x JTDI/SPI3 NSS
B0 16 x x
B1 17 x x
B2 18 x BOOT1
B3 19 x JTDO/SPI3 SCK
B4 20 x NJTRST/SPI3 MISO
B5 21
B6 22 x x I2C1 SCL
B7 23 x x I2C1 SDA
B8 24 x x
B9 25 x x
B10 26 x I2C2 SCL/UART3 TX
B11 27 x I2C2 SDA/UART3 RX/Green LED
B12 28 x SPI2 NSS
B13 29 x SPI2 SCK
B14 30 x SPI2 MISO
B15 31 x SPI2 MOSI
C0 32 x
C1 33 x
C2 34 x
C3 35 x
C4 36 x
C5 37 x
C6 38 x x
C7 39 x x
C8 40 x x
C9 41 x
C10 42 x
C11 43 x
C12 44 x
C13 45 TAMPER RTC
C14 46 OSC32 IN
C15 47 OSC32 OUT
D0 48 x OSC_IN/CAN_RX
D1 49 x OSC_OUT/CAN_TX
D2 50 x
Láb megnevezés GPIO láb sorszám (RC Core) 5V toleráns bemenet Analóg bemenet PWM kimenet Említésre érdemes alternatív funkció

 

Amint látható több lába (16 db) is alkalmas analóg bemenetek fogadására, ez jóval több, mint az ESP8266-on található 1 db analóg A0. Így analóg I2C illesztőre STM32 projektnél nemigen lesz szükségünk. Ugyanígy kétlem, hogy ennyi rendelkezésre álló szabad láb mellett szükség lenne IO portbővítőre... (részletes összehasonlító táblázat az ArduinoEasy-ről szóló cikkben)

A rendelkezésre álló flash tárterület lehetővé teszi a (jelenlegi) komplett ArduinoEasy feltöltését, teljes MQTT támogatással. A LAN-on keresztüli eléréshez természetesen továbbra is szükség van egy W5500 LAN modulra!

A program lefordítása és feltöltése

A fordításhoz és feltöltéshez az Arduino IDE-re lesz szükség, egyúttal az STM32-höz szükséges könyvtárakat is fel kell telepítenünk. Több, egymástól eltérő Arduino hardvertámogató-réteg (Core) is létezik STM32-höz, de jelenleg ez az egyetlen, ami támogatja az RCT6/RET6 típusokat:

Előre bocsájtom, hogy nem használok Windowst, és bár az alábbiakhoz hasonlóan meg lehet oldani azon is, minden alábbi lépés Ubuntu Linux alatt tesztelve.

  1. Töltsük le innen az Arduino IDE-t a gépünkre, csomagoljuk ki:
    https://www.arduino.cc/en/Main/Software
  2. Indítsuk el az Arduino IDE-t
  3. Az Eszközök->Alaplap->Alaplap-kezelőben válasszuk ki és telepítsük az "Arduino SAM boards (Cortex-M3)" nevű alaplapot
  4. Töltsük le a https://github.com/rogerclarkmelbourne/Arduino_STM32/archive/master.zip címről az STM32 alaplapot
  5. Tömörítsük ki a letöltött ZIP állományt a ~/Arduino/hardware/Arduino_STM32 mappába (hozzuk létre, ha nincs hardware mappa itt)
  6. Futtassuk root joggal vagy sudo-val az ebben található tools/linux64/install.sh parancsfájlt, ami beállítja az udev szabályokat (ha esetleg nem futtatható az állomány, akkor a chmod a+x install.sh segít ezen, sőt ha már itt vagyunk a tools/linux és a tools/linux64 mappában levő fájlok többségének érdemes futtatható jogot beállítani)
  7. Az Arduino IDE újraindítását követően már látni fogja ezt az új alaplapot is, az Eszközök->Alaplap alatt: (STM32 F103R series)
    blue_menu_1.jpg
  8. A Variant almenüben kiválaszthatjuk a típust ezen belül, ami STM32F103RC ha 256kB flash-el szereltet kaptunk, ha viszont hozzám hasonlóan 512kB flash-el szerelttel rendelkezünk, akkor bátran válasszuk az STM32F103RE típust:blue_menu_2.jpg

Miután sikerült az Arduino IDE-t és az STM32 Core fájlokat letöltenünk, lépjünk be egy szimpatikus könyvtárba,  és töltsük le a patchelt ArduinoEasy forrását git-el:

git clone https://github.com/enesbcs/ArduinoEasy.git

vagy szimplán töltsük le ZIP-ként:

wget https://github.com/enesbcs/ArduinoEasy/archive/master.zip

és tömörítsük ki.

A parancs nyomán létrejött ArduinoEasy mappán belül található lib mappából a Base64-et másoljuk át kompletten a ~/Arduino/libraries/ alá, hogy az Arduino IDE megtalálja fordításkor, kivéve ha nem akarjuk használni a Domoticz HTTP protokoll jelszóval hitelesítő részét, mert akkor nemes egyszerűséggel inkább módosítsuk az "ArduinoEasy-Globals.h" állomány tartalmát, és az ott levő #define FEATURE_BASE64 után levő true feltételt írjuk át false -ra, és ekkor nem fogja keresni a Base64 könyvtárat. (de erről még lesz pár szó egy bekezdés múlva)

Az Arduino IDE-nek van egy - számomra - érdekes tulajdonsága, miszerint olyan nevű mappában kell lennie a () .INO fájlnak, mint maga a fájlnév. Mi a teendő? Az ArduinoEasy-n belül található src mappa tartalmát átmásoljuk pl az ~/Arduino/projects alá, hogy kéznél legyen, és ilyen formában a ~/Arduino/projects/ArduinoEasy mappa alá kerül közvetlenül minden .ino állomány, az ArduinoEasy.ino is, amit most már meg tudunk nyitni az Arduino IDE-n belül, és elvileg nem fog sopánkodni...
(Nyilván mindenki rájött eddigre, aki nem tudta volna, hogy az INO kiterjesztésű fájlok tartalmazzák az Arduino számára lefordítható C forráskódot, mellette a .h fájlokban láthatóak pedig a definíciók)

FORDÍTÁS ÉS KÖZVETLEN ELŐKÉSZÜLETEI

Ha sikerült megnyitnunk a fentiek után az ArduinoEasy.ino -t, akkor keressük ki a fülek közül az Arduino-Globals.h-t:

blue_arduino.jpg

A #define soroknak ugyebár két főbb fajtája van, az egyik esetben az a lényeg, hogy egy adott változó definiálva van-e vagy nincs, ebben az esetben úgy állíthatjuk a beállítást, hogy két darab per jelet írva elé kikommenteljük // ez esetben ez a feltétel megszűnik létezni, vagy töröljük a komment jeleket, és a fordító figyelembe veszi, hogy ezt a definíciót szeretnénk használni.
A másik fajtája, ami után van egy logikai/szám/szöveges érték, amit a fordító kiértékel fordítás soron, és attól függően illeszt be bizonyos kódrészeket.
Jelen esetben majdnem minden DEFINE értéke true lehet az első szekcióban, kivéve a FEATURE_SD-t, ha nem használunk SD kártyát, én pl nem használok. Az alatta következő #define USES_* sorok előtt sem kell kommentet hagynunk. (kivéve ha tényleg nincs és nem is lesz szükségünk soha az adott pluginra, vagy nem tudjuk a fordításához szükséges library-kat telepíteni)

Amint látható, minden funkcióval fordítva (Vázlat menü-> Ellenőriz/Fordít) a program (sketch) teljes mérete 187316 bájt, ha nem bántjuk az alapértelmezett TASKS_MAX beállítást, akkor ilyen mérethez már 16 (Ez az ESPEasy esetében 12!) eszközt enged majd felvenni, ami 12kByte helyet foglal a flash tárhely végén. Vagyis mint látható, a 256kB flashen kényelmesen elfér, a jelenleg rendelkezésre álló 512k pedig egyenesen sok.

FELTÖLTÉS

Beszéljünk akkor a konkrét feltöltésről. Ahogy már említettem, egyszer a bootloader feltöltését is meg kell ejtenünk, ami nagyon hasonlóan megy, mint a MapleMini-nél leírt módszer.

A megoldás egy külső soros-USB csatoló, például a már ESP8266-oknál sikerrel használt CP2102 is lehet, amit az alábbi módon kell a fejlesztői lapra kötni:

Mit is látunk?

Az RX-TX lábak keresztbekötésén túl a tápellátást kell bekötnünk, valamint a BOOT0-át HIGH, a BOOT1-et pedig LOW állapotba kell állítani a rendelkezésre álló DIP kapcsolók segítségével, ezzel jelezve, hogy most soros programfeltöltő módba léptünk.

CP2102 RCT6
RXD TX
TXD RX
GND GND
3V3 3V3

 

Ha az STM32 Core-t a fentebb írt helyre csomagoltuk ki, akkor az alábbi mappában megtalálhatjuk az st32flash alkalmazást, aminek segítségével a soros feltöltés elvégezhető:

~/Arduino/hardware/Arduino_STM32/tools/linux64/stm32flash$

A fenti bekötés után a Linuxos PC USB-jére történő csatlakoztatását követően az alábbihoz hasonlót kell látnunk a dmesg | tail parancsra:

usbserial: USB Serial support registered for cp210x
cp210x 2-1.5:1.0: cp210x converter detected
usb 2-1.5: cp210x converter now attached to ttyUSB0

Ami azt jelenti, hogy a /dev/ttyUSB0 címen tudunk kommunikálni az eszközzel, az alábbi paranccsal lekérhetjük a Maple paramétereit:

./stm32flash /dev/ttyUSB0

Ha a bekötés helyes volt, a válasznak ilyesminek kell lennie:


stm32flash Arduino_STM32_0.9

http://github.com/rogerclarkmelbourne/arduino_stm32

Interface serial_posix: 57600 8E1
Version : 0x21
Option 1 : 0x00
Option 2 : 0x00
Device ID : 0x0414 (High-density)
- RAM : 64KiB (512b reserved by bootloader)
- Flash : 512KiB (sector size: 2x2048)
- Option RAM : 16b
- System RAM : 2KiB

Ebből két fontos dolgot tudtunk meg: 1-helyesen végeztük el a bekötést, 2-az eszközön 512KiB flash tárhely áll rendelkezésre (Juhé!). Ha nem kaptunk választ, nyomozhatjuk az okát, ha igen, akkor folytassuk, töltsük le a bootloader2.0-át:

wget -c https://github.com/rogerclarkmelbourne/STM32duino-bootloader/blob/master/bootloader_only_binaries/generic_boot20_pc13.bin?raw=true -O generic_boot20_pc13.bin

Ha letöltöttük és meggyőződtünk róla, hogy nem egy HTML oldalt vagy hibaüzenetet sikerült letöltenünk, hanem egy 7160 bájt méretű bináris állományt, akkor azt az alábbi paranccsal tölthetjük fel:

./stm32flash /dev/ttyUSB0 -w generic_boot20_pc13.bin

És ezzel sikerült bootloader2.0-val ellátnunk RCT6 lapunkat. Ezt az eljárást pontosan egyszer kell elvégeznünk, a továbbiakban az alábbiak szerint USB kábelen direktben tudunk majd programkódot feltölteni! (a továbbiakban az USB-soros átalakítóra nincs szükség, leköthetjük és eltehetjük) NE felejtsük el a BOOT0 kapcsolót visszaállítani LOW állapotba, különben nem lesz felismerhető USB-n keresztül!
A dmesg | tail parancs ezt mutatja, ha sikerrel jártunk:

[ 6746.454682] usb 2-1.5: New USB device found, idVendor=1eaf, idProduct=0003
[ 6746.454686] usb 2-1.5: New USB device strings: Mfr=1, Product=2, SerialNumber=3
[ 6746.454689] usb 2-1.5: Product: Maple 003
[ 6746.454691] usb 2-1.5: Manufacturer: LeafLabs
[ 6746.454693] usb 2-1.5: SerialNumber: LLM 003

Ez után Teljes flash tárhely mínusz 8KB helyet használhatunk USB csatlakozáson keresztül történő feltöltéssel DFU-UTIL vagy az Arduino IDE-vel, kiválasztjuk a megfelelő Bootloader version-t, majd a Port-nál a Maple Mini-t: (ne essünk kétségbe, ha az első feltöltéskor esetleg nem jelenne meg a port, próbáljuk meg kiválasztás nélkül először a feltöltést ilyenkor)

Majd a Feltöltés gombra kattintva (jobbra mutató nyíl) az Arduino IDE megkísérli a kiválasztott portra a lefordított binárist átküldeni:

 

Ilyenkor általában újrafordít mindent, és ha közben a lapka nem válaszolna sokáig, nyomjuk meg a rajta levő RESET gombot, ekkor elkezd villogni, és a fentihez hasonló üzenetek mellett az Arduino feltölti rá a kódot. Ha elsőre nem megy, ne legyünk restek újrapróbálni, nem mindig sikerül nekem sem elsőre, jól kell időzíteni a Reset gomb megnyomását..

A soros csatlakozásra ugyebár már nem lesz szükség, ezért azt már régen lekötöttük, hiszen ezentúl USB-n keresztül tudjuk frissíteni a programot, a W5500 LAN modult pedig az alábbi bekötés szerint tudjuk illeszteni:

RCT6 W5500
3.3V 3.3V
GND GND
RST RST
A4 SCS
A5 SCLK
A6 MISO
A7 MOSI

 

Ha mindent jól csináltunk, akkor a fenti kódfeltöltés és a LAN csatlakozás bekötése után az eszközünket elérhetjük a DEFAULT_IP részben megadott, alapértelmezetten 192.168.0.50 IP címen egy böngészőből.

ae_blue_info.jpg

Ennyit az alapokról, konkrét használatára példa a későbbiekben kerül fel a blogra.

A bejegyzés trackback címe:

https://bitekmindenhol.blog.hu/api/trackback/id/tr2214975514

Kommentek:

A hozzászólások a vonatkozó jogszabályok  értelmében felhasználói tartalomnak minősülnek, értük a szolgáltatás technikai  üzemeltetője semmilyen felelősséget nem vállal, azokat nem ellenőrzi. Kifogás esetén forduljon a blog szerkesztőjéhez. Részletek a  Felhasználási feltételekben és az adatvédelmi tájékoztatóban.

Hypervisor 2019.07.29. 16:53:41

Szia,
pontosan miért álltál át az STM32 alapra az ESP8266 helyett? Elolvastam mindkét cikket de nem igazán értettem meg milyen előnye lehet a sok plusz IO porton kívül.

eNeS 2019.07.29. 17:28:15

Igazából nem álltam át, ez csak egy lehetőség azoknak, akik vezetékes hálózatban gondolkoznak. Még most is ESP-im vannak itthon, de ha kell, mostmár könnyen tudok LAN-ost is gyártani. (Tudom hogy állítólag ESP-vel is meg lehet oldani a LAN-t de 1: az ESPEasy ezt nem támogatja, 2: alig marad szabad IO láb az SPI bekötés után, 3: az SPI select láb az ESP-n többfunkciós, bonyolult a használata, egyéb elemeket kell közbeiktatni.)

eNeS 2019.07.29. 17:33:47

@Hypervisor: Négy cikk van a témában egyébként, nem kettő, és az első kettőben leírtam miért vágtam bele az egészbe: bitekmindenhol.blog.hu/tags/arduinoeasy

Friss topikok

Címkék

433mhz (12) adc (1) ads1015 (2) ads1115 (1) ajtó (1) alkatrész (23) alternatív kapcsoló (1) am2320 (1) amg8833 (1) analóg (1) android (1) apds-9960 (1) arduino (1) arduinoeasy (5) automatizálás (3) basic (2) basic r3 (1) bemenet (2) bh1750 (1) blitzwolf (2) bluetooth (8) camhi (2) csengő (1) csináld magad (22) dht22 (1) digoo (1) DIY (2) diy (25) do-it-yourself (26) domoticz (7) ds18b20 (1) ds3231 (1) easpeasy (1) ebay (3) érintő (2) érintőkapcsoló (6) érzékelő (11) esp-01 (2) esp32 (2) esp8266 (18) espeasy (2) espurna (1) esp projekt (18) Eview7 (1) feldolgozó (1) felhő (1) fényérzékelő (1) firmware (7) flame detector (1) flash (1) fogyasztásmérő (3) ftdi (1) füstérzékelő (1) gesture (1) gpio (1) hang (4) hangjelző (1) hc-sr501 (1) hőmérséklet (12) htu21 (1) impulzus relé (1) izzó (1) javascript (1) jelenlétérzékelő (2) kamera (13) keresztkapcsoló (1) kézmozdulat (1) kijelző (3) kimenet (18) konnektor (4) lan (3) lángérzékelő (2) led (3) linux (3) logic level converter (1) lua (1) lux (1) maple mini (2) mcu (3) mobil (1) mosfet (1) mozgás (3) mq-2 (2) mqtt (1) MQTT (1) működtető rendszer (5) nedvesség (1) neopixel (1) Node-RED (1) nvr (2) nyitás (4) okosház (5) okosizzó (2) okosotthon (9) oled (1) onvif (5) opencv (1) openwrt (3) orange pi (4) páratartalom (6) php (1) pow (1) programozás (7) projekt (22) proximity olvasó (1) python (1) raspberry (12) raspberry projekt (5) raspbian (1) rcwl-0516 (1) reed (1) relé (20) remote (2) rf (2) rgb (6) rögzítő (2) router (1) rpieasy (1) rtc (1) rtsp (1) shelly (10) shelly em (1) shutter (1) solid state relay (1) sonoff (14) sonoff dual (1) SonOTA (1) soros (1) ssr (1) stm32 (4) szenzor (11) szilárdtest relé (1) szintillesztő (2) sziréna (1) szkript (2) szünetmentesítés (4) t1 (1) t4 (1) tasmota (2) Tasmota (1) távirányító (3) Telegram (1) termékteszt (55) termosztát (1) touch (2) ups (4) usb (5) usb hub (1) valós idejű óra (1) vezérlések (17) vezérlő (5) világítás (4) villanykapcsoló (11) webkamera (1) wiegand (1) wifi (20) ws2812 (1) xiaomi (5) xm (1) xmeye (1) yoosee (1) zigbee (4) zwave (1) Címkefelhő