STM32F4 Discovery + .NET MicroFramework
Projekt BROB
ÚSTAV: UAMT
ŠKOLNÍ ROK: 2013/2014
VEDOUCÍ: Tomáš Jílek
ZPRACOVÁNÍ: Martin Pavloň
Petr Ručka
Obsah
STM32F4 Discovery + .NET MicroFramework 1
Projekt BROB 1
OBSAH 2
ZADÁNÍ 4
TEORETICKÝ ÚVOD 5
MICROSOFT .NET MICRO FRAMEWORK 5
GPIO 6
DAC/ADC 6
USART 6
I2C 6
ETHERNET 6
PWM 7
SPI 7
CAN 7
USB 8
MOUNTAINEER USB MAINBOARD 9
MOUNTAINEER ETHERNET MAINBOARD 10
FEZ CERBERUS MAINBOARD 12
STM32F4DISCOVERY 14
TABULKA SROVNÁNÍ JEDNOTLIVÝCH PORTACÍ 15
INSTALACE .NETMF PŘES ST-LINK 16
INSTALACE .NETMF PŘES DFUSE 17
ZPRACOVANÉ ÚKOLY 18
USART 18
DA/AD 18
GPIO 18
ETHERNET 18
I2C 18
SPI 18
PŘESNOST ČASOVÁNÍ 18
PŘÍKLADY KÓDŮ PRO JEDNOTLIVÉ TYPY KOMUNIKACÍ 19
GPIO A AD/DA 19
I2C 20
USART VIRTUAL COM 21
USART LOOP BACK 21
ETHERNET 22
PŘESNOST ČASOVÁNÍ 23
ZÁVĚR 24
ZDROJE 25
4
Zadání
Vyzkoušejte instalaci prostředí .NET MicroFramework na kit STM32F4
Discovery (příp. i na jiné). Otestujte použitelnost (odezvy, přesnost časování,
atd.) pro použití jako řídicí desky mobilních robotů. Otestujte funkčnost
základních subsystémů použitého MCU (GPIO, DAC/ADC, UART, I2C,
Ethernet, atd.) v .NET MicroFramework. Srovnejte low-cost řešení s STM32F4
Discovery s komerčně dostupnými embedded moduly s již nainstalovaným
.NET MicroFramework s ohledem na jejich nízkou cenu. Testovací aplikaci
realizujte v .NET/C#.
5
Teoretický úvod
Microsoft .NET Micro Framework
open source .NET platforma určená pro zařízení s omezenými systémovými
prostředky
obsahuje zmenšenou verzi .NET runtime a podporuje vývoj v C#, Visual Basic .NET a
podporuje debugging jak v emulátoru tak na fyzickém hardware
obsahuje dodatečné knihovny specifické pro embedded aplikace
cílí na usnadnění, zrychlení a zlevnění vývoje vestavěných systémů
paměťová náročnost zhruba 300kB
může běžet rovnou „na železe“ bez operačního systému přičemž běh pod OS je také
možný
podporuje běžné integrované periferie a komunikace, včetně Flash paměti, EEPROM,
GPIO, I2C, SPI, Serial port, USB
nevyžaduje MMU (jednotka správy paměti)
hlídá pády a tuhnutí aplikace
Ne každá portace podporuje všechny HW periferie, ale je možné si vytvořit vlastní,
nebo použít zdrojové kódy k portacím např. od Fez, nebo mountaineer a zkompilovat
si pouze to co potřebujeme.
Díky univerzálnímu kódu lze programy přenášet na různá zařízení, pokud na nich běží
.NETMF(nejlépe stejné verze) a pokud daná portace podporuje vše co je v kódu
napsáno, avšak pokud není portace dostupná stojí za zvážení zda ji vytvářet, nebo
radši použít C.
Nevýhoda portace je to, že zpomaluje běh procesoru, a má určité nároky na paměť,
což u malých procesorů není zanedbatelné
I když je kód univerzální, .NETF je relativně nový a často vychází nové verze což
komplikuje situaci s vývojem portace.
6
GPIO
General Purpose Input/Output - piny (vývody), které lze programovat pomocí
softwaru
do těchto pinů lze posílat elektrický signál nebo jej z nich naopak přijímat, tím lze ve
finále pracovat s připojeným hardware na té nejnižší úrovni
DAC/ADC
převodníky z digitálního signálu na analogový a naopak
většina vstupních signálů jsou analogové, a aby je mohl daný přístroj zpracovat, je
potřeba je převést na signál digitální
USART
synchronní / asynchronní sériové rozhraní (Universal Synchronous / Asynchronous
Receiver and Transmitter)
zařízení pro sériovou komunikaci, které lze nastavit buď pro asynchronní režim (pro
linky RS232), anebo pro synchronní režim (SPI)
USART může být nakonfigurován v následujících módech:
o Asynchronní (full duplex) – v tomto módu může komunikovat s periferiemi
(CRT terminály…)
o Synchronní (half duplex) – může komunikovat s perifériemi A/D a D/A
převodníky, sériová EEPROM…
můžeme jej nastavit jako Master nebo Slave
I2C
Inter-Integrated Circuit
multi-masterová počítačová sériová sběrnice používána k připojování nízko
rychlostních periferií k základní desce, vestavěnému systému nebo mobilnímu
telefonu
sběrnice rozděluje připojená zařízení na řídící (master – zahajuje a ukončuje
komunikaci; generuje hodinový signál SCL) a řízené (slave – zařízení adresované
masterem)
Ethernet
souhrn technologií pro lokální počítačové sítě (LAN)
7
propojení pomocí kroucené dvou linky, optickým kabelem (a dříve i koaxiálním
kabelem)
komunikace přenosovými rychlostmi od 10 Mbit/s po 10 Gbit/s
sítě Ethernet realizují fyzickou a linkovou vrstvu referenčního modelu OSI, takže je
možné po nich provozovat jeden nebo více protokolů síťové vrstvy
PWM
Pulse Width Modulation - pulzně šířková modulace
diskrétní modulace pro přenos analogového signálu pomocí dvouhodnotového signálu
signál je přenášen pomocí střídy
demodulace signálu pomocí dolno frekvenční propusti.
často využívána ve výkonové elektronice pro řízení velikosti napětí nebo proudu
kombinace PWM modulátoru a dolno frekvenční propusti bývá rovněž využívána jako
levná náhrada D/A převodníku
SPI
Serial Peripheral Interface - sériové periferní rozhraní
použití pro komunikaci mezi řídícími mikroprocesory a integrovanými obvody
(EEPROM, A/D převodníky, displeje…)
komunikace realizována pomocí společné sběrnice
adresace pomocí zvláštních vodičů, které při logické nule aktivují příjem a vysílání
zvoleného zařízení (piny SS nebo CS)
Master
o řídí komunikaci pomocí hodinového signálu
o určuje, se kterým zařízením na sběrnici bude komunikovat pomocí SS - Slave
Select (někdy CS - Chip Select)
Slave
o vysílá podle hodinového signálu, pokud je aktivován pomocí SS/CS
CAN
Controller Area Network -
využívána pro vnitřní komunikační síť senzorů a funkčních jednotek
sériová datová sběrnice, nejvyšší možnost přenosu dat 1 Mb/s
8
USB
Universal Serial Bus
univerzální sériová sběrnice, způsob připojení periferií k počítači
nahrazuje dříve používané způsoby připojení (sériový a paralelní port, PS/2, Gameport
apod.)
pro běžné druhy periférií – tiskárny, myši atd.
pro přenos dat
On The GO
o schopnost vzájemné komunikace přes USB na úrovni point-to-point (peer-to-
peer), tuto komunikaci jen připomíná, ale ve skutečnosti je to upravená
komunikace mezi Master - Slave
o přenos dat mezi dvěma rovnocennými zařízení bez potřeby nadřazeného
systému (PC)
o např. komunikace mezi dvěma telefony, fotoaparátem a tiskárnou…
o řadiče jsou schopny pracovat v režimu Host či Device, ale vždy jeden z nich
musí být Host a druhý Device
DEVICE (Slave)
o je podřízený Hostu
o např. telefon, flash disk
HOST (Master)
o nadřazený nad Device
o např. PC
při připojení USB zařízení Hostu a Device, tak zařízení typu Host ovládá zařízení typu
Device např. posílání dat
9
Mountaineer USB Mainboard
o cena 89,5$
o deska obsahuje 9 slotů pro: GPIO, SPI, I2C, UART, AD/DA, PWM, USB
Device/Host, CAN
o dále obsahuje micro USB konektor, dvě tlačítka, 8 MB Flash paměti
o s procesorem STM32F407 na frekvenci 168 MHz, který má Flash paměť 1 MB a
RAM paměť 192 KB
o deska je napájena 5V přes USB, ale toto napětí je potom sníženo na 3,3 V
o pracuje ve třech módech:
Active: 70 mA
Sleep: 26 mA
Deep: 20 mA
o funkčnost při teplotě 0 – 70°C
10
Mountaineer Ethernet Mainboard
o cena 100$
o Ethernet konektor (RJ 45): HTTP, TCP, UDP, ICMP
o pro komunikaci není potřeba další ethernetový modul
o deska obsahuje 8 slotů pro: GPIO, SPI, I2C, UART, AD/DA, PWM, CAN
o dále obsahuje micro USB konektor, dvě tlačítka, 8 MB Flash paměti
o s procesorem STM32F407 na frekvenci 168 MHz, který má Flash paměť 1 MB a
RAM paměť 192 KB
o deska je napájena 5V přes USB, ale toto napětí je potom sníženo na 3,3 V
o pracuje ve třech módech:
Active (spolu s Ethernetem): 170 mA
Active (bez ethernetu): 80 mA
Sleep: 37 mA
Deep: 8 mA
o funkčnost při teplotě 0 – 70°C
11
Mapování pinů pro Mountaineer(společná tab. pro USB a Ethernet desku)
12
FEZ Cerberus Mainboard
o cena 29,95$
o deska obsahuje 8 slotů pro: GPIO, SPI, I2C, UART, AD/DA, PWM, USB Device /
Host, CAN
o podporuje komunikaci přes ethernet jen s připojeným modulem, plně podporováno
TCP/IP s HTTP, TCP, UDP, DHCP
o dále obsahuje tlačítko, 8 MB Flash paměti
o s procesorem STM32F405VG na frekvenci 168 MHz,
o celkově dostupná Flash paměť 1 MB více jak 300KB pro uživatelský kód
o celkově dostupná paměť RAM 119 KB nebo 104 KB
o funkčnost při teplotě -20 – 70°C
13
Mapování pinů
14
STM32F4DISCOVERY
o cena 20$
o osazena procesorem STM32F407VGT6 s 1 MB Flash a 192 KB RAM
o deska je napájena 5 V přes USB
o externí aplikace napájeny 5 V a 3 V
o obsahuje:
akcelerometry LIS302DL, LI3DSH ST MEMS 3
zvukový senzor MP45DT02 - digitální mikrofon
8 LED
2 tlačítka
3,5 mm jack konektor
o podporuje komunikaci přes Ethernet, USART, AD/DA, SPI, I2C, CAN, I2S, SDIO,
UART
o možnost připojení displeje
o obsahuje USB OTG (on the go)
o pomocí USB mini je deska napájena, pomocí USB micro je do procesoru nahráván
program a tak pomocí něj deska komunikuje
o oproti předchozím deskám nemá piny pro jednotlivé periferie pohromadě, ale
rozházené ve čtyřech řadách přípojných kolíků, a taky tyto piny spolu nesousedí, takže
člověk musí hledat, jaký pin odpovídá dané periferii
o Pro funkčnost námi testovaných portací je nutné vyměnit originální krystal 8MHz za
12MHz, po tomto zásahu je nutné odstranit odpor R69 ze spodní strany desky, jinak
je krystal přetlumený!
15
Tabulka srovnání jednotlivých portací
Portace PWM Podpora
Ethernetu SD
karta SPI I2C USART CAN AD/DA USB
Mountaineer USB 4 Ne Ne 3 3 5 1 3/1 Device / Host
Mountaineer Ethernet 4 Ano Ne 3 3 5 1 3/1
Only integrated USB for debug
FEZ Cerberus 5
Ano s externím Modulem ano 2 2
3
Beta verze 12/2 Device
Všechny portace podporují GPIO
AD, I2C, SPI jsou HW na desce pouze 3, více AD převodníků je řešeno multiplexorem.
16
Instalace .NETMF přes ST-LINK
1.
2. Stáhnout STM32 ST-LINK Utility a nainstalovat
http://www.st.com/web/en/catalog/tools/PF258168
3. Pro funkčnost námi testovaných portací je nutné vyměnit originální krystal 8MHz za
12MHz, po tomto zásahu je nutné odstranit odpor R69 ze spodní strany desky, jinak
je krystal přetlumený!
4. Stáhnout portaci .NETMF
Mountaineer.zip
Samozřejmě je možné použít jinou portaci, ale musí být vytvořena pro verzi
.NETMF kterou budete instalovat(u nás 4.2 QFE2)
Nainstalovat Visual Studio 2010
http://www.microsoft.com/visualstudio/eng/downloads#d-2010-express
5. Nainstalovat .NET MicroFramework SDK
http://netmf.codeplex.com/releases/view/91594
6. Připojit desku přes Mini USB
7. Spustit STM32 Utility
8. Připojit se k desce pomocí STM32 Utility
9. Vymazat vše co je na procesoru (Target->Erase chip, Target->Erase sectors(select all
sector) )
10. Nahrát do čipu ze zipu Tinybooter.hex
11. Resetovat desku
12. Propojit desku s PC i pomocí Micro USB, Mini USB nyní slouží jako napájení
13. Nainstalovat USB driver, toto je nutné udělat ručně, z vlastnosti USB zařízení se
dostat až k nastavení Driveru, a tam ho aktualizovat na verzi jenž je přibalená v zip
souboru. To že WinUsb nemusí hlásit chybu ještě neznamená, že nám bude fungovat.
14. Spustit MFDeploy.exe
15. Vybrat typ zařízení v našem případě USB a měla by se ukázat naše discovery deska
16. Nahrát pomocí MFDeploy do čipu zbytek obsahu smt32discovery.zip
(ER_Config.hex, ER_Flash.hex)
17. A nyní můžeme spustit Visual Studio, vytvořit nový projekt(console aplication C#) a
začít programovat.
17
Instalace .NETMF přes DfuSe
1. Nainstalovat DfuSe 3.0.2 je součástí odevzdání, nebo ho lze nainstalovat s balíkem od
GHI.
2. Pro funkčnost námi testovaných portací je nutné vyměnit originální krystal 8MHz za
12MHz, po tomto zásahu je nutné odstranit odpor R69 ze spodní strany desky, jinak
je krystal přetlumený!
3. Stáhnout portaci .NETMF
Mountaineer.zip
Samozřejmě je možné použít jinou portaci, ale musí být vytvořena pro verzi
.NETMF kterou budete instalovat(u nás 4.2 QFE2)
4. Nainstalovat Visual Studio 2010
http://www.microsoft.com/visualstudio/eng/downloads#d-2010-express
5. Nainstalovat .NET MicroFramework SDK
http://netmf.codeplex.com/releases/view/91594
6. Použít jednu z propojek z ST-LINK a propojit s ní piny BOOT0 a Vdd.
7. Restartovat desku
8. Spustit DFU měli by jste vidět v řádku Device svoje zařízení
9. Dále kliknou na záložku Protocol->Create from Map, zvolit Erase radio button->GO
10. Kliknout na Load DFU file a zvolit soubor stažený v zipu
11. Zvolit Download radio button(neklikat na Upload ihned by se vám poškodil dfu file a
museli by jste ho znovu stáhnout) ->GO
12. Odstranit propojku a restartovat
13. Nainstalovat USB driver, toto je nutné udělat ručně, z vlastnosti USB zařízení se
dostat až k nastavení Driveru, a tam ho aktualizovat na verzi jenž je přibalená v zip
souboru. To že WinUsb nemusí hlásit chybu ještě neznamená, že nám bude fungovat.
14. A nyní můžeme spustit Visual Studio, vytvořit nový projekt(console aplication C#) a
začít programovat.
Anglický návod zde.
18
Zpracované úkoly
USART
Funkční komunikace zařízení s PC pomocí převodníku do USB
Funkční komunikace zařízení samo se sebou (loopback)
DA/AD
Funkční nastavování napětí v rozsahu 0-3V
GPIO
Funkční spínání testovacích LED diod
Ethernet
Nefunkční pouze odesílá DHCP request, ale již nic dalšího, nastavení statické IP adresy
nepomáhá.
I2C
Funkční s ultrazvukovým měřičem vzdálenosti SFR 10
SPI
Komunikuje s ethernet modulem ENC28J60, jelikož ethernet nefunguje nelze říci, že to
není způsobeno SPI, i když se to nezdá pravděpodobné.
Komunikace s SCA3000 nefunguje, snaha o načtení revize z čidla byla neúspěšná,
odchozí komunikace byla kontrolována osciloskopem a je v pořádku.
Příklad pro SPI komunikaci, by měl být v pořádku, avšak při testování se nám
nepovedlo načíst revizi akcelerometru, ikdyž jsme kontrolovali odchozí data, která jsou
v pořádku!
Přesnost časování
Hodnoty jsou měřeny statistikou z 200 hodnot
fnastavená[HZ] průměr[Hz] min[Hz] max[Hz] Max relativní
chyba[%] rozptyl
hodnot[Hz]
Timer(Cerberus .NETMF 4.2) 500 458,52 443,70 472,06 -11,26 28,35
PWM(MountaineerUSB .NETMF 4.2) 500 500,07247 500,07248 500,07248 0,01 0,00001
Sleep(Cerberus .NETMF 4.2) 500 435,08 430,97 437,35 -13,81 6,38
19
Příklady kódů pro jednotlivé typy komunikací
GPIO a AD/DA
public static void Main() { OutputPort led_g = new OutputPort((Cpu.Pin)60, false); //definice I/O pinů OutputPort led_o = new OutputPort((Cpu.Pin)61, false); OutputPort led_r = new OutputPort((Cpu.Pin)62, false); OutputPort led_b = new OutputPort((Cpu.Pin)63, false); InputPort vstup = new InputPort((Cpu.Pin)(0 * 16 + 1), true,Port.ResistorMode.PullUp); AnalogInput AD = new AnalogInput((Cpu.AnalogChannel)Cpu.AnalogChannel.ANALOG_1); //definice AD převodníku AD.Offset = 0; //nastavení stejnosměrného posunutí AD převodníku AD.Scale = 3; //nastavení maximálního vstupního napětí AD převodníku double AD_data = 0; AnalogOutput output = new //definice DA převodníku AnalogOutput((Cpu.AnalogOutputChannel)Cpu.AnalogOutputChannel.ANALOG_OUTPUT_0); output.Scale = 1; //nastavení stejnosměrného posunutí DA převodníku output.Offset = 0; //nastavení maximálního vstupního napětí DA převodníku for (; ; ) { if ((vstup.Read()) == false) //cyklus ovládání LED podle stavu pinu vstup { led_g.Write(true); led_o.Write(true); led_r.Write(true); led_b.Write(true); } else { led_g.Write(false); led_o.Write(false); led_r.Write(false); led_b.Write(false); } AD_data = AD.Read(); //metoda pro čtení AD převodníku Debug.Print(AD_data.ToString()); Thread.Sleep(1500); output.Write(0.5); //metoda pro zápis do DA převodníku, double <0,1> z maxima DA } }
20
I2C
public static void Main() { I2CDevice.Configuration con = new I2CDevice.Configuration(0xE0 >> 1, 10); //definice I2C (nastaveni adresy zařízení, rychlosti komunikace v KHz) I2CDevice MyI2C = new I2CDevice(con); //inicializace I2C int Distance = 9999; I2CDevice.I2CTransaction[] Read = new I2CDevice.I2CTransaction[2]; I2CDevice.I2CTransaction[] Start =new I2CDevice.I2CTransaction[1]; I2CDevice.I2CTransaction[] Init = new I2CDevice.I2CTransaction[2]; byte[] RegisterValue_16 = new byte[2] { 9,9 }; byte[] RegisterValue_16L = Utility.CombineArrays(new byte[] { 0x01 }, new byte[] { 0x01 }); byte[] range = Utility.CombineArrays(new byte[] { 0x02 }, new byte[] { 0xFF }); //nastavení vzdálenosti 43+43x [mm] byte[] gain = Utility.CombineArrays(new byte[] { 0x01 }, new byte[] { 0x0A }); //nastavení šířky laloku 0-16 byte[] mode = Utility.CombineArrays(new byte[] { 0x00 }, new byte[] { 0x51 }); //nastavení typu výstupních dat 50inch 51cm 52us Init[0] = I2CDevice.CreateWriteTransaction(range); //posloupnost dat pro init. Init[1] = I2CDevice.CreateWriteTransaction(gain); Start[0] = I2CDevice.CreateWriteTransaction(mode); //příkaz ke zpuštění Read[0] = I2CDevice.CreateWriteTransaction(new byte[] { 0x02 }); Read[1] = I2CDevice.CreateReadTransaction(RegisterValue_16); //čtení 16b registru if (MyI2C.Execute(Init, 15) < 1) //spuštění inicializace čidla Debug.Print("Failed to perform Init"); for (; ; ) //nekonečná smyčka měření { if (MyI2C.Execute(Start, 10) < 1) Debug.Print("Failed to perform Start"); //impuls čidlu pro začátek měření Thread.Sleep(70); //počkám 70ms if (MyI2C.Execute(Read, 10) < 2) //načtu změřená data Debug.Print("Failed to perform I2C transaction"); else Distance = (RegisterValue_16[0] << 8) + RegisterValue_16[1]; //sloučení 16b registru Debug.Print("Register value: " + Distance); Thread.Sleep(1000); } }
21
USART virtual com
public static void Main() { SerialPort UART = new SerialPort("COM3", 9600,Parity.None,8,StopBits.One); //inicializace UART linky(Com1-3,parita,počet bitů,typ zakončení) int read_count = 0; byte[] tx_data; byte[] rx_data = new byte[16]; tx_data = Encoding.UTF8.GetBytes("USART Test COM3"); //označení pinů na discovery tx-PD8 rx-PD9 UART.ReadTimeout = 0; UART.Open(); //otevření sériové linky for (; ; ) { rx_data = Encoding.UTF8.GetBytes(" "); //proměná pro načítání dat UART.Flush(); UART.Write(tx_data, 0, tx_data.Length); //odeslání dat po UART Thread.Sleep(100); read_count = UART.Read(rx_data, 0, rx_data.Length); //načtení dat z buffru Debug.Print("Data:" + (char)rx_data[0] + (char)rx_data[1] + (char)rx_data[2] + (char)rx_data[3] + (char)rx_data[4]+ (char)rx_data[5] + (char)rx_data[6] + (char)rx_data[7]); //výpis dat po Debugeru Thread.Sleep(3000); } }
USART loop back
public static void Main() { SerialPort UART = new SerialPort("COM3", 9600); //inicializace UART linky(Com1-3,parita,počet bitů,typ zakončení) int read_count = 0; byte[] tx_data; byte[] rx_data = new byte[16]; tx_data = Encoding.UTF8.GetBytes("USART Test COM3"); //označení pinů na discovery tx-PD8 rx-PD9 UART.ReadTimeout = 0; UART.Open(); //otevření sériové linky for (int x = 0; x < 100; x++) { UART.Flush(); UART.Write(tx_data, 0, tx_data.Length); //odeslání dat Thread.Sleep(100); read_count = UART.Read(rx_data, 0, rx_data.Length); //načtení buffru if (read_count != 15) Debug.Print("Spatna velikost: " + read_count.ToString()); else { Debug.Print("Data uspesne prijata:" + (char)rx_data[0] + (char)rx_data[1] + (char)rx_data[2] + (char)rx_data[3] + (char)rx_data[4] + (char)rx_data[5] + (char)rx_data[6] + (char)rx_data[7] + (char)rx_data[8] + (char)rx_data[9] + (char)rx_data[10] + (char)rx_data[11] +(char)rx_data[12] + (char)rx_data[13] + (char)rx_data[14]); } //výpis dat po Debugeru Thread.Sleep(100); } }
22
Ethernet
//nastavení interface ethernetu na 0 static NetworkInterface iface = NetworkInterface.GetAllNetworkInterfaces()[0]; static Socket server; public static void Main() { //povolení automatického získání IP adresy z DHCP severu iface.EnableDhcp(); /* //příkazy pro manuální nastavení IP, je nutné nepovolovat DHCP, viz víše iface.PhysicalAddress=(new byte[] { 0x5c, 0x86, 0x4a, 0x00, 0x00, 0xdd }); iface.EnableStaticIP("192.168.1.102", "255.255.255.0", "192.168.1.1"); */ while (iface.IPAddress == "0.0.0.0") //čekání na nastavení IP adresy z DHCP serveru { Debug.Print("Awaiting IP Address"); Thread.Sleep(1000); } Debug.Print("IP Address Granted: " + iface.IPAddress); server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); //inicializuje lokální endpoint aby poslouchal na výchozím portu http 80 IPEndPoint localEndPoint = new IPEndPoint(IPAddress.Any, 80); server.Bind(localEndPoint);//použije endpoint pro nastavení serveru server.Listen(10); while (true) { // spuštění serveru, nyní by měl přijímat IP pakety Socket clientSocket = server.Accept(); // funkce pro zpracování příchozích dat ProcessClientRequest(clientSocket); } } static void ProcessClientRequest(Socket m_clientSocket) { const Int32 c_microsecondsPerSecond = 1000000; using (m_clientSocket) { Byte[] buffer = new Byte[1024]; if (m_clientSocket.Poll(5 * c_microsecondsPerSecond,SelectMode.SelectRead)) { if (m_clientSocket.Available == 0) return; Int32 bytesRead = m_clientSocket.Receive(buffer,m_clientSocket.Available, SocketFlags.None); //vrátí html stránku napsanou níže String s = "HTTP/1.1 200 OK\r\nContent-Type: text/html; charset=utf-8\r\n\r\n<html><head><title>.NET Micro Framework Web Server</title></head>" + "<body><bold><a href=\"http://www.ghielectronics.com/\">Learn more about the .NET Micro Framework with FEZ by clicking here</a></bold></body></html>"; byte[] buf = System.Text.Encoding.UTF8.GetBytes(s); int offset = 0; int ret = 0; int len = buf.Length; while (len > 0) { ret = m_clientSocket.Send(buf, offset, len, SocketFlags.None); len -= ret; offset += ret; } m_clientSocket.Close(); } } }
23
Přesnost časování
public class Program { class OurClass { public int x; } static void RunMe(object o) { if (OUT1.Read() == false) OUT1.Write(true); else OUT1.Write(false); } static PWM MyFader = new PWM(Cpu.PWMChannel.PWM_3, 5, 0.5, false); //PWM(kanál,start za,frekvence,invertující režim) public static void Main() { OutputPort OUT = new OutputPort((Cpu.Pin)(0 * 16 + 1), false); static OutputPort OUT1 = new OutputPort((Cpu.Pin)(0 * 16 + 2), false); //definice output pinů MyFader.Start(); //nastartování PWM /* PWMChannel.PWM_0: PD12 //GREEN LED PWMChannel.PWM_1: PD13 //ORANGE LED PWMChannel.PWM_2: PD14 //RED LED PWMChannel.PWM_3: PD15 //BLUE LED PWMChannel.PWM_4: PE9 */ OurClass cls = new OurClass(); cls.x = 5; Timer MyTimer =new Timer(new TimerCallback(RunMe), cls, 3000, 1); /null for (; ; )//Smyčka pro generování 500Hz přes Sleep { OUT.Write(true); Thread.Sleep(1); OUT.Write(false); Thread.Sleep(1); } } }
SPI
public static void Main() { SPI.Configuration MyConfig = new SPI.Configuration(Cpu.Pin.GPIO_Pin10, false/*chip select*/, 0/*time after selected*/, 0/*holt time*/, false/*false idle->clk=0*/, true/*clock edge true=raisig*/, 1, SPI.SPI_module.SPI1); SPI MySPI = new SPI(MyConfig);//vytvoření kanál SPI s deklarací víše ushort[] Init_data16b = new ushort[1] { 0x52C0 }; ushort[] wr_data16b = new ushort[1] { 0xA}; ushort[] rd_data16b = new ushort[1] { 0xFFFF}; ushort[] Buff_W16b = new ushort[1] { 0x002A }; ushort[] Buff_R16b = new ushort[1] { 0xFFFF }; { MySPI.Write(Init_data16b);//instrukce Write zapiše data a načtená data zahodí Thread.Sleep(1000); MySPI.WriteRead(Buff_W16b, Buff_R16b);//WriteRead zapíše i načte data while (true) { MySPI.WriteRead(wr_data16b, rd_data16b); Thread.Sleep(250); Debug.Print("Register value16b: " + Buff_R16b[0] + rd_data16b[0]); } } }
24
Závěr
Podařilo se nám zprovoznit komunikaci před GPIO, USART, I2C, AD/DA, SPI. Z části se
povedlo komunikovat i přes ethernet, odesílá se pouze DHCP request. SPI jsme zkoušeli, při
komunikaci přes ethernet. Z toho vyplývá, že odchozí komunikace by měla být v pořádku.
Z měření časování při nastavené frekvenci 500Hz vyplívá, že časovač má o 11,26% menší
frekvenci než jsme mu nastavili a Sleep dokonce o 13,81%, u PWM jsme naměřil o 0.1%
více než bylo nastaveno, také stabilita PWM je výborná oproti časovači, který má rozptyl
28,35Hz. Sleep mód je na tom o něco lépe s rozptylem 6,38Hz.
Doporučuji používat pro nahrátí portace program DfuSe, jelikož je to snadnější a nezávislé na
programátoru a pokud potřebujete občas něco odpájet(časté) z desky může se vám stát, že ST-
Link už vám stejně nepoběží, navíc je tento způsob často rychlejší, neboť například portace
mountaineeru je pouze jeden .dfu soubor na místo 3 .hex souborů pro ST-LINK.
Zapůjčená deska se jeví jako výhodná koupě, vzhledem k její relativně nízké ceně a možnosti
nahrát si do ní SW z produktů i několikanásobně dražších. Na této desce je osazeno množství
periférií což může být výhoda i problém, pokud chcete využívat některé její piny. Další
možností je si koupit Fez Cerberus, což je produkt o něco dražší, ale s již nahranou portací a
bez nutnosti cokoliv na desce modifikovat, na této desce však již nenajdeme žádné periferie.
Poslední zkoumanou možností jsou desky od mountaineer, ty jsou však mnohem dražší, než
předcházející, avšak nabízí zpracovanou HW a SW vrstvu buď pro ethernet, nebo pro USB,
podle typu desky
25
Zdroje
http://mc2.unl.edu/uploads/discoveryCerberus.zip
https://www.ghielectronics.com/catalog/product/349
http://www.mountaineer.org/resources/release-4-2-qfe1/
http://www.mountaineer.org/mountaineer-platform/