Pomalu už nám nestačí kit samotný a začínáme k němu připojovat různé periférie. Tento díl bude věnován úvodu do Ethernetové komunikace a časem dojdeme k webovému serveru založenému na STM32 VL Discovery kitu a ENC28J60 Ethernetovému MAC a PHY od společnosti Michochip.

Úvodem k ethernetu

Ten sice zná každý, ale když se jde k podrobnostem, tak ty už zná málo kdo. A protože potřebujeme naprogramovat zařízení, které bude komunikovat po ethernetu, tak právě v těch detailech je skrytý ďábel. Proto je potřeba je probrat. Začneme tedy definicemi jednotlivých pojmů. Odborníci prominou, že jde o velmi zhuštěný a zjednodušený popis. Více zkušení snad omezí svou netrpělivost, že tohle všechno znají, ale pro méně zkušené je to třeba určitě připomenout.


Rychlosti a topologie

Ethernetové sítě po fyzické stránce mohou přenášet data různou rychlostí. Dříve, dokud byla ethernetová síť tvořena jedním koaxiálním kabelem (a není to tak dávno), dokonce mohla probíhat komunikace jen jedním směrem, tedy nebylo možné používat plný duplex. V současnosti jsou obvykle malé ethernetové sítě tvořeny rozvodem několika párů zkroucených dvoulinek a v kabelu je jak vysílací, tak i přijímací pár - tudíž zařízení může najednou přijímat i vysílat (tj. používá se duplex). Dřívější běžnou rychlostí přenosu bylo 10 Mbit/s, nyní je dominantní rychlost 100 Mbit/s a často se můžeme setkat s rychlostí 1Gbit/s. Naštěstí jsou téměř všechna zařízení kompatibilní dolu, tedy každé rychlé zařízení by mělo umět komunikovat i s pomalým. U rozvodů pomocí více párů kroucených dvoulinek se využívá topologie hvězda - tedy existuje nějaké středové zařízení (obvykle je jím switch - tedy zařízení přeposílající pakety), do kterého jsou zavedeny kabely ze všech ethernetových zařízení. Takže když vytvoříme nějaké naše zařízení, tak jej připojíme kabelem (tzv. patch kabel) s konektory RJ-45 na obou stranách, tak že jeden konec kabelu půjde do switche a druhý do našeho zařízení. Pokud nemáme switch a zařízení chceme vyzkoušet s PC, tak musíme mít tzv. překřížený ethernetový kabel (tento kabel má prohozený pár vysílací a přijímací), který zapojíme mezi PC a naše zařízení. Osobně doporučuji pro práci využívat switch, minimálně proto, že jej můžeme mít na stole a sledovat jeho indikační LED.
Nakonec bych chtěl upozornit na to, že většina počítačů má nainstalovaný firewall, který neznámé komunikaci (a to bude často náš případ) brání. Takže v případě nefunkčnosti některého demo programu z dalších dílů, nezapomeňte na tuto možnost.


Adresy

Základem v ethernetové síti je jednoznačná adresa. Aby to nebylo jednoduché rozlišujeme adresy dvě - adresu pro Internetový protokol (neboli IP adresu) a Media Access Control adresu (neboli MAC). V současnosti je nejčastěji používaným typem adresy adresa dle IPv4, která je tvořena 4 bajty o 8-mi bitech a zapisuje se s tečkami mezi čísly (např. 192.168.1.5). Adresa MAC je podobný problém jako číslo VID pro USB zařízení - MAC adresy v sobě zahrnují číslo výrobce a s jejich přidělováním je to stejně problematické jako s přidělením VID. MAC adresa je tvořena 6-ti bajty (po 8-mi bitech) a zapisuje se bud jako řetězec hexa čísel nebo jednotlivá čísla oddělená dvojtečkou (například 00:0C:2B:DE:3F:25). Obecně platí, že čísla IP a čísla MAC musí být v síti jedinečná (tedy nemůžete mít dvě zařízení se stejným IP nebo MAC číslem).
Kromě výše uvedených adres se na síti používají též názvy doménové, tvořené několika textovými názvy oddělenými tečkou (například mcu.cz). Převod z této "pro člověka čitelnější podoby" do tvary IP se stará nejčastěji DNS protokol, který se zeptá serveru, který spravuje IP adresy pro danou doménu na IP číslo platné pro daný název.
Pro naše potřeby se vystačíme s IP a MAC adresou, a ukážeme si, jak ve windows zařídit, abychom nemuseli oslovovat zařízení např. 192.168.1.15 ale mohli jsme napsat jednoduše mujweb.cz.
Pro úplnost bych uvedl, že v současnosti probíhají snahy o postupné zavádění adres dle IPv6, kde je adresa tvořena 16-ti bajty a zapisuje se s dvojtečkami nebo tečkami po dvou bajtech (například fec0:0000:0000:0001:0800:5a12:3456).


Malá vsuvka k adresám

Určité bloky adres se v internetu nepřenášejí. Pro naše potřeby je jde zejména o rozsahy 10.0.0.0 – 10.255.255.255, 172.16.0.0 – 172.31.255.255, 192.168.0.0 – 192.168.255.255. Tyto adresy je tedy doporučené používat ve vnitřní síti.
Dále pro zařízení nevyužívejte loopback adres v rozsahu 127.0.0.0 - 127.255.255.255.
Pro další text berte v úvahu, že budu pojmenovávat zařízení tak, že router do internetu bude mít IP číslo 192.168.0.1 a můj hlavní PC bude mít IP adresu 192.168.0.2. A když budu připojovat další zařízení, tak jim budu dávat adresy 192.168.0.10 až třeba 16. Tudíž naše první pokusné zařízení bude mít IP adresu 192.168.0.10! Pokud budete mít problém se zprovozněním IP komunikace ve vaší síti (například, když vám IP adresy přiděluje DHCP server), tak se podívejte na IP adresu vaší ethernetové karty v PC a podle ní si nastavte IP adresu zařízení. Pokud tedy budete mít IP adresu 192.168.1.2, tak zařízení přidělte například adresu 192.168.1.10 (zkuste zvolit ale takovou adresu, která se v síti nevyskytuje).


Porty

Zařízení připojené do ethernetu může provozovat několik služeb (například web server a ftp úschovu souborů). Aby se rozlišilo mezi různými službami, tak služby mají přiděleny různé porty (a pro nejdůležitější služby je port obvykle stanoven). Příkladem budiž třeba pro web (neboli přesněji pro http protokol/službu) je určen port 80. Číslo portu je dáno 2 bajty, tedy rozsah je 1-65535). Číslo portu můžete obvykle zapsat za IP adresu pomocí dvojtečky. Pokud tedy do prohlížeče zapíšete "mcu.cz", tak prohlížeč předpokládá že máte zájem o http službu a sám doplní adresu na "mcu.cz:80". Toho lze využít tak, že se služby provozují na jiném portu a pokud někdo nezjistí odpovídající číslo portu, tak se službou nemůže komunikovat (například váš web může běžet na adrese "mujweb.cz:55" a když zadáte do prohlížeče pouze "mujweb.cz", tak nic neuvidíte). Pochopitelně existují programy, kterými lze oskenovat postupně všechny porty, zda na daném portu je nějaká odezva (tímto skenerem tedy lze tedy web server na jiném portu objevit).
IP adresa a příslušný cílový port mi popisují tzv. Socket, což je označení komunikačního kanálu s cílovým ethernetovým zařízením.


Protokoly

Konečně se dostáváme k protokolům. Komunikační protokoly tvoří několik vrstev, z nichž většina běžných uživatelů zná tu nejvyšší, které je nejblíže k aplikacím a proto hovoříme o vrstvě aplikační a protokolech jako aplikačních. Tyto jsou nad protokoly transportnímí a ty jsou nadřazeny těm nejnižším, které se nazývají internetové. Pod internetovými je již pouze interface pro daný ethernetový HW.

Dostal jsem od jednoho z kolegů též doplňující obrázek k OSI modelu a k protokolům, tak jej sem rád vkládám.




Aplikační protokoly

Aplikačních protokolů je celá řada. Jak již výše zmíněné DNS, HTTP a FTP protokoly, tak kromě nich jich existuje celá řada dalších. Pokud na nějaký narazíme později, tak se mu budeme věnovat.


Komunikační/transportní protokoly

Pokud již známe adresu a port, tak stále nejsme ještě u konce. Na každém portu lze komunikovat několika protokoly. Běžné jsou tři - TCP, UDP a ICMP. Komunikační protokoly vytvářejí při vysílání z nějakých dat (předaných aplikačním protokolem) pakety, které předávají internetové vrstvě a naopak při příjmu přebírají pakety od internetové vrstvy a vytváření z nich data pro aplikační protokoly.

TCP - Protokol řízení přenosu (Transmission Control Protocol) je dvousměrnný protokol (tedy existuje jedna komunikační roura tam druhá zpět), s potvrzováním správnosti přenosu. Tedy při přenášení dat jedním směrem mi protistrana potvrzuje korektní příjem vysílaných paketů a případně si může vyžádat opakovaný přenos paketu chybně přeneseného.

UDP (User Datagram Protocol) je jednosměrný protokol, bez potvrzování z druhé strany. Dál si ukážeme, jak tuto nevýhodu eliminovat a využít s úspěchem tento jednoduchý protokol.

ICMP - Protokol řídicích zpráv (Internet Control Message Protocol) je jiný než výše zmíněné dva. Jde o protokol, pomocí kterého se oznamuje tazateli, že něco není v pořádku - například že jím požadovaná služba není dostupná. Je to tedy způsob jak zaslat chybovou zprávu. Teoreticky, pokud by nám v našem zařízení vše chodilo, tak bychom ICMP ani nepotřebovali


Internetové protokoly

A pomalu se blížíme k hardware, kterým vysíláme a přijímáme signály přes konektor pro připojení ethernetového kabelu. Internetové protokoly si popíšeme dva - IP a ARP.

IP (Internet Protocol) je dominantně používaným protokolem na internetu. Původně šlo o jednosměrný protokol bez zpětného potvrzování, který byl později doplněn výše uvedeným spojovým protokolem TCP a spolu vytvářejí rodinu protokolů TCP/IP. IP protokol vezme paket od některého z protokolů transportních, doplní k němu směrovací hlavičku a pošle jej ethernetovému HW.

ARP - Protokol pro určení adresy (Address Resolution Protocol) slouží, jak již je z jeho názvu zřejmé, ke stanovení adresy (konkrétně MAC) nejbližšího ethernetového zařízení. ARP vysílá dotazy do sítě a sbírá informace o odpovědích od dalších zařízení (případně při příjmu ARP dotazu od jiného zařízení odpoví tak, že pošle svou IP adresu a svou MAC adresu). Přijaté informace ukládá do paměti, kde vytváří tabulku MAC adres (cache) připojených zařízení. Tyto MAC adresy zase potřebuje ethernetový interface aby mohl sestavit vysílací datagram a odeslat údaje jinému zařízení na ethernetu.


Ethernetový interface

Úkolem ethernetového interface je k odesílanému datagramu doplnit cílovou hlavičku a kontrolní součet. A při příjmu naopak zkontrolovat kontrolní součet, zda je správný.





Na obrázku vidíme, jak se data při vysílání postupně obalují dalšími údaji, až se nakonec odešlou do ethernetu. Při příjmu se naopak postupně došlá data vybalují až z nich získáme údaje, které přijímáme.


Pohyb dat po ethernetu

Z výše uvedeného už začíná být mírně zřejmé, jak data po ethernetu pohybují. Z našeho zařízení se při vysílání odešle rámec na nejbližší nadřízené zařízení na síti (to je buď router, pokud posíláme zařízení v nějaké jiné síti než na intranetu, nebo jde o cílové ethernetové zařízení). Pokud data jdou na router, tak ten rozbalí rámec, zjistí z datagramu cílovou adresu, přidá k datagramu svou hlavičku - čímž vytvoří svůj paket a ten pošle dál dle cílové adresy.
V cílovém zařízení se po rozbalení frame zjistí z datagramu, že jde o data pro dané zařízení, vybalí se z dat datový paket, který se předá nadřízenému protokolu. Ten paket zpracuje (např. v případě TCP paketu vygeneruje zpětné potvrzení o doručení a přečtení).

V rámcích (frames), paketech (packets) a datagramech nesmí být bordel, aby si mohla zařízení mezi sebou rozumět. Proto je přesný tvar předepsán. Začneme odspodu od HW ethernetu.

Formát Ethernet frame dle IEEE 802.3
 Cílová MAC Odesílací MAC  Délka DATA  CRC


Formát rámce dle Ethernet v.2
Cílová MAC Odesílací MAC Typ DATA CRC
Typ: IP=0x0800, ARP=0x0806, RARP=0x8035, IPX=0x8137


Pro zjednodušeně neuvádím, že na začátku rámce je extra sekvence bajtů, kdy se střídají 101010.., aby mohlo dojít k synchronizaci přijímače. Do ethernetových rámců se balí jednotlivé datagramy

Formát IPv4 datagramu
Bajty0 12 3
  0 až 3 Verze Délka hl.  Typ služby Celková délka
  4 až 7 Identifikace Příznaky  Offset fragmentu
  8 až 11 TTL Protokol  Kontrolní součet hlavičky
  12 až 15 Adresa odesílatele
  16 až 19 Adresa cíle
  20 až 23 Volby  Výplň
... Data


A jednotlivé datagramy obsahují datové pakety jednotlivých protokolů


TCP Header
OffsetsOctet0123
OctetBit 0 1 2 3 4 5 6 7 8 910111213141516171819202122232425262728293031
0 0 Zdrojový port Cílový port
4 32 Číslo sekvence
8 64 Číslo potvrzení(když je ACK nastaven)
12 96 Data offset ReservedN
S
C
W
R
E
C
E
U
R
G
A
C
K
P
S
H
R
S
T
S
Y
N
F
I
N
 Window Size
16128 Checksum Urgent pointer (když je URG nastaven)
20
...
160
...
 Options (if Data Offset > 5,padded at end with "0" bytes if necessary)
...



Jak vidíte v TCP datagramu, tak se odesílá též Číslo potrvzení - to je sekvenční číslo datagramu, který se má potvrdit, tudíž je možné odesílat a potvrzovat celé bloky datagramů a jedním potvrzením, což velmi urychluje komunikaci.

Předepsaný tvar pro IP datagram zde je odkaz

Předepsaný tvar pro UDP zprávu zde je odkaz

Předepsaný tvar pro ARP zprávu zde je odkaz (je to dost obecné, konkrétně níže)


Trocha programování

Abychom jen tak neteoretizovali, tak bychom se mohli podívat také na nějaký kód. Máme několik možností. Buď si napíšeme nějaký malý a jednoduchý TCP/IP stack sami, nebo využijeme stacku, který poskytuje Microchip (můžeme, protože to je pro ENC28J60), nebo využijeme Light Weight TCP/IP stacku ze švédské university (lwIP) a nebo konečně můžeme využít šikovného malého TPC/IP stacku od InterNiche, který je zdarma pro použití s produkty ST Microelectronics.
Pod dlouhém zkoumání stále ještě váhám jakou cestou jít. Vše má své výhody i negativa. Každopádně, když se podíváme, jak to řeší jiní, tak nic nezkazíme. Proto se koukneme jak třeba řeší ARP u Microchipu? Obsluha ARP je tvořena dvěma funkcemi. První je ARPGet, kterou zpracujeme došlý paket - zjistíme zda jde o správný a korektní ARP packet.

/*********************************************************************
 * Function:        BOOL ARPGet(NODE_INFO* remote, BYTE* opCode)
 * PreCondition:    ARP packet is ready in MAC buffer.
 * Input:           remote  - Remote node info
 *                  opCode  - Buffer to hold ARP op code.
 * Output:          TRUE if a valid ARP packet was received.
 *                  FALSE otherwise.
 ********************************************************************/

BOOL ARPGet(NODE_INFO *remote, BYTE *opCode)
{
    ARP_PACKET packet;
    MACGetArray((BYTE*)&packet, sizeof(packet));
    MACDiscardRx();
    SwapARPPacket(&packet); // tim jen upravime promenne - kod je na konci
    if ( packet.HardwareType != HW_ETHERNET     ||
         packet.MACAddrLen != sizeof(MAC_ADDR)  ||
         packet.ProtocolLen != sizeof(IP_ADDR) )
         return FALSE;      // chyba pokud nesedi delky
    if ( packet.Operation == ARP_OPERATION_RESP )
        *opCode = ARP_REPLY;
    else if ( packet.Operation == ARP_OPERATION_REQ )
        *opCode = ARP_REQUEST;
    else
    {
        *opCode = ARP_UNKNOWN;
        return FALSE;        // chyba pokud nejde o ARP dotaz nebo odpoved
    }

    if ( (packet.TargetIPAddr.v[0] == MY_IP_BYTE1) &&
         (packet.TargetIPAddr.v[1] == MY_IP_BYTE2) &&
         (packet.TargetIPAddr.v[2] == MY_IP_BYTE3) &&
         (packet.TargetIPAddr.v[3] == MY_IP_BYTE4) )  // paket byl zaslan nam
    {
        remote->MACAddr     = packet.SenderMACAddr;
        remote->IPAddr      = packet.SenderIPAddr; // ulozime si data od odpovidajiciho stroje
        return TRUE;        // mame validni ARP odpoved
    }
    else
        return FALSE;       // ostatni pakety jsou k ničemu
}


Druhá funkce je zajímavější, to sami vysíláme dotaz nebo odpověď na dotaz.
/*********************************************************************
 * Function:        void ARPPut(NODE_INFO* more, BYTE opCode)
 * PreCondition:    MACIsTxReady() == TRUE
 * Input:           remote  - Remote node info
 *                  opCode  - ARP op code to send
 ********************************************************************/

void ARPPut(NODE_INFO *remote, BYTE opCode)
{
    ARP_PACKET packet;
    packet.HardwareType             = HW_ETHERNET;
    packet.Protocol                 = ARP_IP;
    packet.MACAddrLen               = sizeof(MAC_ADDR);
    packet.ProtocolLen              = sizeof(IP_ADDR);
    if ( opCode == ARP_REQUEST )
    {
        packet.Operation            = ARP_OPERATION_REQ; // pozadujeme ARP
        packet.TargetMACAddr.v[0]   = 0xff; // naplnime target adresy FF
        packet.TargetMACAddr.v[1]   = 0xff;
        packet.TargetMACAddr.v[2]   = 0xff;
        packet.TargetMACAddr.v[3]   = 0xff;
        packet.TargetMACAddr.v[4]   = 0xff;
        packet.TargetMACAddr.v[5]   = 0xff;
    }
    else
    {   // jde o odpoved
        packet.Operation            = ARP_OPERATION_RESP;
        packet.TargetMACAddr        = remote->MACAddr;
    }
    packet.SenderMACAddr.v[0]       = MY_MAC_BYTE1;
    packet.SenderMACAddr.v[1]       = MY_MAC_BYTE2;
    packet.SenderMACAddr.v[2]       = MY_MAC_BYTE3;
    packet.SenderMACAddr.v[3]       = MY_MAC_BYTE4;
    packet.SenderMACAddr.v[4]       = MY_MAC_BYTE5;
    packet.SenderMACAddr.v[5]       = MY_MAC_BYTE6;
    packet.SenderIPAddr.v[0]        = MY_IP_BYTE1;
    packet.SenderIPAddr.v[1]        = MY_IP_BYTE2;
    packet.SenderIPAddr.v[2]        = MY_IP_BYTE3; // paket odesilame vzdy my
    packet.SenderIPAddr.v[3]        = MY_IP_BYTE4; // proto vyplnime nasi MAS a nasi IP
    /* Check to see if target is on same subnet, if not, find Gateway MAC.
     * Once we get Gateway MAC, all access to remote host will go through Gateway */

    if (((packet.SenderIPAddr.v[0] ^ remote->IPAddr.v[0]) & MY_MASK_BYTE1) ||
        ((packet.SenderIPAddr.v[1] ^ remote->IPAddr.v[1]) & MY_MASK_BYTE2) ||
        ((packet.SenderIPAddr.v[2] ^ remote->IPAddr.v[2]) & MY_MASK_BYTE3) ||
        ((packet.SenderIPAddr.v[3] ^ remote->IPAddr.v[3]) & MY_MASK_BYTE4) )
    {
        packet.TargetIPAddr.v[0] = MY_GATE_BYTE1; // je to mimo nasi sit
        packet.TargetIPAddr.v[1] = MY_GATE_BYTE2; // musime pres gateway !!
        packet.TargetIPAddr.v[2] = MY_GATE_BYTE3; // Obvykle tedy router
        packet.TargetIPAddr.v[3] = MY_GATE_BYTE4;
    }
    else
        packet.TargetIPAddr             = remote->IPAddr; // muzeme primo

    SwapARPPacket(&packet);     // upravime promene
    MACPutHeader(&packet.TargetMACAddr, MAC_ARP, sizeof(packet)); // vlozeme hlavicku
    MACPutArray((BYTE*)&packet, sizeof(packet)); //vlozime paket
    MACFlush(); // poslem do sveta po dratech
}


static void SwapARPPacket(ARP_PACKET *p)
{
    p->HardwareType     = swaps(p->HardwareType);
    p->Protocol         = swaps(p->Protocol);
    p->Operation        = swaps(p->Operation);
}


Z toho co bylo uvedeno jako kód odvodíte, že ARP požadavek na zaslání adresy vypadá následovně.


Ještě bych k tomu dodal, že router je natolik inteligentní, že když zašleme ARP dotaz na MAC týkající se IP adresy mimo naší síť, tak router odpoví s tím, že pošle svou MAC adresu. Tudíž, když pak něco posíláme na IP adresu mimo naší síť, tak to cestuje na router, který následně paket zašle dál.
Ještě bych k tomu dodal, že když zařízení chce oslovit IP adresu mimo danou síť, tak dotaz směřuje na router a router odpoví s tím, že pošle svou MAC adresu. Tudíž, když pak něco posíláme na IP adresu mimo naší síť, tak první cesta směřuje na router, který následně paket zašle dál.


Závěr

Příště tedy zkusíme spáchat nějakou jednoduchou komunikaci UDP, což je velmi snadný a nekomplikovaný protokol. Tedy představuji si, že by existovala aplikace na PC (podobná jako pro USB), která by zobrazovala kit a když na kitu dojde ke stisku tlačítka, tak to bude na aplikaci na PC vidět a obdobně klikáním na aplikaci budeme pomocí UDP povelů přenášených do STM32 VL Discovery kitu, rozsvěcovat LED. V dalším dílu zkusíme realizovat TCP protokol (web komunikuje na portu 80 pomocí TCP paketů) a malý http server. Bude to jen trivialitka, která, když jí přijde na port 80 požadavek na data, tak pošle html stránku předem připravenou v paměti. Nicméně, z vašeho prohlížeče budete moci vidět, zda je stisknuto tlačítko na kitu, nebo ne.
Za texty týkající se USB jsem dostal dotaci od dvou sponzorů, kterým za to velmi děkuji. Budu se snažit, aby jste nelitovali


Odkazy

STM32-VL DISCOVERY popis je zde.
STM32-VL Discovery 2. (další popis, osobní poznatky) je zde.
Začínáme s STM32 VL Discovery kitem naleznete zde.
Začínáme s STM32 VL Discovery kitem _2. naleznete zde.
Začínáme s STM32 VL Discovery kitem _3. naleznete zde.
Začínáme s STM32 VL Discovery kitem _4. naleznete zde.
Začínáme s STM32 VL Discovery kitem _5. naleznete zde.
Začínáme s STM32 VL Discovery kitem _6. naleznete zde. (blikání LED)
Začínáme s STM32 VL Discovery kitem _7. naleznete zde. (ladění)
Začínáme s STM32 VL Discovery kitem _8. naleznete zde. (využití SysTick)
Začínáme s STM32 VL Discovery kitem _9. naleznete zde. (změna CLK)
Začínáme s STM32 VL Discovery kitem 10. naleznete zde. (kontaktní pole)
Začínáme s STM32 VL Discovery kitem 11. naleznete zde. (PWM)
Začínáme s STM32 VL Discovery kitem 12. naleznete zde. (watchdog)
Začínáme s STM32 VL Discovery kitem 13. naleznete zde. (externí přerušení)
Začínáme s STM32 VL Discovery kitem 14. naleznete zde. (LCD)
Začínáme s STM32 VL Discovery kitem 15. naleznete zde. (ADC)
Začínáme s STM32 VL Discovery kitem 16. naleznete zde. (Teplotní čidlo)
Začínáme s STM32 VL Discovery kitem 17. naleznete zde. (klávesnice PS/2)
Začínáme s STM32 VL Discovery kitem 18. naleznete zde. (správná verze LCD.c)
Začínáme s STM32 VL Discovery kitem 19. naleznete zde. (DAC převodník)
Začínáme s STM32 VL Discovery kitem 20. naleznete zde. (DAC s přerušením)
Začínáme s STM32 VL Discovery kitem 21. naleznete zde. (DMA v paměti)
Začínáme s STM32 VL Discovery kitem 22. naleznete zde. (DMA s DAC)
Začínáme s STM32 VL Discovery kitem 23. naleznete zde. (RTC)
Dodatek k "Začínáme s STM32 VL Discovery kitem 23." je zde. (RTC úprava)
Začínáme s STM32 VL Discovery kitem 24. naleznete zde. (RTOS-přehled)
Začínáme s STM32 VL Discovery kitem 25. naleznete zde. (USART-přerušení)
Začínáme s STM32 VL Discovery kitem 26. naleznete zde. (USART-přesměrování vstupů a výstupů)
Začínáme s STM32 VL Discovery kitem 27. naleznete zde. (Assembler vkládaný do C kódu)
Začínáme s STM32 VL Discovery kitem 28. naleznete zde. (Vnořované přerušení)
Začínáme s STM32 VL Discovery kitem 29. naleznete zde. (Přímé řízení znakového LCD)
Začínáme s STM32 VL Discovery kitem 30. naleznete zde. (I2C komunikace)
Začínáme s STM32 VL Discovery kitem 31. naleznete zde. (mcu řady STM32L)
Začínáme s STM32 VL Discovery kitem 32. naleznete zde. (RTC)
Začínáme s STM32 VL Discovery kitem 33. naleznete zde. (vícekanálové ADC)

InterNiche TCP/IP stack info odkaz
Microchip TCP/IP Stack info zde.
Light Weight TCP/IP Stack odkaz

Definice konektorů STM VL Discovery kitu v Eagle pro vytvoření projektu
s konektorem, do něhož jde zasunout kit naleznete zde.
Jak na STM VL Discovery s programovým vybavením od Keil 1. je zde.
Jak na STM VL Discovery s programovým vybavením od Keil 2. je zde.
Jak zprovoznit STM VL Discovery pokud si při pokusech zakážete JTAG piny pomocí bootloaderu je zde.

Reference manuál k Value Line naleznete zde.