ARM. STM32 pikakäynnistys. STM32-mikro-ohjainten nopea hallinta. Ytimen vuorovaikutus oheisyksikön kanssa

IN viime vuosina ARM-prosessoreihin perustuvat 32-bittiset mikro-ohjaimet (MCU) valloittavat nopeasti elektroniikan maailman. Tämä läpimurto johtuu niiden korkeasta suorituskyvystä, täydellisestä arkkitehtuurista, alhaisesta energiankulutuksesta, alhaisista kustannuksista ja edistyneistä ohjelmointityökaluista.

LYHYT HISTORIA
Nimi ARM on lyhenne sanoista Advanced RISC Machines, jossa RISC (Reduced Instruction Set Computer) tarkoittaa supistetun käskyjoukon suoritinarkkitehtuuria. Ylivoimainen määrä suosittuja MK:ita ja esimerkki PIC- ja AVR-perheistä on myös RISC-arkkitehtuuri, joka mahdollisti suorituskyvyn lisäämisen yksinkertaistamalla käskyjen dekoodausta ja nopeuttamalla niiden suorittamista. Kehittyneiden ja tuottavien 32-bittisten ARM-mikro-ohjainten ilmaantumisen myötä voimme siirtyä ratkaisemaan monimutkaisempia ongelmia, joita 8- ja 16-bittiset MCU:t eivät enää pysty selviytymään. ARM-mikroprosessoriarkkitehtuurin 32-bittisellä ytimellä ja RISC-käskysarjalla on kehittänyt brittiläinen yritys ARM Ltd, joka kehittää yksinomaan ytimiä, kääntäjiä ja virheenkorjaustyökaluja. Yritys ei tuota MK:ita, vaan myy niiden tuotantoon lisenssejä. MK ARM on yksi nopeimmin kasvavista MK-markkinoiden segmenteistä. Nämä laitteet käyttävät energiaa säästäviä tekniikoita, joten niitä käytetään laajasti sulautetuissa järjestelmissä ja ne hallitsevat markkinoita mobiililaitteet, joille se on tärkeää alhainen virrankulutus. Lisäksi ARM-mikrokontrollereita käytetään aktiivisesti viestinnässä, kannettavissa ja sulautetuissa laitteissa, joissa vaaditaan korkeaa suorituskykyä. ARM-arkkitehtuurin ominaisuus on prosessorin laskentaydin, jota ei ole varustettu millään lisäelementtejä. Jokaisen prosessorin kehittäjän on varustettava tämä ydin itsenäisesti tarvittavat lohkot omallesi erityisiä tehtäviä. Tämä lähestymistapa on toiminut hyvin suurille siruvalmistajille, vaikka se alun perin keskittyi klassisiin prosessoriratkaisuihin. ARM-prosessorit ovat jo käyneet läpi useita kehitysvaiheita, ja ne tunnetaan hyvin ARM7-, ARM9-, ARM11- ja Cortex-perheistä. Jälkimmäinen on jaettu klassisten CortexA-prosessorien, CortexR-reaaliaikaisten prosessorien ja CortexM-mikroprosessoriytimien alaryhmiin. CortexM-ytimistä tuli perusta suuren luokan 32-bittisten MCU:iden kehittämiselle. Ne eroavat muista Cortex-arkkitehtuurin muunnelmista ensisijaisesti 16-bittisen Thumb2-käskyjoukon käytön suhteen. Tämä sarja yhdisti "klassisten" ARM- ja Thumb-ohjeiden suorituskyvyn ja kompaktisuuden, ja se kehitettiin erityisesti C- ja C++-kielten kanssa työskentelemiseen, mikä parantaa merkittävästi koodin laatua. Suurella arvokkuudella CortexM-ytimeen rakennetut MK:t ovat ohjelmistoyhteensopivia, mikä mahdollistaa teoriassa ohjelmakoodin käytön kielellä korkea taso eri valmistajien malleissa. Sen lisäksi, että MK-kehittäjät osoittavat ytimen käyttöalueen, ne osoittavat CortexM-ytimen suorituskyvyn kymmenen pisteen asteikolla. Nykyään suosituimmat vaihtoehdot ovat CortexM3 ja CortexM4. MK kanssa ARM-arkkitehtuuri Tuottaneet yritykset, kuten Analog Devices, Atmel, Xilinx, Altera, Cirrus Logic, Intel, Marvell, NXP, STMicroelectronics, Samsung, LG, MediaTek, MStar, Qualcomm, SonyEricsson, Texas Instruments, nVidia, Freescale, Milander, HiSilicon ja muut.
Optimoidun arkkitehtuurin ansiosta CortexM-ytimeen perustuvien MCU:iden kustannukset ovat joissain tapauksissa jopa alhaisemmat kuin monien 8-bittisten laitteiden. "Nuorempia" malleja voi tällä hetkellä ostaa 30 ruplaa. keholle, mikä luo kilpailua aikaisempien sukupolvien MK:lle. STM32 MIKROOHJAimet Tarkastellaan STM32F100-perheen edullisinta ja laajimmin levinnyt MCU:ta STMicroelectronicsilta, joka on yksi maailman johtavista MCU-valmistajista. Yhtiö ilmoitti äskettäin aloittavansa teollisia ominaisuuksia hyödyntävän 32-bittisen MK:n tuotannon
STM32-ytimet edullisissa sovelluksissa. STM32F100 Value -linjaperheen MCU:t on suunniteltu laitteille, joissa 16-bittisten MCU:iden suorituskyky ei riitä ja "tavallisten" 32-bittisten laitteiden runsas toiminnallisuus on tarpeeton. STM32F100 MCU-sarja perustuu moderniin ARM CortexM3 -ytimeen, jonka oheislaitteet on optimoitu käytettäväksi tyypillisissä sovelluksissa, joissa käytettiin 16-bittisiä MCU:ita. STM32F100 MCU:n suorituskyky 24 MHz:llä on parempi kuin useimmat 16-bittiset MCU:t. Tämä rivi sisältää laitteet, joissa erilaisia ​​parametreja:
● 16–128 kilotavua ohjelman flash-muistia;
● 4–8 kilotavua RAM;
● jopa 80 GPIO-tulo-/lähtöporttia;
● jopa yhdeksän 16-bittistä ajastinta edistyneillä toiminnoilla;
● kaksi vahtikoiran ajastinta;
● 16-kanavainen nopea 12-bittinen ADC;
● kaksi 12-bittistä DAC:ta sisäänrakennetuilla signaaligeneraattoreilla;
● enintään kolme UART-liitäntää, jotka tukevat IrDA-, LIN- ja ISO7816-tiloja;
● enintään kaksi SPI-liitäntää;
● enintään kaksi I2C-liitäntää, jotka tukevat SMBus- ja PMBus-tiloja;
● 7-kanavainen suora muistiyhteys (DMA);
● CEC (Consumer Electronics Control) -liitäntä sisältyy HDMI-standardiin;
● reaaliaikainen kello (RTC);
● Sisäkkäinen NVIC-keskeytysohjain.

STM32F100:n toimintakaavio on esitetty kuvassa 1.

Riisi. 1. MK-linjan STM32F100 arkkitehtuuri

Lisämukavuus on laitteiden nastayhteensopivuus, jonka avulla voidaan tarvittaessa käyttää mitä tahansa perheen MK:ta suuremmalla toiminnallisuudella ja muistilla ilman painettua piirilevyä. STM32F100-ohjainsarja on valmistettu vuonna kolme tyyppiä LQFP48-, LQFP64- ja LQFP100-paketit, joissa on 48, 64 ja 100 nastaa. Nastojen jako on esitetty kuvissa 2, 3 ja 4. Tällaiset kotelot voidaan asentaa piirilevyille ilman erikoislaitteita, mikä on merkittävä tekijä pientuotannossa.


Riisi. 2. STM32 MCU LQFP48-paketissa Kuva. 3. STM32 MCU LQFP64-paketissa


Riisi. 4. STM32 MCU LQFP100-paketissa

STM32F100 on edullinen ja optimoitu laite, joka perustuu CortexM3-ytimeen, jota tukee kehittynyt kehitysympäristö STM32-mikrokontrolleriperheelle, joka sisältää
Ilmaiset kirjastot kaikille oheislaitteille, mukaan lukien moottorin ohjaus ja kosketusnäppäimistöt.

KYTKENTÄKAAVIO STM32F100C4
Tarkastellaan MK:n käytännön käyttöä yksinkertaisimman STM32F100C4-laitteen esimerkillä, joka kuitenkin sisältää kaikki STM32F100-linjan päälohkot. Perusteellista sähkökaavio STM32F100C4:n sisällyttäminen on esitetty kuvassa 5.


Riisi. 5. Kytkentäkaavio mallille MK STM32F100C4

Kondensaattori C1 varmistaa, että MK nollautuu, kun virta kytketään, ja kondensaattorit C2-C6 suodattavat syöttöjännitteen. Vastukset R1 ja R2 rajoittavat MK-nastojen signaalivirtaa. Sisäistä oskillaattoria käytetään kellon lähteenä, joten ulkoista kidettä ei tarvitse käyttää.


Tulojen BOOT0 ja BOOT1 avulla voit valita MK:n lataustavan, kun virta kytketään päälle taulukon mukaisesti. BOOT0-tulo on kytketty nollapotentiaaliväylään vastuksen R2 kautta, joka suojaa BOOT0-nastaa oikosululta, kun sitä käytetään PB2:n lähtöporttina. Käyttämällä liitintä J1 ja yhtä jumpperia voit muuttaa BOOT0-tulon potentiaalia ja määrittää siten, kuinka MK ladataan - flash-muistista tai sisäänrakennetusta käynnistyslataimesta. Jos MK on ladattava RAM-muistista, BOOT1-tuloon voidaan liittää samanlainen hyppyjohdin.
MK:n ohjelmointi suoritetaan UART1-sarjaportin kautta tai erityisten ohjelmoijien - JTAG- tai STLink-debuggerien kautta. Jälkimmäinen on osa suosittua virheenkorjauslaitetta STM32VLDISCOVERY, joka näkyy kuvassa 6. STM32VLDIS COVERY -kortilla ohjelmoijan STLink-debuggerin 4-nastainen liitin on nimetty SWD:ksi. Artikkelin kirjoittaja ehdottaa MK:n ohjelmointia UART1-sarjaportin kautta, koska se on paljon yksinkertaisempaa, ei vaadi erikoislaitteita eikä ole nopeudeltaan huonompi kuin JTAG tai ST Link. Ohjauslaitteena, joka pystyy tuottamaan komentoja ja näyttämään MK-ohjelman tuloksia, sekä ohjelmoijana voit käyttää mitä tahansa henkilökohtainen tietokone(PC), jossa on sarja COM-portti tai USB-portti USBRS232-muuntimella.

PC:n COM-portin ja MK:n yhdistäminen pariksi Mikä tahansa käy RS232-signaalien muuntaja loogisiksi signaalitasoiksi 0 - 3,3 V, esimerkiksi ADM3232-mikropiiri. TXD-siirtolinja sarjaportti tietokone, tasomuuntimen jälkeen, tulee kytkeä mikrokontrollerin PA10-tuloon ja RXD-vastaanotinlinja vastaavan muuntimen kautta PA9-lähtöön.

Jos haluat käyttää haihtumatonta MK-kelloa, sinun tulee kytkeä siihen CR2032-paristo, jonka jännite on 3 V, ja kvartsiresonaattori, jonka taajuus on 32768 Hz. Tätä tarkoitusta varten MK on varustettu Vbat/GND- ja OSC32_IN/OSC32_OUT-nastoilla. Vbat-nasta on ensin irrotettava 3,3 V:n tehoväylästä.

MK:n jäljellä olevia vapaita liittimiä voidaan käyttää tarpeen mukaan. Tätä varten ne tulisi kytkeä liittimiin, jotka sijaitsevat MK:n painetun piirilevyn kehän ympärillä, analogisesti suositun kanssa. Arduino-laitteet ja kehityslevy STM32VLDISCOVERY.


Riisi. 6. Virheenkorjauslaite STM32VLDISCOVERY


Sähkökytkentäkaavio STM32VLDISCOVERY.

Siten MK:n käyttötarkoituksesta ja -menetelmästä riippuen voit liittää siihen tarvittavat elementit käyttääksesi muita toiminnallisia lohkoja ja portteja, esimerkiksi ADC, DAC, SPI, I2C jne. Jatkossa näitä laitteita tarkastellaan tarkemmin.

OHJELMOINTI
Nykyään monet yritykset tarjoavat työkaluja ohjelmien luomiseen ja virheenkorjaukseen STM32-mikro-ohjaimille. Näitä ovat ARM Ltd:n Keil, IAR Embedded Workbench for ARM, Atol lic TrueStudio, CooCox IDE, GCC ja Eclipse IDE. Kehittäjä voi valita ohjelmiston mieltymyksensä mukaan. Alla kuvataan Keil-yrityksen Keil uVision 4 -työkalupakkia, joka tukee valtavaa määrää erilaisia ​​mikro-ohjaimia, jolla on kehitetty virheenkorjaustyökalujärjestelmä ja jota voidaan käyttää ilmaiseksi luodun koodin koon rajoituksin 32 kilotavua ( mikä itse asiassa on suurin tarkasteltavina oleville mikro-ohjaimille).

Helppo ja nopea aloitus CooCox CoIDEn avulla.

Joten aloitetaan. Siirry viralliselle CooCox-sivustolle ja lataa CooCox CoIDEn uusin versio. Lataaminen edellyttää rekisteröitymistä, rekisteröinti on helppoa ja ilmaista. Asenna sitten ladattu tiedosto ja suorita se.

CooCox CoIDE- Eclipseen perustuva kehitysympäristö, joka tukee STM32:n lisäksi monia muita mikro-ohjainperheitä: Freescale, Holtek, NXP, Nuvoton, TI, Atmel SAM, Energy Micro jne. Jokaisen uuden CoIDE-version myötä mikro-ohjainten luetteloa päivitetään jatkuvasti. Kun CoIDE on asennettu onnistuneesti, suorita:

Näkyviin tulee vaiheen 1 aloitusikkuna, jossa sinun on valittava mikro-ohjaimemme valmistaja. Paina ST ja siirry vaiheeseen 2 (mikro-ohjaimen valinta), jossa sinun on valittava tietty malli. Meillä on STM32F100RBT6B, joten napsauta vastaavaa mallia:

Oikealla näkyy Ohje-ikkuna lyhyet ominaisuudet jokainen siru. Kun olet valinnut tarvitsemamme mikro-ohjaimen, siirrymme kolmanteen vaiheeseen, vaihe 3 - valinta tarvittavat kirjastot töihin:

Tehdään yksinkertainen projekti LEDin vilkkumiseen, kuten on tapana mikrokontrollerien oppimisessa.

Tätä varten tarvitsemme GPIO-kirjaston. Kun se on käytössä, CoIDE pyytää sinua luomaan uusi projekti. Napsauta Kyllä tässä ehdotuksessa, ilmoita kansio, johon projektimme tallennetaan, ja sen nimi. Samanaikaisesti CoIDE yhdistää projektiin 3 muuta kirjaston toiminnan kannalta tarpeellista ja luo myös kaiken tarvittavan projektirakenteen:

Toinen hyvä puoli CoIDEssa on, että sillä on kyky ladata esimerkkejä suoraan kehitysympäristöön. Komponentit-välilehdellä näet, että esimerkkejä on melkein jokaisesta kirjastosta, napsauta GPIO (4 esimerkkiä) ja katso ne:

Voit lisätä siihen omia esimerkkejäsi. Kuten yllä olevasta kuvakaappauksesta näet, esimerkit sisältävät jo koodin GPIO_Blink-LEDin vilkkumiseen. Voit napsauttaa Lisää-painiketta ja se lisätään projektiin, mutta mukana olevana tiedostona, joten teemme sen toisin ja kopioimme yksinkertaisesti koko esimerkkikoodin main.c-tiedostoon. Ainoa asia on korvata tyhjä GPIO_Blink(void) rivi rivillä int main(void). Joten paina F7 (tai valitse valikosta Project->Build) kokoaaksesi projektin ja... ei onnea!

Ympäristö tarvitsee GCC-kääntäjä, mutta meillä ei ole sitä. Mene siksi GNU Tools for ARM Embedded Processors -sivulle, valitse käyttöjärjestelmätyyppi oikealta ja lataa työkaluketjun uusin versio. Sitten suoritamme tiedoston ja asennamme gcc-työkaluketjun. Seuraavaksi osoitamme CoIDE-asetuksissa oikean polun työkaluketjuun:

Paina F7 uudelleen (Project->Build) ja katso, että käännös onnistui:

Jäljelle jää vain mikro-ohjaimen vilkkuminen. Tehdäksesi tämän, milloin USB-apu Yhdistämme levymme tietokoneeseen. Sitten debuggerin asetuksissa sinun on asennettava ST-Link tehdäksesi tämän, valitse valikosta Project->Configuration ja avaa Debugger-välilehti. Valitse ST-Link avattavasta luettelosta ja sulje ikkuna:

Yritetään vilkuttaa MK. Valitse valikosta Flash->Program Download (tai napsauta vastaavaa kuvaketta työkalurivillä) ja katso, että MK on flashed onnistuneesti:

Näemme taululla vilkkuvan LEDin, mielestäni ei ole järkevää tarjota videota tai valokuvaa, koska... kaikki näkivät sen.

Myös CoIDEssa ne toimivat erilaisia ​​tiloja virheenkorjaus, paina CTRL+F5 (tai Debug->Debug-valikossa):

Siinä kaikki. Kuten näet, CoIDEn käyttöönotto ja työskentely on hyvin yksinkertaista. Toivon, että tämä artikkeli rohkaisee sinua tutkimaan erittäin lupaavia ja edullisia STM32-mikrokontrollereita.

Julkaistu 8.9.2016

Mikro-ohjaimet STM32 ovat yhä suositumpia tehonsa, melko monipuolisten oheislaitteiden ja joustavuuden ansiosta. Aloitamme opiskelun käyttämällä budjettitestitaulua, jonka hinta ei ylitä 2 dollaria (kiinalaiselta). Tarvitsemme myös ST-Link ohjelmoija, jonka hinta on noin 2,5 dollaria (kiinalaiselta). Tällaiset kulusummat ovat edullisia sekä opiskelijoille että koululaisille, joten ehdotan aloittamista tällä budjettivaihtoehdolla.


Tämä mikro-ohjain ei ole tehokkain STM32, mutta ei myöskään heikoin. On erilaisia ​​levyjä Kanssa STM32, mukaan lukien Löytö joka maksoi noin 20 dollaria. Tällaisilla levyillä melkein kaikki on sama kuin meidän levyllämme, plus ohjelmoija. Meidän tapauksessamme käytämme ohjelmoijaa erikseen.

Mikro-ohjain STM32F103C8. Ominaisuudet

  • ARM 32-bittinen Cortex-M3-ydin
  • Maksimitaajuus 72 MHz
  • 64KB Flash-muisti ohjelmille
  • 20Kb SRAM-muisti
  • Virtalähde 2,0 … 3,3 V
  • 2 x 12-bittinen ADC (0 ... 3,6 V)
  • DMA-ohjain
  • 37 5V sietävät tulot/lähdöt
  • 4 16-bittistä ajastinta
  • 2 vahtikoiran ajastinta
  • I2C – 2 bussia
  • USART – 3 bussia
  • SPI – 2 bussia
  • Täysinopeus USB 2.0 -liitäntä
  • RTC – sisäänrakennettu kello

Saatavilla STM32F103C8-kortilla

  • Lähtöportit A0-A12, B0-B1, B3-B15, C13-C15
  • Micro-USB jonka kautta voit saada virtaa levylle. Levyssä on 3,3V jännitteenvakain. 3.3V tai 5V teho voidaan syöttää vastaaviin nastoihin levyllä.
  • Painike Nollaa
  • Kaksi jumpperia BOOT0 Ja BOOT1. Käytämme sitä vilkkumisen aikana UART.
  • Kaksi kvartsia 8 MHz ja 32768 Hz. Mikro-ohjaimessa on taajuuskerroin, joten 8 MHz kvartsilla voimme saavuttaa maksimitaajuus ohjain 72MHz.
  • Kaksi LEDiä. PWR– ilmoittaa, että virtaa on syötetty. PC13– kytketty lähtöön C13.
  • Liitin ohjelmoijalle ST-Link.

Joten aloitetaan yrittämällä flash-muistia. Tämä voidaan tehdä USART:n kautta tai ohjelmoijan avulla ST-Link.

Voit ladata laiteohjelmiston testitiedoston. Ohjelma vilkkuu levyn LED-valoa.

STM32-laiteohjelmisto käyttämällä USB-Uart-sovitinta Windowsille

Järjestelmämuistissa STM32 On Käynnistyslatain. Bootloader tallennetaan tuotantovaiheessa ja mikä tahansa mikrokontrolleri STM32 voidaan ohjelmoida käyttöliittymän kautta USART käyttämällä USART-USB-sovitinta. Tällaiset sovittimet valmistetaan useimmiten suosittujen mikropiirien perusteella FT232RL. Liitä ensin sovitin tietokoneeseen ja asenna ohjaimet (tarvittaessa). Voit ladata ajurit valmistajan verkkosivuilta FT232RL– ftdichip.com. Sinun on ladattava ajurit VCP(virtuaalinen com-portti). Ajurien asennuksen jälkeen tietokoneellesi pitäisi ilmestyä virtuaalinen sarjaportti.


Yhdistetään RX Ja TX lähdöt vastaaviin nastoihin USART1 mikro-ohjain. RX liitä sovitin TX mikro-ohjain (A9). TX liitä sovitin RX mikro-ohjain (A10). Koska USART-USB:ssä on 3.3V teholähtöjä, syötämme levylle virran siitä.

Jotta mikro-ohjain asetetaan ohjelmointitilaan, sinun on asetettava nastat BOOT0 Ja BOOT1 V haluttu kunto ja käynnistä se uudelleen painikkeella Nollaa tai sammuta ja käynnistä mikro-ohjain. Tätä varten meillä on neulepuserot. Eri yhdistelmät pakottavat mikro-ohjaimen eri tiloihin. Olemme kiinnostuneita vain yhdestä tilasta. Tätä varten mikro-ohjaimella on BOOT0 siellä pitäisi olla looginen, ja tulos BOOT1– looginen nolla. Taululla tämä on seuraava hyppääjän asento:

Painikkeen painamisen jälkeen Nollaa tai irrottamalla ja kytkemällä virta, mikro-ohjaimen on siirryttävä ohjelmointitilaan.

Firmware-ohjelmisto

Jos käytämme USB-UART-sovitinta, portin nimi on suunnilleen tällainen /dev/ttyUSB0

Hanki sirutiedot

Tulos:

Luimme sirulta tiedostoon dump.bin

sudo stm32flash -r dump.bin /dev/ttyUSB0

Kirjoita sirulle

sudo stm32flash -w dump.bin -v -g 0x0 /dev/ttyUSB0

Tulos:

Stm32flash 0.4 http://stm32flash.googlecode.com/ Käyttäen jäsennintä: Raw BINARY Liitäntä serial_posix: 57600 8E1 Versio: 0x22 Vaihtoehto 1: 0x00 Vaihtoehto 2: 0x00 Laitetunnus: 0x0410 (Medium-b:5) 0 -b:5 RAM käynnistyslatain) - Flash: 128KiB (sektorin koko: 4x1024) - Vaihtoehto RAM: 16b - Järjestelmän RAM: 2KiB Kirjoita muistiin Muistin tyhjentäminen Kirjoitettu ja vahvistettu osoite 0x08012900 (100,00%) Valmis. Aloitetaan suoritus osoitteessa 0x08000000... valmis.

STM32-laiteohjelmisto ST-Link-ohjelmoijalla Windowsille

Ohjelmoijaa käytettäessä ST-Link johtopäätöksiä BOOT0 Ja BOOT1 eivät ole käytössä ja ne on säilytettävä sisällä vakioasento varten normaali toiminta ohjain.

(Kirja venäjäksi)

STM32 merkintä

LaiteperheTuotetyyppiLaitteen alaperhePin-määräFlash-muistin kokoPakettiLämpötila-alue
STM32 =
ARM-pohjainen 32-bittinen mikro-ohjain
F = Yleiskäyttöinen
L = Erittäin pieni teho
TS = Kosketusnäyttö
W = langaton järjestelmä sirulla
60 = monikosketusresistiivinen
103 = suorituskykyviiva
F = 20 nastaa
G = 28 nastaa
K = 32 nastaa
T = 36 nastaa
H = 40 nastaa
C = 48/49 nastat
R = 64 nastaa
O = 90 nastaa
V = 100 nastaa
Z = 144 nastaa
I = 176 nastaa
B = 208 nastaa
N = 216 nastaa
4 = 16 kt Flash-muistia
6 = 32 kilotavua Flash-muistia
8 = 64 kt Flash-muistia
B = 128 kt Flash-muistia
Z = 192 kt Flash-muistia
C = 256 kt Flash-muistia
D = 384 kt Flash-muistia
E = 512 kt Flash-muistia
F = 768 kt Flash-muistia
G = 1024 kt Flash-muistia
I = 2048 kt Flash-muistia
H = UFBGA
N = TFBGA
P = TSSOP
T = LQFP
U = V/UFQFPN
Y = WLCSP
6 = Teollisuuden lämpötila-alue, –40…+85 °C.
7 = Teollisuuden lämpötila-alue, -40…+ 105 °C.
STM32F103 C8 T6

Kuinka poistaa kirjoitus-/lukusuojaus?

Jos sait levyn, jossa on STM32F103, mutta ohjelmoija ei näe sitä, tämä tarkoittaa, että kiinalaiset ovat suojanneet mikro-ohjaimen Flash-muistin. Kysymys "miksi?" jätetään se huomioimatta. Eston poistamiseksi yhdistämme UART-sovittimen ja ohjelmoimme sen kautta. Asetamme jumpperit ohjelmointia varten ja mennään:

Teen tämän Ubuntusta käyttämällä stm32flash-apuohjelmaa.

1. Tarkista, onko mikro-ohjain näkyvissä:

Sudo stm32flash /dev/ttyUSB0

Sinun pitäisi saada jotain tällaista:

Stm32flash 0.4 http://stm32flash.googlecode.com/ Liitäntä serial_posix: 57600 8E1 Versio: 0x22 Vaihtoehto 1: 0x00 Vaihtoehto 2: 0x00 Laitetunnus: 0x0410 (Keskitiheys) - RAM-muistia: - 510KbloaderB: 2:10K 128KiB (sektorin koko: 4x1024) - Vaihtoehtoinen RAM: 16b - Järjestelmän RAM: 2KiB

2. Poista lukusuojaus ja sitten kirjoitussuojaus:

Sudo stm32flash -k /dev/ttyUSB0 stm32flash 0.4 http://stm32flash.googlecode.com/ Liitäntä serial_posix: 57600 8E1 Versio: 0x22 Vaihtoehto 1: 0x00 Vaihtoehto 2: 0x00 Laitetunnus1:0Bdenity: 0xidium Käynnistyslataimen varaama 512b) - Flash: 128KiB (sektorin koko: 4x1024) - Vaihtoehto RAM: 16b - Järjestelmän RAM: 2KiB Luku-Suojauksen poistaminen Flash valmis.

sudo stm32flash -u /dev/ttyUSB0 stm32flash 0.4 http://stm32flash.googlecode.com/ Liitäntä serial_posix: 57600 8E1 Versio: 0x22 Vaihtoehto 1: 0x00 Vaihtoehto 2: 0x00 Laitetunnus1:0Bdenity: 0xidium Käynnistyslataimen varaama 512b) - Flash: 128KiB (sektorin koko: 4x1024) - Vaihtoehto RAM: 16b - Järjestelmän RAM: 2KiB Kirjoitussuojauksen estävä flash Valmis.

Nyt voit työskennellä normaalisti mikro-ohjaimen kanssa.

Mikro-ohjaimet kissanpennuille

Miau kaikki, kissat :)

Eräänä päivänä kissa jätti minut: (No, miksi syödä valeriaanaa, päätin ryhtyä töihin niin sanotusti "isänmaan parhaaksi". Olen pitkään halunnut osallistua digitaalisiin laitteisiin, mutta ei ollut aikaa (joko nukkua tai kissan kanssa kävelyllä katoilla), ja nyt se aika on ilmestynyt..)

Kuten tavallista, kaikki alkaa valinnasta. No, näyttää siltä, ​​​​että valinta on pieni PIC tai AVR. Jotenkin pidin jälkimmäisestä enemmän. Tarvitsin myös USB-ohjelmoijan, koska koneessa ei ollut muita portteja, jonka hinta melkein sai hännän irti. Siellä on myös Arduino - sellainen peto. Se voidaan myös ohjelmoida USB:n kautta. Luulen, että "juuri mitä lääkäri määräsi". Kylässämme sen saa vain verkkokaupan kautta. Löysin paremman tarjouksen, melkein ostin sen ja... OOP! Etsin - STM32VL-Discovery. Mikä eläin tämä on? Hmm, STM32.. Kuulin jotain korvani kulmasta.. Ja ominaisuudet saavat viikset pystyssä, rehellisesti!

Ja hänellä on niin monta tassua!

  • Arduinossa on 14 digitaalista I/O-porttia ja 6 analogista tuloa. STM32VL-Discoveryssa on 45 digitaalista tuloa/lähtöä, joista 10 voidaan valinnaisesti muuntaa analogisiksi tuloiksi.
  • Arduinossa on 32 kt ohjelmatallennustilaa ja 2 kt RAM-muistia. STM32VL-Discoveryssa on 64 kt ohjelman tallennustilaa ja 8 kt RAM-muistia.
  • Arduinosta kellotaajuus STM32VL-Discoveryssa on 16 MHz ja 24 MHz.
  • Mikä tahansa STM32-mikro-ohjain voidaan korvata toisella STM32:lla, mutta parhaat ominaisuudet, muuttamatta järjestelmää
  • STM32 voidaan ohjelmoida ilman ohjelmoijaa COM-portti(tästä lisää vähän myöhemmin)
  • Arduinon hinta kirjoitushetkellä on ~1300 ruplaa, STM32VL-Discovery ~600 ruplaa. Tämä on yli 2 kertaa halvempi!

Mitä seuraavaksi? STM32VL-Discoveryssa on sisäänrakennettu ohjelmoija/debuggeri, joka pienellä käpälän liikkeellä (hyppylevyt irrottamalla) voi ohjelmoida ja debugata (virheenkorjaus on erittäin hyödyllinen asia, mutta siitä lisää myöhemmin) STM32-mikrokontrollereita kortin ulkopuolella. Tämä ei toimi Arduinon kanssa. Eli käyttämällä STM32VL-Discoveryä säästämme rahaa ja lisäämme tuottavuutta ja luovaa vapautta :)

Ja itse STM32-mikro-ohjaimet näyttävät houkuttelevammilta kuin muut:

STM32F100C4T6B ATtiny24A-SSU PIC16F688-I/SL STM32F103RET6 ATmega1284P-PU PIC18F4550-I/PT
Keskihinta, hiero 60 65 60 240 330 220
Kellotaajuus, MHz 24 20 20 72 20 48
Flash-muisti, KB 16 2 4 512 128 16
RAM, tavu 4096 128 256 65536 16384 2048
USART, kpl. 2 0 0 5 2 0
SPI, kpl. 1 1 0 3 1 1
ADC, kpl. 16x12 bittiä 8x10 bittiä 8x10 bittiä 16x12 bittiä 8x10 bittiä 13x10 bittiä
DAC, kpl. 1x12 bittiä 0 0 2x12 bittiä 0 0
Tulo/lähtölinjojen lukumäärä, kpl. 37 12 12 51 32 35

Ja STM32 on 32-bittinen, mikä tarkoittaa, että se voi toimia 32-bittisen tiedon kanssa yhdessä kellojaksossa. AVR ja PIC eivät voi ylpeillä tästä.

No, kissat, oletteko varmoja? Aloitetaan sitten nuoren digitaalisen soturin kurssi!)

Miten se toimii? Mistä se koostuu? Mitä hän voi tehdä?

Kuten tiedät, kaikki kissat ovat erittäin uteliaita, ja erityisesti radiokissat!

Mikro-ohjain on mikropiiri, joka yhdistää prosessorin, oheislaitteiden toiminnot ja jossa on RAM-muistia ja flash-muistia. Kuten tietokone, vain pienempi!

Tehdään analogia: tietokonetta ohjataan käyttöjärjestelmä, ja mikro-ohjain on kirjoittamasi "laiteohjelmisto"; tietokoneen käyttöjärjestelmä on tallennettu kiintolevylle, mikro-ohjaimen "laiteohjelmisto" on tallennettu sen flash-muistiin; RAM-toiminnot ovat samanlaisia ​​- muuttuvien tietojen tallentaminen ohjelman suorittamisen aikana. Ja MK:ssa on myös erilaisia ​​oheislaitteita, kuten esimerkiksi ADC ja DAC.

MK kommunikoi ulkomaailman kanssa vartalollaan olevilla tassuilla (ei tietenkään kuten kissoilla, vaan metallisilla). Mutta kaikkia niitä ei ohjaa ohjelma, on virtanastat, nollausnasta, oheislaitteiden virtanastat, varavirtaa. Ja ne, joita ohjelma hallitsee, on jaettu ryhmiin, joita kutsutaan "porteiksi". Kaikki nämä ohjatut lähdöt on nimetty kahdella kirjaimella ja numerolla. Esimerkiksi PA1: P - portti, A - portti "A", 1 - tämän portin pin-numero.

Ohjelmassa portit konfiguroidaan joko tuloksi tai ulostuloksi, kuten haluat.

Tuloa varten määritetyn portin nastat voivat olla sisään erilaisia ​​tiloja, jokaiselle ulostulolle se voi olla erilainen:

  • Digitaalitulo on tulo, jonka arvo (looginen 1 tai 0) voidaan lukea ohjelmalla. Jos jännite tulossa on 0, niin arvo on 0, jos jännite tulossa on yhtä suuri kuin syöttöjännite, niin tuloarvo on 1. Kolmannesta ei anneta. Voidaan tehdä vetovastuksen avulla joko tehoon tai maahan
  • Analoginen tulo - tulo, jonka arvon ohjelma pystyy lukemaan, mutta arvoja voi olla monia - jopa 4096. Tarkemmin sanottuna 0:sta, jos tulojännite on 0 suhteessa mikrokontrollerin miinusvirtalähteeseen, arvoon 4095 jos tulojännite on yhtä suuri kuin syöttöjännite. Kaikki nämä muunnokset tehdään ADC - analogia-digitaali-muuntimella, jonka avulla voit esimerkiksi mitata termistorin jännitettä ja selvittää lämpötilan tai mitata jännitettä valovastuksessa ja selvittää kirkkauden. siihen putoavasta valosta... No, voi keksiä monia asioita, jos on mielikuvitusta :) Jos mikro-ohjain saa virtaa 3V:sta, niin 0V = 0 ja 3V = 4096, mikä tarkoittaa 3/4096 = 0,000732421 , eli kun syöttöjännite muuttuu 0,000732421V, ohjelman tuloarvo muuttuu 1:ksi. Se ei ole niin monimutkaista, eikö? Jatketaan
  • Digitaalinen tulo vaihtoehtoisessa toimintatilassa - tulo oheislaitteiden kanssa työskentelemiseen. Esimerkiksi tulo ajastimelle tai tulo jollekin rajapinnalle. Tämän tulon arvoa ei voida lukea ohjelmasta. Esimerkiksi ohjelmassa voit lukea tästä lähdöstä jonkin liitännän kautta vastaanotettuja tietoja.

Ja lähtöä varten määritetyssä portissa voi olla nastat seuraavissa tiloissa:

  • Poistu. Vain tie ulos. Tavallinen digitaalinen lähtö. Nastassa on joko syöttöjännite (looginen 1) tai nastassa ei ole jännitettä (looginen 0). Se on yksinkertaista.
  • Lähtö vaihtoehtoisessa toimintatilassa - oheislaitteiden ohjaama lähtö. Tätä lähtöä ei voi ohjata ohjelmasta, mutta ohjelma voidaan pakottaa ohjaamaan tätä lähtöä, esimerkiksi rajapinta.

Mutta kaikkia johtopäätöksiä ei voida määrittää "kuten haluat". Saadaksesi selville, mikä on mahdollista ja mikä ei, sinun on katsottava dokumentaatiota (taulukko 4) tai käytettävä MicroXplorer-ohjelmaa.

Ennen kuin käytät porttia, sinun on ensin kellotettava se - lähetä kellopulsseja siihen, koska aluksi niitä ei toimiteta energian säästämiseksi. Voit valita eri kellotaajuuden - mitä korkeampi taajuus, sitä nopeammin tämän portin tulot tai lähdöt toimivat, mutta myös sitä suurempi energiankulutus.

Siitä on myös päätelmiä BOOT 0 Ja BOOT 1. Nämä nastat eivät kuulu portteihin, niitä käytetään ohjaamaan mikro-ohjaimen kuormitusta. Jos virransyötön aikana BOOT 0 -nastassa on looginen nolla (nasta on kytketty yhteiseen pisteeseen), niin mikro-ohjain suorittaa flash-muistiin ladatun ohjelman, ts. Laiteohjelmistosi. Jos virtaa syötettäessä BOOT 0 -nasta on looginen ykkönen (nasta on kytketty mikro-ohjaimen virtalähteeseen) ja BOOT 1 -nasta on looginen nolla, mikro-ohjain ei suorita laiteohjelmistoasi, vaan käynnistyslatain, joka on tallennettu tehdas. Muista tämä! Käytät tätä paljon, kun työskentelet STM32-mikro-ohjainten kanssa! Joskus ladataan tehtaalla tallennettua käynnistyslatainta - ainoa tapa kirjoittaa/vaihtaa mikro-ohjaimen laiteohjelmistoa. Tämä tapahtuu esimerkiksi määritettäessä laiteohjelmistoon nastat, joihin ohjelmoija on kytketty, tai kun mikro-ohjaimen laiteohjelmisto flash-muistia ilman ohjelmoijaa. Niin suosittelen lämpimästi Kun suunnittelet piirilevyä, aseta nämä nastat (tai vähintään BOOT 0) sopivaan paikkaan.

Joten keksimme sen :) Nyt tiedämme mikä mikro-ohjain on ja mistä se koostuu. Nyt opimme lisää viisautta ja siirrymme mielenkiintoisimpaan asiaan - harjoitteluun!

Mikrokontrollerissa oleva ohjelma suoritetaan askel askeleelta. Yksi prosessorijakso on yksi ohjelman vaihe.

Anna esimerkiksi punaisen ja vihreän valon vilkkua, kunnes painiketta painetaan. Kunkin lampun kesto on 5 sekuntia. Tässä on algoritmi:

  1. Katsotaan onko painikkeella jännitettä tulossa? (painike sulkee mikrokontrollerin lähdön + virtalähteeseen)
  2. Jos jännitettä ei ole, niin punainen valo syttyy 5 sekunniksi, vihreä valo sammuu, jos on jännite, aloitamme kaikki alusta
  3. Tarkistetaan uudelleen
  4. Jos jännitettä ei ole, niin vihreä valo syttyy 5 sekunniksi, punainen valo sammuu, jos on jännite, aloitamme kaikki alusta
  5. Aloitetaan alusta

STOP! Entä jos painan painiketta valon palaessa? Mitään ei tapahdu! Koska ohjelma suoritetaan askel askeleelta ja painikkeen painalluksen tarkistusvaihe on hehkulamppujen vaihtohetkellä.
Juuri tällaisia ​​tapauksia varten on olemassa sellainen asia kuin keskeyttää

Keskeytykset mahdollistavat pääohjelman suorittamisen keskeyttämisen. Tämä voi tapahtua joko ulkoisella tapahtumalla (napin painaminen, painikkeen vapauttaminen, tiedon vastaanottaminen jne.) tai sisäisellä (ajastimella tai esimerkiksi on aika ruokkia kissa). Kun juuri tämä keskeytys tapahtuu, aliohjelma alkaa suorittaa. Aliohjelmat voivat olla erilaisia ​​erityyppisille keskeytyksille, näitä aliohjelmia kutsutaan keskeytyskäsittelijät.

Kun tämä sama keskeytyskäsittelijä lopettaa työnsä, pääohjelma alkaa suorittaa paikasta, jossa se keskeytettiin.

Noustaan ​​jaloillemme!

No, kissanpennut, on aika nousta tassuille! Toivottavasti sinulla on jo debug board? Tai ainakin mikrokontrolleri? Toivottavasti on :) Ja jos ei, niin sitten juostaan ​​kauppaan! (eikä mielellään makkaralle. Vaikka...) Mitä tämä opetus on ilman harjoittelua?

Aluksi on hienoa saada debug board, esimerkiksi STM32VL-Discovery, mutta jos rupikonna kuristaa tai makkaralle ei vieläkään riitä, niin pärjää yhdellä mikro-ohjaimella ja RS-232 -> UART-liitännällä. muunnin (esim. MAX3232) tai USB -> UART (esim. FT232RL). Tässä tapauksessa 100 ruplaa voidaan tehdä kokonaan, mutta sinun on tehtävä piirilevy ja juotettava vähintään 48 nastaa, joiden leveys on 0,3 mm, 0,2 mm:n raolla. Varoitin sinua.

Ensin sinun on luonnollisesti liitettävä virheenkorjauskortti tai -ohjain tietokoneeseen.

Jos sinulla on kehityslautakunta:

Viankorjauslevyllä se on tietysti helpompaa. Otamme Mini-USB-johdon ja yhdistämme levyn tietokoneeseen, kaikki ajurit tulisi asentaa automaattisesti. Katso STMicroelectronics STLink dongle laitehallinnassa - hyvä merkki! No, jos jokin meni pieleen ja mikään ei toiminut, sinun ei tarvitse naarmuttaa sohvaa, sinun tarvitsee vain tulla tänne asentamaan STM32 ST-LINK-apuohjelma.

No, jos olet Windows 8 -tietokoneen onnellinen omistaja, sinun on suoritettava seuraavat toimet ennen yllä olevien vaiheiden suorittamista: Vaihtoehdot -> Muuta tietokoneen asetuksia -> Kenraali -> Erityiset latausvaihtoehdot ja valitse vaihtoehto Kuljettajan allekirjoituksen vahvistus poistetaan käytöstä.

Jos sinulla on mikro-ohjain:

Jos sinulla on yksi mikro-ohjain, sinulla on oltava suorat jalat. Mutta en epäile sinua!

Ennen kuin mikro-ohjain kytketään tietokoneeseen, se on juotettava piirilevyyn. Tätä varten tarvitset mikro-ohjaimen ja suorien tassujen lisäksi ainakin piirilevyn. Ja sitten on sinun luovuutesi.

Työminimi alla olevassa kaaviossa:

Mutta tämä on kiinnostamaton minimi.

Lisää LEDit ja painikkeet (älä unohda BOOT-nastat) näin

Mutta tämän kirppun juottamisessa voi olla ongelmia. Mutta toivottavasti niitä ei synny. Päädyin juottamaan sen suosikkini Neuvostoliiton 25 W juotosraudallani, jonka kärjen leveys oli 3/4 ohjaimen leveydestä. Olen lisää ongelmia painetun piirilevyn valmistuksessa... no, jokaisella on oma tekniikkansa.

Ja sovitin on tehtävä UART:lle ostamasi mikropiirin dokumentaation mukaan.

Yhdistämme piirilevyn TxD- ja RxD-nastat sovittimen RxD- ja TxD-nastoihin, vastaavasti. Älkäämme unohtako kaiken yhteistä asiaa ja ravintoa.

Ohjelmiston valinta ja asennus

Käytämme kehitysympäristöä CooCox IDE, mutta tämä ei ole vain niin, vaan useista syistä:

  • Ensinnäkin se on vapaasti levitettävä ohjelmisto. Tämä tarkoittaa, että karmasi on puhdas
  • Mielestäni (eikä vain minun) tämä kehitysympäristö on muita kätevämpi
  • Mahdollistaa virheenkorjauksen käytön
  • Paljon esimerkkejä, jotka voidaan ladata kehitysympäristöön (hyödyllinen kissanpennuille ja muille)

Kehitysympäristö on koodausohjelma, kääntäjä ja virheenkorjaus yhdessä. Kätevää :) Mutta jos joku ankara Tšeljabinskin kissa on mukavampi kirjoittaa koodia (esimerkiksi muistilehtiöön), kääntää ja vilkkua eri ohjelmilla - ei minua haittaa, tarvitset STM32 ST-LINK -apuohjelman laiteohjelmiston lataamiseen mikro-ohjaimeen. Omistaja on herrasmies, kuten he sanovat.

Tämä kehitysympäristö perustuu tunnettuun Eclipseen.

  1. Mennään tänne
  2. Pistelee Lataa CoCenterin kautta (suositellaan)
  3. Anna sähköpostiosoitteesi (ei hätää, se on siellä "esitystä varten")
  4. Lataamisen jälkeen asenna tämä CoCenter
  5. Ensimmäisellä rivillä, jossa lukee CooCox CoIDE pistää Lataa
  6. Kun lataus on valmis, sen sijaan Lataa tahtoa Asentaa. Klikkaa tästä
  7. Mennään tänne
  8. Aivan kolumnissa Lataa lataa se tiedosto .exe. Asennataan se.
  9. Avaamme sen itse CooCox CoIDE, välilehti Projekti, Valitse Työkaluketjun polku.
  10. Osoitamme polun tiedostoon arm-none-eabi-gcc.exe (asensimme tämän vaiheessa 8, polku on suunnilleen seuraava: D: Ohjelmatiedostot (x86) GNU Tools ARM Embedded4.7 2013q1bin)
  11. Avataan taas COIDE, paina Näytä -> Kokoonpano, avaa välilehti Debuggeri ja me teemme tämän [kuva]
  12. Olemme iloisia, koska nyt voimme kirjoittaa ohjelman ja flash sen mikrokontrolleriin! Niin me teemme.

Jos sinulla on vaihtoehto ilman virheenkorjauslevyä/ohjelmoijaa, tarvitset ohjelman ladataksesi ohjelman MK:hen Flash Loader Demonstrator joka sijaitsee

Me löydämme yhteinen kieli

Ennen kuin kirjoitat ensimmäisen ohjelman, sinun on löydettävä yhteinen kieli MK:n kanssa. On epätodennäköistä, että hän oppii kieltämme, joten meidän on opittava (tai ehkä vain muistettava) kieli, jolla kommunikoimme MK: n kanssa, tämä on C. Tarvitsemme vain perusasiat (ohjelman kokoonpano, funktiot, operaattorit). Jos osaat tämän kielen, voit siirtyä heti kohtaan "Ensimmäinen ohjelma", mutta tuon ne, jotka eivät osaa, ajan tasalla.

Projekti koostuu tiedostoista, joiden pääte on .c Ja .h. Ensimmäinen sisältää funktiot, toinen esimerkiksi käytettyjen funktioiden nimet ja vakiot. Näin se on. Tärkein ohjelmakoodin sisältävä tiedosto main.c. käyttää erilaisia ​​toimintoja sinun on sisällytettävä nämä toiminnot sisältävät kirjastot. Ne muodostavat yhteyden tallentamalla #include "kirjaston_nimi" No, kirjastojen pitäisi luonnollisesti olla mukana projektissa. Ne sisältyvät tiedoston alkuun.

Toiminnot ovat ainutlaatuinen osa ohjelmaa. Yleensä ohjelma koostuu yhdestä tai useammasta funktiosta. Toiminto näyttää tältä:

paluumuuttujan_tyyppi funktion_nimi (muuttujan_tyyppi)
{
Toimintorunko
}

Voit lähettää funktiolle muuttujan, funktio käsittelee sen ja palauttaa arvon. On erittäin kätevää käyttää funktiota toistuviin toimiin sen sijaan, että kirjoitat jatkuvasti samaa koodinpätkää. Voit yksinkertaisesti lähettää muuttujan funktiolle ja vastaanottaa käsitellyn arvon.

Ennen kuin voit käyttää funktiota, se on ilmoitettava aivan tiedoston alussa. He tekevät sen näin:

paluumuuttujan_tyyppi funktion_nimi (muuttujan_tyyppi);

Ai niin, unohdin tärkeimmän! Jokaisen rivin lopussa on oltava puolipiste!

Jos toiminto ei palauta mitään (esimerkiksi aikaviive, se vain vetää kissaa hännästä ajoissa), tyyppi ilmoitetaan mitätön.

Käynnistettäessä toiminto suoritetaan aina ensin pää().

No, olemme ilmeisesti keksineet toiminnot, ymmärtäminen tulee vasta harjoituksen myötä.

edellä mainitsin muuttuva tyyppi. Kaikki muuttujat voivat olla erityyppisiä, tässä ovat tärkeimmät:

  • INT - tämän tyyppinen muuttuja voi olla vain kokonaisluku -2147483648 - 2147483647
  • FLOAT - tämän tyyppinen muuttuja on luku, jonka tarkkuus on enintään 7 numeroa ±1,5*10-45 - ±3,4*1033
  • DOUBLE - numero, jonka tarkkuus on jopa 16 numeroa ±5*10-324 - ±1,7*10306
  • ULONG on myös kokonaisluku, mutta välillä 0 - 18446744073709551615
  • PITKÄ - kokonaisluku välillä -9223372036854775808 - 9223372036854775807
  • CHAR - yksi merkki
  • BOOL on looginen muuttuja. Sillä voi olla vain 2 arvoa: tosi tai epätosi.

Merkkijono (sana, lause) voidaan esittää merkkijonona tyyppi char. Esimerkiksi:

char string = "Sana";

Tässä hakasulkeet ovat merkkien lukumäärä rivillä, "stroka" on taulukon nimi.

Ennen muuttujan käyttöä se on ilmoitettava. (määritä vain muuttujan tyyppi ja nimi)

  • + - lisäys.
  • - -vähennys.
  • * - kertolasku.
  • / -jako.
  • = - arvon antaminen muuttujalle.

Esimerkiksi ilmaisu a=b+c tarkoittaa muuttujan määrittämistä a muuttujien arvojen summan arvo b Ja c.

  • ++ - lisäys. Kasvata muuttujan arvoa yhdellä
  • -- -vähennys. Muuttujan arvon pienentäminen 1:llä

Esimerkiksi ilmaisu a++ tarkoittaa muuttujan arvon kasvattamista a 1:llä (sama kuin a=a+1)

  • == - vertailu, yhtäläisyysmerkki. (EI SEKÄ SEKÄ TEHTÄVÄKSI)
  • != - vertailu, "ei tasa-arvo" -merkki.
  • < - vertailu, "vähemmän kuin" -merkki.
  • <= - vertailu, "pienempi tai yhtä suuri" -merkki.
  • > - vertailu, "lisää"-merkki.
  • >= - vertailu, "suurempi tai yhtä suuri" merkki.

Esimerkiksi ilmaisu a tulee tosi, jos muuttujan arvo a pienempi kuin muuttujan arvo b ja epätosi, jos arvot ovat samat tai a lisää b. Ilmaisu a==b totta jos a on yhtä suuri b ja väärä jos a ei tasa-arvoinen b, MUTTA ilmaisu a=b totta Aina koska se ei ole vertailu, se on muuttujan osoitus a muuttuvat arvot b.

  • % - divisioonan loppuosa

Esimerkiksi jos a = 5,b = 3, sitten lausekkeen arvo a%b on yhtä suuri kuin 2 (koska 5/3 = 1 (jäljellä 2))

  • << - bittikohtainen siirto vasemmalle. Menemättä yksityiskohtiin ilmaisun merkitys a< C-kielessä se on yhtä suuri kuin lauseke a*2 b
  • >> - bitti kerrallaan oikealle. Ilmaisu a >> b ohjelmassa vastaa lauseketta a/2 b
  • & -loogista JA.
  • | -loogista TAI.
  • ~ - inversio.

Melkein unohdin kertoa sinulle syklistä. Perus:

kun (kunto) (

silmukan runko

Silmukan runko (kaikki sisällä kiharat olkaimet) suoritetaan, kun ehto on tosi (kunnes ehdosta tulee epätosi).

for (alkuarvo; silmukka_suoritettu_kunnes, vaihe) (

silmukan runko

Alkuarvo- laskurin alkuarvo

Loop_executes_until - Silmukka toimii, kunnes mikä arvo saavutetaan

Vaihe - missä askelissa laskuri laskee?

Esimerkiksi

for (i=0; i<10, i++) {

silmukan runko

Tässä on muuttujan alkuarvo i on yhtä kuin 0, silmukka jatkuu muuttujan arvon saakka i alle 10, joka kerta kun silmukka suoritetaan muuttujalle i 1 lisätään. Voit myös muuttaa muuttujan arvoa suoraan silmukassa.

jos (ehto)(

runko 1

) muu (

runko 2

Ehdollisessa siirrossa "body 1" suoritetaan, jos ehto on tosi, ja "body 2" suoritetaan, jos ehto on epätosi. On myös tämä vaihtoehto:

jos (ehto 1)(

) muuten jos (ehto 2) (

Tässä tapauksessa "body 1" suoritetaan, jos "ehto 1" on tosi, "body 2" suoritetaan, jos "ehto 2" on tosi. Tällaisia ​​ehtoja voi olla mikä tahansa määrä, ja voi olla myös yksi muu.

Ehdot voivat olla yksinkertaisia ​​ja yhdistettyjä: yksinkertainen - yksi looginen lauseke ja yhdiste - useita loogisia lausekkeita, jotka on yhdistetty &-merkillä (ehdot ovat tosi, kun kaikki tällä merkillä yhdistetyt ehdot ovat tosia) tai | (ehto on tosi, jos ainakin yksi tällä merkillä yhdistetty ehto on tosi).

Toinen hyödyllinen asia on kommentit. Ne auttavat sinua selvittämään unohdetun projektin :) tai vain, jotta et unohda jotain. Voit kommentoida joko merkkien jälkeen // ja rivin loppuun tai alkaa merkeillä /* ja loppu */ , tässä tapauksessa kommentti voi olla kuinka monta riviä tahansa. Kommentit eivät vaikuta ohjelman kokoon.

No, siinä taitaa olla kyse perusasioista. Riittää ensimmäisellä kerralla (artikkelin seuraavan osan kirjoittamiseen asti)

Ensimmäinen ohjelma

Älä poikkea perinteistä (muuten et koskaan tiedä) ja aloita Hello Worldistä. Ja matkan varrella jatkamme mikro-ohjaimeen tutustumista ja kokemuksen saamista niin sanotusti.

Avaa kehitysympäristö:

Napsauta Selaa arkistossa

Valita ST

Sitten näemme luettelon yhdistetyistä kirjastoista.

Yksinkertaista ohjelmaamme varten tarvitsemme: CMSIS-ydin, CMSIS-käynnistys, RCC, GPIO.

Kirjastot CMSIS-ydin Ja CMSIS-käynnistys - järjestelmät, ne on kytkettävä

Kirjasto RCC ajastusjärjestelmän kanssa työskentelemiseen

Kirjasto GPIO I/O-porttien kanssa työskentelyyn

Nyt vasemmalla ikkunassa Projekti avaa tiedosto main.c.

Ensin meidän on yhdistettävä kirjastomme (CMSIS:ää ei tarvitse yhdistää).

Siirrymme ohjelman alkuun ja lisäämme rivit:

#include "stm32f10x_gpio.h"
#include "stm32f10x_rcc.h"

mitätön viive(int i) (
varten (; i != 0; i--);
}

Niin. Tässä järjestyksessä funktio ei palauta mitään, joten mitätön, funktion nimi Viive, ilmoittaa muuttuja välittömästi i tyyppi int. Aaltosulkeissa funktion runko on silmukka varten. Tämä on hänen rivinsä. Alkuarvo i emme vaihda, silmukka jatkuu kunnes i ei ole yhtä kuin nolla (kuten i muuttuu nollaksi, sykli pysähtyy, toiminto "sammutetaan"). Jokaisen silmukan rungon (syklin) suorituksen yhteydessä muuttuja i pienenee 1. Eli Syklin ydin on yksinkertaisesti toistaa itseään yhtä monta kertaa i. Kun silmukka on käynnissä, aika kuluu, viive tapahtuu.

Mikä portti on vastuussa mistäkin lähdöstä, löytyy MK:n dokumentaatiosta:

Lisää kelloporttiin C rivi:

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC , PÄÄLLÄ);

Lisää rivi ohjelmaan:

GPIO_InitTypeDef GPIO_Init1;

Tällä rivillä julistimme rakenteen GPIO_InitTypeDef- antoi sille nimen GPIO_Init käytettäväksi ohjelmassamme edelleen.

Mitä parametreja tässä rakenteessa voidaan konfiguroida ja missä muodossa ne ovat, katsomme kaikkea samalla tavalla stm32f10x_gpio.h:

Nyt, jotta voit määrittää pin-parametrit rakenteen avulla, sinun on kirjoitettava sen nimi, laitettava piste ja näkyviin tulee ikkuna, jossa nämä parametrit ilmoitetaan

Kaksoisnapsauta yhtä niistä, ja se ilmestyy riville ja laita sitten = (määritä) ja kirjoita arvo alkaen stm32f10x_gpio.h

Teemme samoin kaikilla parametreilla. Älä unohda jokaisen rivin lopussa olevaa puolipistettä!

GPIO_Init(GPIOC , &GPIO_Init);

Nyt räpyttelemme! Vilkumme syklisesti, teemme silmukkaa samalla kun. Jakson ehto on 1. Yksi on aina tosi, nolla on aina epätosi... siinä se c'est la vie...

Jos haluat käyttää virtaa ulostuloon, sinun on asetettava ulostulo pois päältä, sinun on nollattava bitti. Miten se tehdään - kaikki on sama stm32f10x_gpio.h:

Teemme näin:

kun (1)(

GPIO_SetBits(GPIOC, GPIO_Pin_9);

Viive (200 000);

GPIO_ResetBits(GPIOC, GPIO_Pin_9);

Viive (200 000);

1 on aina tosi, mikä tarkoittaa, että silmukka kiertää.

GPIO_SetBits - bitin asetustoiminto

GPIO_ResetBits - bitin palautustoiminto

Viive (200000) - tällä rivillä ohjelman suoritus siirtyy funktioon Viive, sama, jossa sykli varten. Suluissa oleva luku 200000 välitetään tälle funktiolle muuttujana i. (muista rivi mitätön viive (int i)?) ja sama silmukka suoritetaan tässä funktiossa, kaikki 200 000 kertaa. Se on nopea :) syklin päätyttyä varten toiminto DElay lopettaa työnsä, koska hän mitätön, se ei palauta mitään ja ohjelma jatkaa suorittamista.

Koska samalla kun on silmukka, sitten LED päällä, viive, LED pois, viive suoritetaan loputtomana silmukana. Kunnes virta katkeaa tai katkeaa (lisätietoja seuraavassa artikkelissa).

No, ensimmäinen ohjelma on valmis. Paina nyt F7, ohjelma käännetään.

Jos sinulla on virheenkorjauskortti, liitä se USB-johdolla ja paina Lataa koodi Flashiin. Olemme tyytyväisiä tehtyyn työhön ja saatuun tietoon :)

Ja jos sinulla ei ole virheenkorjauskorttia, liitä aiemmin tehty sovitin korttiisi ja sovitin tietokoneen COM-porttiin. Liitä seuraavaksi lähtö BOOT 0 mikro-ohjaimen positiivisella virtalähteellä ja kytke mikro-ohjaimen virta päälle. Tämä saa mikro-ohjaimen siirtymään laiteohjelmistotilaan. Yleensä laiteohjelmistoprosessi ei ole monimutkainen. Sinun tarvitsee vain seurata sovelluksen ohjeita Flash Loader Demonstrator. Ilmoita ensin sen COM-portin numero, jonka kautta mikro-ohjain on kytketty, ja nopeus. Vikojen välttämiseksi on parempi valita pienempi nopeus

Jos ohjelma näkee mikro-ohjaimesi, näkyviin tulee ikkuna, johon kirjoitetaan, kuinka paljon muistia sillä on.

Kun napsautat "Seuraava", näet muistin osoitesivun. Emme tarvitse sitä.

Seuraava askel on tärkein. Voit valita muistin tyhjennyksen tai laiteohjelmiston

Valitse laiteohjelmistoa varten Lataa laitteeseen ja kentällä Lataa tiedostosta valitse käännetty .hex-tiedosto, joka sijaitsee kansiossa CooCox -> CooIDE -> työtila -> projektin_nimi -> projektin_nimi -> Debug -> Bin. Napsauta sitten "Seuraava" uudelleen.

Kun näemme tämän ikkunan:

Katkaise virta mikro-ohjaimesta ja sulje Flash Loader Demonstrator, irrota sovitin ja kytke mikro-ohjain päälle normaali tila(Kun kun se on päällä pin BOOT 0 on kytketty mikro-ohjaimen miinusvirtalähteeseen). Me iloitsemme!

Joten, nyt tiedämme, miksi STM-mikro-ohjaimet ovat parempia kuin muut, tiedämme kuinka mikro-ohjain toimii, tiedämme kuinka mikro-ohjain flash-kortilla ja kortillamme, tiedämme C-kielen perusasiat, joita tarvitaan ohjelmointiin. STM32, olemme saaneet kokemusta työskentelystä mikrokontrollerin kanssa (toivottavasti positiivista) ja tärkeintä on, että nyt voit toteuttaa ideasi digitaaliset laitteet elämään (ja kerro niistä rakkaassa RadioKotissamme)! Ne voivat silti olla yksinkertaisia, mutta kaikki syntyy kokemuksesta. Ja seuraavissa artikkeleissa yritän puhua ADC:istä, DAC:ista, keskeytyksistä, virheenkorjauksen käytöstä ja muista hyödyllisistä asioista.

Mitä mieltä olet tästä artikkelista?

ST-Link/V2 erityinen laite ST:n kehittämä STM8- ja STM32-sarjan mikro-ohjainten virheenkorjaus ja ohjelmointi. Voit lukea itse laitteesta ST-yhtiön verkkosivuilta.

Sen pääominaisuudet:

    5V ulostulo laitteen virtalähteeksi

    USB 2.0 nopea liitäntä

    SWIM-, JTAG-/sarjajohdon virheenkorjausliitännät (SWD).

    SWIM-tuki hitaille ja suurille nopeuksille

    SWD- ja sarjajohtokatselu (SWV)

    Mahdollisuus laiteohjelmiston päivitys

Koska STM32-mikro-ohjaimet on rakennettu ARM Cortex -ytimeen, jossa on SWD-virheenkorjausliittymä, ST-Linkin avulla voit ohjelmoida ja korjata muita 32-bittisiä ARM-Cortex-pohjaisia ​​mikro-ohjaimia.

Tämän voidaan sanoa olevan ainoa STM8-mikrokontrolleriohjelmoija. STM32:n ohjelmointiin on olemassa muita yleisohjelmoijia.

Mistä voin ostaa STM8 STM32 ST-Link ohjelmoijan

Päällä nykyinen hetki ST-mikrokontrollereista on paljon kiinnostusta. Siksi ST-linkkiohjelmoija on melko yleinen markkinoilla. On olemassa useita versioita, jotka eroavat hinnasta.

ST:n alkuperäinen ST Link on, kuten aina, kallein vaihtoehto. Maksaa yli 2000 ruplaa.

Mini ST -linkki (erittäin samanlainen kuin tämän ohjelmoijan versiomme) maksaa noin 600 ruplaa. Voit ostaa sen suurimmilta elektroniikkatoimittajilta - Compel, Terra Electronics ja muut.

Ali express (Kiina) - täällä he tarjoavat suuren määrän Ohjelmoijan yksinkertaisimpia versioita, mutta yleensä ne kaikki toimivat, niitä voidaan käyttää kentällä. Pääsääntöisesti ne soveltuvat STM8:n ja STM32:n ohjelmointiin. Ainoa asia on, että niillä ei ole SWO-lähtöä, mutta sitä ei tarvita niin usein. Ehkä ainoa negatiivinen asia tässä on oston odottaminen. Hinta on noin 150-200 ruplaa.

Jos et tarvitse STM8-ohjelmoijaa, vaan tarvitset vain STM32-sarjan, niin ST:n Discovery-kortit ovat hyvä vaihtoehto. STM8-ohjelmointiliitintä ei kuitenkaan pääsääntöisesti reititetä sinne.

Ja tietysti voit vain ostaa osat ja tehdä tämä laite omillaan. Se ei perustu halvimpaan STM32-mikro-ohjaimeen, eikä ole niin helppoa ostaa osia halvalla, joten hinta on 300-400 ruplaa. Tässä artikkelissa kerromme kuinka koota tämä laite itse tarvittavista SMD-komponenteista. Tietysti suosittelemme tämän reitin valitsemista. Tämä on ainoa tapa oppia jäljittämään levyjä, valmistamaan niitä ja juottamaan niitä.

Kuinka tehdä ST-LINK V2 -ohjelmoija

2. Valmistele tai osta tarvittavat työkalut: kaikki juottamiseen, USB UART -sovitin (tarvitaan MK:n ohjelmointiin)

4. Lataa tarvittavat tiedostot tälle laitteelle githubista.

5. Tee itse levy laitteelle (tämä ei ole ollenkaan vaikeaa, kaikki on kuvattu yksityiskohtaisesti ohjeissamme).

6. Voit ostaa kaikki tarvittavat komponentit myymälästämme 300 ruplaa.

7. Juota kaikki komponentit levylle, katso meidän video.

LAITE ON VALMIS, voit käyttää sitä!

Etsi piiri ST Link ohjelmoijalle, debuggerille

ST-yritys itse ei toimita meille kaaviota tästä laitteesta, mutta sen DISCOVERY-sarjan arviointitauluista on kaavioita, jotka sisältävät myös kaavion debuggerista. Esimerkiksi asiakirja UM0919. Mutta se ei ole täydellinen, siinä on vain SWD-liitäntä. Se perustuu STM32F103C8T6-mikro-ohjaimeen.


Toinen piiri, joka on UM1670-dokumentissa, sisältää SWIM-lähtönastat, mutta tämä on jo versio V2.2 toisessa STM32F103CBT6-mikrokontrollerissa.


Onnistuimme myös löytämään ST-LINK v2 -piirin Internetistä, palautettu alkuperäisestä laitteesta:

Näistä kolmesta piiristä meidän on kehitettävä piiri laitteellemme. Mutta ensin laaditaan perusvaatimukset laitteelle, jonka teemme.

Vaatimukset ST-LINKillemme

Teemme STM8-pohjaisia ​​laitteita sekä STM32-, NUVOTON Cortex-M0-, ATMEL-suorittimia. Ne kaikki saavat virran 3,3 V tai 5 V. Emme siis tarvitse kykyä työskennellä mikro-ohjainten kanssa 1,8 V jännitteellä. Mutta kyky ohjelmoida itse STM8 on ehdottoman välttämätöntä.

Valmistamme laitteen tarpeisiimme, joten emme tarvitse tavallisia SWIM- ja JTAG-liittimiä. Tekee liittimen, joka on kätevämpi levyn jäljittämiseen.

STM32F103CBT6-mikro-ohjaimen versio 2.2 lisää toisen USB-laite- COM-portti UART, mutta meillä on se jo, joten ei ole mitään järkeä maksaa liikaa, mikro-ohjain on siellä kalliimpi. On totta, että hänellä on hyvä tilaisuus- laiteohjelmisto DFU-liitännän kautta, eli mikro-ohjain nähdään flash-asemana, kun se on kytketty USB: n kautta, ja laiteohjelmisto on vain kopioitava levylle. Mutta sinun on välähdyttävä se kerran, ja tätä varten meillä on USB UART -sovitin, jonka ensimmäisellä kerralla vältät sen. Muut laiteohjelmistopäivitykset suoritetaan ohjelman kautta ST:stä USB:n kautta. Teemme version 2.0 STM32F103C8T6:n perusteella.

ST-Linkin alkuperäinen versio sisältää tasonmuunnospiirin, joka on kätevä virheenkorjaukseen ja laiteohjelmistoon valmis laite, ja se on tarpeen alle 3,3 V:n jännitteillä työskentelyssä. Meillä ei ole näitä, ja 5V:n ja 3,3V:n kanssa työskentelyyn tasomuunnos ei ole välttämätöntä.

Valmistamme laitteen USB-dongle-muodossa, USB-A-urosliitintä käytetään.

Voit säästää lähtöjen suojauksessa, joten emme käytä suojadiodeja. Kaikissa liittimien lähdöissä on riittävästi vastusta siltä varalta, että yhdistämme ne yhtäkkiä 5 V:iin tai maahan. On välttämätöntä muistaa, että sinun on käytettävä tätä laitetta huolellisesti! Tarkista kaikki lähdöt useita kertoja kytkettäessä! 3,3 V:n lähtö on suojattu paremmin oikosululta suojaavan jännitesäätimen läpi. Joten on parempi testata virtapiirejä siitä!

Nyt voimme laatia lopullisen kaavion ST-Linkistämme.

Internetissä on tarjolla monia valmiita kortteja ja piirejä tälle laitteelle, mutta koulutustarkoituksiin rakennamme piirin ja teemme piirin itse, valmistajan lähettämän TIEDOTUKSEN perusteella. Jos kopioit kaavion toiselta sivustolta, sinun on selvitettävä se, mitä siellä tehtiin ja miten, miksi heitit pois tai lisäsit joitain elementtejä.

Lopullinen kaava

Voit nähdä itse kaavion tämän laitteen tiedostoista. Esittelemme sen täällä kommentoidaksemme pääsolmuja.

Pääosa:


Virta ja liittimet:

Pieniä kommentteja.

3,3V tehonsäätimenä käytämme NCP603:a - erittäin hyvä LDO, tuottaa jopa 300mA virran 300mv pudotuskyvyllä ja +-3% tarkkuudella. Merkkivalot ovat tavallisia kaksivärisiä SMD-LED-valoja. Ohjelmoidaksesi UART:n kautta, sinun on liitettävä BOOT0-nastainen +3 V:iin. On myös tarpeen lähettää itse UART - RX TX -jalat. Kaikki muut suojattomat nastat kytketään liittimeen. Olen käyttänyt tätä ohjelmoijaa nyt yli vuoden, ja siinä on ollut oikosulkuja ja häiriöitä - mikään ei ole koskaan palanut.

Joissakin malleissa USB-virtalähteeseen asetetaan itsestään palautuva sulake portin suojaamiseksi. Nykyaikaiset tietokoneet on suoja päällä USB-portit, mukaan lukien sulakkeet ja virranrajoittimet, joten sitä ei tarvita. Mutta on tietysti parempi olla tarkistamatta tätä eikä erehtyä! 3,3 V jännite tulee meidän LDO:lta, jolla on suojaa oikosulkua ja ylikuumenemista vastaan, ja se ei anna yli 600 mA, sielläkään ei ole mitään suojattavaa.

STM8 on erittäin kätevä liittää ohjelmointiin ST-Linkin avulla, tarvitset vain 3 johtoa - virta, maa ja SWIM-lähtö. Tämä on kätevää myös, kun piirilevyt kytketään vain SWIM-ulostuloon.

Levyn reititys Kicadissa Topor-autoreitittimellä

USB UART -sovittimessa olemme jo harjoitelleet levyn jäljittämistä Kicadissa manuaalisesti. Tämä laite on hieman monimutkaisempi. Täältä voit oppia reitittämään laudan sisään TOPOR autorouter. On parempi katsoa koko prosessi videosta artikkelin lopussa, videossa on vain pieniä kommentteja.

Levyn valmistelu automaattista reititystä varten

Jotta voit työskennellä Toporin kanssa, sinun on ensin valmisteltava taulu Kicadissa. Sinun on määritettävä levyn rajat, tuotava kaikki komponentit ja asetettava ne valmiiksi. Meillä ei ole vaatimuksia liittimille, joten ensimmäisessä vaiheessa on parempi poistaa itse liitin levyltä. Koska jokainen liittimen nasta on kytketty vastuksen kautta, vastukset ovat liittimen nastojen vertailupiste. Komponenttien järjestämiseksi voit myös poistaa kaikki tehokondensaattorit, kvartsit, tehomikropiirit (on parempi sijoittaa ne takapuoli- siellä on yleensä paljon tilaa) - kaikki tämä voidaan järjestää myöhemmin.

Nyt sinun on määritettävä kunkin komponentin puoli. Ja sijoita ne karkeasti tarpeen mukaan asettamalla liittimet reunaan. Ja tässä vaiheessa voit siirtää kaiken tämän Toporiin ja jatkaa komponenttien sijoittamista sinne. USB-liitin, LEDit sijoitetaan heti takapuolelle, kaikki muu on etupuolella.

Komponenttien sijoittaminen Toporilla

Nyt siirrämme tämän kaiken Toporiin ja jatkamme siellä. Mitä hyvää Toporissa on? Koska joka kerta kun siirrät komponentteja, voit reitittää kaikki reitit automaattisesti uudelleen ja nähdä, onko se parempi vai huonompi. Topor voi myös kääntää yksinkertaisia ​​komponentteja - vastuksia, kondensaattoreita. Meille on tärkeää ymmärtää, miten liittimen nastat ja pääkomponentit voidaan järjestää kätevämmin.

Toporissa komponenttien kiertämisen ja siirron jälkeen päädyimme tähän järjestelyyn:


Nyt sinun on siirrettävä tämä tulos takaisin Kicadiin ja lisättävä loput komponentit. Ennen lopullista jäljitystä sinun on:

    järjestää tehosiruja

    kytke virtalähdepiirit manuaalisesti

    järjestää ja kytkeä kvartsi- ja tehokondensaattorit

    määritä liittimen nastat uudelleen kaaviossa.

Autoroute

Siirrämme puolijälkemme Toporiin.

Reitityssäännöt on määritettävä välittömästi - rakojen leveys, raidat, läpivientien mitat. Kun tuomme Kicadista ensimmäistä kertaa, meidän on valittava kaikki komponentit ja korjattava ne, jotta voimme helposti poistaa ne del-painikkeella ja uudelleenreitityksellä, jättäen puolimanuaalisen vaihtoehdon. Automaattisen reitityksen parametreissä on valittava "Käytä olemassa olevaa reititystä alkuperäisenä vaihtoehtona" -valintaruutu, muuten manuaaliset reitityksemme reititetään uudelleen (katso video työskentelyprosessista Toporissa).

Automaattisen reitityksen jälkeen siirrämme kaiken takaisin ja tuomme sen lopulliseen versioon - lisää maaperäisiä polygoneja, kohdista polut tarvittaessa. Lauta on valmis.

Lopullinen versio taulusta

Kasvot


Kääntöpuoli

ST Link firmware, ohjaimen asennus

Levy on valmis, teemme sen kylmäväriaineen siirtomenetelmällä asetonilla (tai millä tahansa muulla), etsaamme sen ja kokoamme laitteen. Ennen kuin kytket sen päälle ensimmäistä kertaa, varmista millä tahansa yleismittarilla, ettei 5 V:n ja GND:n välillä ole vastusta (äärimmäisen korkea) - tämä varmistaa, ettei oikosulkua ole. Sinun on myös tarkistettava resistanssi 3,3 V:n ja GND:n välillä.

Jotta voit työskennellä laitteemme kanssa, sinun on asennettava ohjaimet, flash se ensimmäistä kertaa UART:n kautta käynnistysohjelmiston kanssa ja päivitettävä laiteohjelmisto uusimpaan versioon erikoisohjelma alkaen ST.

Kaikissa STM32-mikro-ohjaimissa on käynnistyslatain ja ne flash-päivitetään UART:n kautta. Laiteohjelmistoa varten tarvitset:

Nyt meillä on ST LINK, mutta vanhalla laiteohjelmistolla. Poistamme kaikki johdot. Lataa STSW-LINK007-laiteohjelmiston päivitysohjelma ja STSW-LINK009-ohjainpäivitysohjelma Windowsille ST-verkkosivustolta. Asetamme äskettäin valmistetun ST-Linkin sisään USB-portti tietokoneeseen ja käynnistä laiteohjelmiston päivitysohjelma, napsauta siinä CONNECT ja päivitä laiteohjelmisto uusimpaan versioon. Laite on VALMIS! Nyt sinulla on ohjelmoija-debuggeri ja voit siirtyä ohjelmointiin.

Valmis laite

Itsenäinen työ

Harjoittele levyn kytkemistä. Tee se manuaalisesti Topor-ohjelman kanssa tai ilman sitä. Sinun pitäisi pystyä nopeasti tekemään mikä tahansa yksinkertainen taulu.

Tämä artikkeli on ensimmäinen suunnitellussa artikkelisarjassa, jossa käsitellään mikro-ohjainohjelmoinnin opiskelua. Erilaisia ​​materiaaleja tutkiessani huomasin, että melkein kaikki ne alkavat siitä, että aloittelijaa pyydetään lataamaan (tai käyttämään kehitysympäristön mukana tulevaa kirjastoa) oheislaitteiden kanssa työskentelyä varten ja käyttämään sitä ensimmäisen ohjelmansa kirjoittamiseen (yleensä LED-valo vilkkuu).

Tämä yllätti minut suuresti. Jos uskot näihin artikkeleihin, sinun ei tarvitse edes lukea ohjelmoitavan ohjaimen ohjelmoitavaa dokumentaatiota. Minulle opetettiin viisautta "laitteiston ohjelmointi" täysin erilainen.

Tässä artikkelissa polku lauseesta "Kyllä, haluan kokeilla!" kunnes LEDin iloinen silmänisku on paljon pidempi kuin muiden kirjoittajien. Yritän paljastaa mikrokontrolleriohjelmoinnin näkökohtia, jotka ovat piilossa kirjastotoimintojen käytön ja valmiiden esimerkkien takana.
Jos aiot vakavasti opiskella mikrokontrolleriohjelmointia, tämä artikkeli on sinua varten. Ehkä se voi kiinnostaa myös niitä, jotka ovat pelanneet tarpeeksi Arduinolla ja haluavat saada käsiinsä laitteiston kaikki laitteistoominaisuudet.

Mikro-ohjaimen valinta

Monet saattavat sanoa, että on parempi aloittaa mikro-ohjainten oppiminen AVR:llä, PIC:llä, 8051:llä tai jollain muulla. Ongelma on monitahoinen ja kiistanalainen. Tiedän tarpeeksi esimerkkejä, joissa ihmiset, opiskelleet Cortex-M, ohjelmoivat AVR:ää, ARM7:ää jne. Itse aloitin Cortex-M3:lla. Jos kohtaat tietyn tehtävän, Internetissä on paljon tietoa, jossa verrataan erityyppisiä mikrokontrollereita ja tehtäviä, joita ne voivat ratkaista. Tämä kysymys esitettiin myös esimerkiksi Habrén kohdalla.

Oletetaan, että olemme selvittäneet mikro-ohjaimen tyypin. Mutta markkinat tarjoavat valtavan valikoiman erilaisia ​​muunnelmia eri valmistajilta. Ne eroavat monista parametreistä - flash-muistin koosta analogisten tulojen määrään. Jokaisen tehtävän valinta tulee tehdä yksilöllisesti. Ei mitään yleisiä suosituksia Se ei ole eikä voi olla täällä. Huomaan vain, että kannattaa aloittaa tutkimus MK-valmistajilta, joilla on suurin mahdollinen valikoima. Sitten, kun valitset MK:ta tiettyyn tehtävään, on melko suuri mahdollisuus, että jokin esitetystä valikoimasta sopii sinulle.

valitsin STM32(vaikka mielestäni on parempi aloittaa opiskelu TexasInstrumentsin MK:lla - dokumentaatio on erittäin hyvin koottu), koska ne ovat laajalle levinneitä venäläisten elektroniikkakehittäjien keskuudessa. Jos sinulla on ongelmia tai kysymyksiä, voit helposti löytää ratkaisuja foorumeilta. Toinen plus on laaja valikoima esittelylevyjä sekä valmistajalta että kolmansien osapuolien organisaatioilta.

Mitä sinun tarvitsee opiskella?

Valitettavasti pelkkä PC ei riitä MK:n ohjelmoinnin aloittamiseen. Sinun täytyy hankkia esittelylevy ja ohjelmoija jostain. Vaikka tämä vähentää kilpailua työmarkkinoilla.

Itse käytän demolevyä. STM3220G-EVAL ja ohjelmoija J-Link PRO. Mutta aluksi se riittää STM32F4DISCOVERY, jonka voi ostaa ilman ongelmia pienellä summalla.

Kaikki esimerkit koskevat erityisesti virheenkorjauslevyä STM32F4DISCOVERY. Tässä vaiheessa meille ei ole ollenkaan tärkeää, että tässä levyssä on Cortex-M4-ytimeen perustuva MCU. Emme käytä sen ominaisuuksia ja etuja Cortex-M3:een verrattuna lähitulevaisuudessa. Katsotaan mitä seuraavaksi tapahtuu.

Jos sinulla on jokin muu STM32F2xx/STM32F4xx-pohjainen kortti, voit työskennellä sen kanssa. Aineistoa esitellessään yritän kuvata mahdollisimman yksityiskohtaisesti. Miksi teemme näin, emme toisin. Toivottavasti kenelläkään ei ole ongelmia esimerkkien siirtämisessä muihin laitteisiin.

Kehitysympäristö

Kuten on jo monta kertaa mainittu, varten ARM-mikro-ohjaimet Kehitysympäristöjä on riittävästi, sekä maksullisia että ei niin paljon. Ja jälleen haluan jättää tämän asian kiistan väliin. Käytän IAR Embedded Workbenchiä ARM 6.60:lle. Kaikki esimerkit ovat tässä ympäristössä. Jos pidät (tai organisaatiosi käyttää) jostain muusta (Keil, Eclipse, CCS, CooCoc jne.), tämäkään ei vahingoita sinua. Kiinnitän erityistä huomiota erityisesti kehitysympäristöön liittyviin ominaisuuksiin.

Miksi maksullinen kehitysympäristö?

Ehkä joku ei ole täysin tyytyväinen siihen, että ehdotan maksullisen kehitysympäristön käyttöä, mutta IAR:ssä on mahdollista saada tilapäinen lisenssi ilman toiminnallisuusrajoituksia tai rajoittamaton lisenssi koodin kokorajoituksella (32 kt MK:lle on paljon ).
Lisäksi huomautan heti, että joillekin MK: lle ei ole olemassa vapaat ympäristöt kehitystä. Ja valitettavasti nämä MK:t ovat korvaamattomia joillakin alueilla.


En kuvaile asennusprosessia.

Mistä aloittaa?

Projektin luominen
Luodaan ensin tyhjä projekti. IAR:n avulla voit luoda projekteja ASM-, C- ja C++-kielellä. Käytämme C.

Tyhjä projekti, jossa on päätiedosto, ilmestyy eteen.

Nyt sinun on määritettävä projekti, jotta voit aloittaa työskentelyn "meidän" MK:n ja virheenkorjausohjelman kanssa. MK asennettuna STM32F4DISCOVERY-kortille STM32F407VG. Se on valittava projektin ominaisuuksista (Yleiset asetukset-> Kohde-> Laite):

Kun valitset ohjelmoitavan kohdeprosessorin, sen kuvaus ladataan, mikä tarjoaa runsaasti mahdollisuuksia virheenkorjaukseen (tätä käsitellään alla). Lisäksi liitteenä on automaattisesti konfiguraatiotiedosto, joka kuvaa linkkerin käytettävissä olevan osoitetilan. Tarvittaessa kosketamme aihetta asetustiedosto linkki seuraavissa artikkeleissa.

Tämän jälkeen sinun on määritettävä debuggeri. Ohjelman virheenkorjaus tapahtuu suoraan "laitteistossa". Tämä tehdään JTAG-debuggerilla. Voit oppia lisää siitä, kuinka tämä tapahtuu Wikipediasta. ST-LINK/V2-debuggeri on integroitu STM32F4DISCOVERY-kortille. Jotta voit työskennellä debuggerin kanssa, sinun on valittava sen ohjain valikosta Vianetsintä-> Asennus-> Ohjain. On myös tarpeen osoittaa, että virheenkorjaus tulisi suorittaa suoraan laitteistossa. Tätä varten sinun on asetettava lippu Debuggeri->Lataa->Käytä flash-lataajia


Niille, jotka näkivät sanan Simulaattori

Teoriassa IAR mahdollistaa ohjelmien virheenkorjauksen simulaattorin avulla. Mutta en ole koskaan nähnyt sitä käytännössä käytettävän.

Nyt projekti on valmis työhön (ohjelmointi, täyttö ja virheenkorjaus).

"TZ" ensimmäiselle projektille
Tehdään yhteenveto: MK ja debug board on valittu, projekti on valmisteltu. On aika päättää tehtävästä.

Älä poikkea klassikoista. Ensimmäinen projekti on vilkkuva LED. Onneksi niitä on laudalla paljon. Mitä tämä tarkoittaa ohjelmoinnin näkökulmasta? Ensinnäkin sinun täytyy opiskella kaavamainen kaavio esittelytaulu ja ymmärrä kuinka LED "käynnistyy".
saatavilla valmistajan verkkosivuilta. IN tämä kuvaus levyllä on jopa erillinen LED-osio - 4.4 LEDiä. Käytämme esimerkiksi Käyttäjä LD3. Etsitään se kaaviosta:

Piirin yksinkertaisin analyysi viittaa siihen, että LED-valon sytyttämiseksi sinun on asetettava "1" MK-nastalle (joka tälle MK:lle vastaa 3,3 V). Katkaiseminen tapahtuu lisäämällä "0" tähän nastaan. Kaaviossa tämä tappi on merkitty PD13(tämä on luultavasti tärkein tieto tästä asiakirjasta).

Tämän seurauksena voimme kirjoittaa "TZ" ensimmäiselle ohjelmallemme:
MK:n ohjelman on siirrettävä MK PD13 -nastan tila tilasta "0" tilaan "1" ja takaisin tietyllä ihmissilmälle havaittavalla jaksolla (tärkeä huomautus, jos LED vilkkuu liian usein ei ehkä pysty erottamaan tätä).

Ennen kuin aloitat ohjelmoinnin, tai vähän teoriaa
Ennen kuin aloitamme teknisten spesifikaatioidemme toteuttamisen, on välttämätöntä ymmärtää, miten MK:ta hallitaan.

Aloitetaan siitä, että mikä tahansa MK sisältää ytimen, muistin ja oheisyksiköt. Uskon, että muistilla kaikki on toistaiseksi selvää. Mainitsen vain, että STM32:ssa on flash-muisti, johon MK-ohjelma on tallennettu (yleensä tämä ei ole totta, ohjelma voidaan tallentaa ulkoiseen haihtumattomaan muistiin, mutta jätämme sen huomiotta toistaiseksi) ja muut tiedot, mukaan lukien käyttäjätiedot. Siellä on myös SRAM - hajasaantimuisti.

Ydin on mikro-ohjaimen osa, joka suorittaa yhden komentovirran. MK:ssamme ydintyyppi on Cortex-M4. MK-ydintä voidaan verrata PC:n prosessoriin. Se voi vain suorittaa komentoja ja siirtää tietoja muille yksiköille (prosessoreita, joissa on integroitu näytönohjain, ei oteta huomioon tässä vertailussa).
Samaan aikaan MK-valmistaja ei kehitä ydintä. Ydin on ostettu ARM Limitediltä. Suurin ero eri MK:iden välillä on periferiassa.

Oheislohkot ovat lohkoja, jotka ovat vuorovaikutuksessa "ulkomaailman" kanssa tai suorittavat tiettyjä toimintoja, joihin MK-ydin ei pääse. Nykyaikaiset MCU:t (mukaan lukien STM32) sisältävät valtavan valikoiman oheislaitteita. Oheislaitteet on suunniteltu ratkaisemaan erilaisia ​​tehtäviä jännitearvon lukemisesta MK:n analogisesta tulosta tietojen lähettämiseen ulkoisille laitteille SPI-väylän kautta.
Toisin kuin MK-ydin, oheislaitteet eivät suorita käskyjä. Ne suorittavat vain ytimen komentoja. Tässä tapauksessa ytimen osallistumista komennon suorittamiseen ei vaadita.

Esimerkki

Esimerkki on UART-lohko, joka on suunniteltu vastaanottamaan ja lähettämään dataa MK:sta ulkoisiin laitteisiin. Ytimen tarvitsee vain määrittää lohko ja antaa sille tiedot lähetystä varten. Tämän jälkeen ydin voi jatkaa ohjeiden suorittamista. Oheislaite on vastuussa vastaavan MK-lähdön ohjaamisesta tiedonsiirtoa varten protokollan mukaisesti. Oheislaite itse siirtää MK-lähdön vaadittuun tilaan "0" tai "1" tuumaa oikea hetki aikaa siirron aikana.

Ytimen vuorovaikutus oheisyksikön kanssa
MK-ytimen vuorovaikutus oheisyksikön kanssa suoritetaan erikoisrekistereillä (vuorovaikutusta on myös keskeytysmekanismin ja DMA:n kautta, mutta siitä lisää seuraavissa viesteissä). Ytimen näkökulmasta tämä on vain pala muistia tietty osoite, se ei vain ole totta. Tiedon kirjoittaminen erityiseen rekisteriin vastaa komennon tai tietojen lähettämistä oheislaitteeseen. Lukeminen - tietojen vastaanottaminen lohkosta tai sen tilan lukeminen. Oheislohkojen ja niiden erikoisrekisterien kuvaus vie leijonanosan MK-kuvauksesta.

TÄRKEÄÄ: Kun olet kirjoittanut tiedot erityiseen rekisteriin ja sitten lukenut sen, voit saada täysin erilaisia ​​tietoja. Esimerkiksi datan lähettäminen UART-lohkoon lähetettäväksi ja lohkon vastaanottaman datan lukeminen ulkoinen laite, suoritetaan käyttämällä samaa rekisteriä.

Erikoisrekisterit on yleensä jaettu bittikenttiin. Yksi (tai useampi) bitti ohjaa tiettyä oheislaitteen lohkoparametria, yleensä itsenäisesti. Esimerkiksi saman rekisterin eri bitit ohjaavat tilaa erilaisia ​​ulostuloja MK.

Muista C
Jos olet C-kielen guru, voit turvallisesti ohittaa tämän osion. Se on tarkoitettu ensisijaisesti niille, jotka on opetettu (tai jotka oppivat itse) ohjelmoimaan PC:lle. Kokemus osoittaa, että ihmiset eivät usein muista tärkeitä käskyjä. Muistutan tässä lyhyesti bittikohtaisista toiminnoista ja työskentelystä suoraan muistin kanssa sen osoitteessa.

Tietojen kirjoittaminen muistiosoitteeseen

Oletetaan, että lukemalla oheisyksikön kuvauksen ymmärsimme sen oikea toiminta sinun on kirjoitettava siihen numero 0x3B. Rekisterin erityisosoite on 0x60004012. Rekisteri on 32-bittinen.
Jos et heti tiedä, kuinka tämä tehdään, yritän kuvata päättelyketjua oikean komennon saamiseksi.

Arvo 0x60004012 ei ole muuta kuin muistipaikkaan osoittavan osoittimen arvo. Juuri tämä meidän täytyy osoittaa ohjelmassamme, eli tehdä tyyppimuunnos C-kielen syntaksin mukaan:

(allekirjoittamaton pitkä*) (0x60004012)

Meillä on siis osoitin elementtiin. Nyt sinun on kirjoitettava vaadittu arvo tähän elementtiin. Tämä tehdään poistamalla osoittimen viittaus. Siten saamme oikean komennon:

*(allekirjoittamaton pitkä*)(0x60004012) = 0x3B;

Satunnaisten bittien asettaminen arvoon 1

Oletetaan, että haluamme asettaa osoitteen 0x60004012 bitit 7 ja 1 arvoon "1" muuttamatta kaikkien muiden rekisterin bittien arvoa. Tätä varten sinun on käytettävä binääritoimintoa |. Annan sinulle heti oikean vastauksen:

*(allekirjoittamaton pitkä*)(0x60004012) |= 0x82;

Kiinnitä huomiota 2 tosiasiaan. Bitit lasketaan nollasta, ei ensimmäisestä. Tämä toimenpide kestää itse asiassa vähintään 3 kellojaksoa - arvon lukeminen, muuttaminen, kirjoittaminen. Joskus tämä ei ole hyväksyttävää, koska oheislaite on saattanut muuttaa yhden bitin arvoa, jota emme saa muuttaa, lukemisen ja kirjoittamisen välillä. Älä unohda tätä ominaisuutta, muuten saattaa ilmestyä vikoja, joita on erittäin vaikea saada kiinni.

Satunnaisten bittien asettaminen arvoon 0

Oletetaan, että haluat asettaa bitit 7 ja 1 0:ksi osoitteeseen 0x60004012 muuttamatta kaikkien muiden rekisterin bittien arvoa. Tätä varten sinun on käytettävä binääri & -operaattoria. Annan sinulle heti oikean vastauksen:

*(allekirjoittamaton pitkä*)(0x60004012) &= 0xFFFFFF7D;

Tai sen yksinkertaisempi merkintä (älä välitä ylimääräisestä operaatiosta, kääntäjä laskee kaiken etukäteen, jopa minimaalisella optimoinnilla):

*(allekirjoittamaton pitkä*)(0x60004012) &= (~0x82);

Jotkut MK-ohjelmien ominaisuudet
Yritän tässä kuvata joitain MK-ohjelmien ominaisuuksia, jotka ovat tärkeitä muistaa. Asiat ovat ilmeisiä, mutta kuitenkin.
Ohjelmalla ei ole loppua
Toisin kuin useimmat PC-ohjelmat, MK-ohjelman ei pitäisi koskaan loppua, EI KOSKAAN! Mitä tarkalleen ottaen MK:n on tehtävä ohjelman päätyttyä? Kysymys on käytännössä retorinen. Siksi älä unohda varmistaa, että et ole unohtanut ikuista kiertokulkua. Halutessasi voit laittaa MK:n lepotilaan.
Käytä kokonaislukumuuttujia
Huolimatta siitä, että käytämme Cortex-M4-ytimellä varustettua mikro-ohjainta, joka suorittaa operaatioita laitteiston liukulukuille, suosittelen, että et käytä niitä. Mikro-ohjaimessa, joka ei tue tällaisia ​​toimintoja, laskenta-aika on yksinkertaisesti valtava.
Vältä dynaamista muistin varaamista
Tämä on vain neuvo. Syy on yksinkertainen - muisti ei riitä. Olen usein törmännyt kirjastoihin, joissa on "hitaita" muistivuotoja. Oli erittäin epämiellyttävää, kun useiden viikkojen vakaan toiminnan jälkeen MK kaatui virheellä. On parempi miettiä ohjelman arkkitehtuuri etukäteen, jotta sinun ei tarvitse käyttää dynaamista muistin varausta.
Jos haluat silti käyttää sitä, tutustu muistinhallinnan työhön huolellisesti tai kirjoita omasi.

Mennään töihin!

MK-ohjelman työstäminen alkaa aina dokumentaation lukemisesta. MK:llemme se on saatavana valmistajan verkkosivuilta. Sivuja on paljon, mutta lue ne kaikki Heippa ei tarvetta. Kuten jo mainittiin, suurin osa dokumentaatiosta koostuu oheislaitteiden ja niiden rekisterien kuvauksesta. Haluan myös kiinnittää huomionne siihen tosiasiaan, että tämä viiteopas ei ole kirjoitettu yhdelle MK:lle, vaan useille riveille. Tämä viittaa siihen, että koodi on siirrettävissä, kun siirrytään muihin näissä riveissä oleviin MK:ihin (ellet tietysti yritä käyttää oheislaitteita, jotka eivät ole käyttämässäsi MK:ssa).

Ensinnäkin sinun on päätettävä, minkä lohkojen kanssa työskentelet. Voit tehdä tämän vain tutkimalla osia Johdanto Ja Pääominaisuudet.

MK-nastojen tilan suora ohjaus tapahtuu GPIO-lohkon avulla. Kuten dokumentaatiosta ilmenee, STM32 MCU:ssa voi olla jopa 11 itsenäistä GPIO-lohkoa. Erilaisia ​​oheislaitteiden GPIO-lohkoja kutsutaan yleisesti porteiksi. Portit on merkitty kirjaimilla A–K. Jokainen portti voi sisältää enintään 16 nastaa. Kuten aiemmin totesimme, LED on kytketty nastaan ​​PD13. Tämä tarkoittaa, että tätä nastaa ohjaa oheislaitteen GPIO-portti D. Pin-numero 13.

Emme tarvitse tällä kertaa muita oheislaitteita.

Oheislaitteiden kellonohjaus
MK:n virrankulutuksen vähentämiseksi lähes kaikki oheislaitteet sammutetaan MK:n käynnistämisen jälkeen. Lohko kytketään päälle/pois kytkemällä/pysäyttämällä kellosignaalin syöttö sen tuloon. Oikean toiminnan varmistamiseksi MK-kellosignaalin ohjain on konfiguroitava siten, että tarvittava oheislaite vastaanottaa kellosignaalin.
Tärkeää: Oheislaite ei voi käynnistää toimintaa heti sen jälkeen, kun kellosignaali on kytketty päälle. Sinun on odotettava muutama rasti, kunnes se "alkaa". Ihmiset, jotka käyttävät kirjastoja oheislaitteet, eivät usein edes tiedä tästä ominaisuudesta.

Rekisterit ovat vastuussa oheislaitteiden kellottamisen mahdollistamisesta RCC XXX oheislaitteiden kellon sallimisrekisteri.X:n tilalla voi olla renkaat AHB1, AHB2, AHB3, APB1 ja APB2. Tutkittuaan huolellisesti vastaavien rekisterien kuvauksen, voimme päätellä, että GPIOD-oheislaitelohkon kellotus kytketään päälle asettamalla "1" rekisterin kolmannessa bitissä Oheislaitteiden RCC AHB1 -kellorekisteri (RCC_AHB1ENR):

Nyt sinun on selvitettävä, kuinka voit selvittää itse rekisterin osoitteen RCC_AHB1ENR.

Kommentti: STM32 MK -kellojärjestelmän kuvaus on erillisen artikkelin arvoinen. Jos lukijat haluavat, käsittelen tätä osiota yksityiskohtaisemmin yhdessä seuraavista artikkeleista.

Erityisten rekisteriosoitteiden määrittäminen
Erikoisrekisterien osoitteiden määrittäminen tulee aloittaa lukemalla kohta Muisti kartta viitekäsikirjassa. Voit nähdä, että jokaiselle lohkolle on varattu oma osa osoiteavaruudesta. Esimerkiksi RCC-lohkolle tämä on osa 0x4002 3800 - 0x4002 3BFF:

Rekisteriosoitteen saamiseksi on tarpeen lisätä RCC-lohkon osoiteavaruuden alkuarvoon Osoite offset vaadittava rekisteri. Osoitteet offset näkyy myös rekisterin kuvauksessa (katso kuvakaappaus yllä).

Tämän seurauksena olemme määrittäneet rekisteriosoitteen RCC_AHB1ENR- 0x4002 3830.

GPIO lohko
GPIO-lohkon yleistä ymmärtämistä varten suosittelen lukemaan viitekäsikirjan koko osan. Toistaiseksi et voi kiinnittää paljon huomiota Vaihtoehtoinen tila. Jätetään se myöhempään.

Nyt meidän tehtävämme on opetella hallitsemaan MK-nastojen tilaa. Siirrytään suoraan GPIO-rekisterien kuvaukseen.

Toimintatila
Ensinnäkin sinun on asetettava portin D as nastan 13 toimintatila Yleiskäyttöinen lähtötila, mikä tarkoittaa, että GPIO-lohko ohjaa MK-nastan tilaa. MK-nastojen toimintatilaa ohjataan rekisterin avulla GPIO-porttitilan rekisteri (GPIOx_MODER) (x = A..I/J/K):

Kuten kuvauksesta näkyy, tarvitsemamme säädön tekemiseksi meidän on kirjoitettava arvo 01b rekisterin 26-27 bittiin GPIOx_MODER. Rekisterin osoite voidaan määrittää edellä kuvatulla tavalla.

GPIO-portin lähtönastojen toimintaparametrien konfigurointi
GPIO-lohkon avulla voit käyttää lisäasetukset lähtöportin nastoja varten. Nämä asetukset tehdään rekistereissä:
  • GPIO-portin lähtötyyppirekisteri (GPIOx_OTYPER)- Aseta lähtötyyppi push-pull tai open-drain
  • GPIO-portin lähtönopeusrekisteri (GPIOx_OSPEEDR)- Aseta lähdön nopeus
Emme muuta näitä parametreja, koska olemme varsin tyytyväisiä oletusarvoihin.
MK-nastan arvon asettaminen
Lopuksi olemme tulleet MK:n lähtötilan ohjaamiseen. Tietyn MK-nastan lähtöarvon asettamiseen on kaksi tapaa.

Käytämme GPIO-portin bittiasetus-/palautusrekisteriä (GPIOx_BSRR)

"0" tai "1" kirjoittaminen bitteihin 0-16 aiheuttaa vastaavan muutoksen portin nastojen tilassa. Tietyn arvon asettamiseksi yhden tai useamman MK-nastan ulostuloon ja muiden tilan muuttamatta on tarpeen käyttää yksittäisten bittien muokkaustoimintoa. Tämä toimenpide suoritetaan vähintään 3 jaksossa. Jos joillekin biteille on kirjoitettava 1s ja toisiin 0, vaaditaan vähintään 4 kellojaksoa. Tätä menetelmää käytetään parhaiten muuttamaan lähdön tila vastakkaiseen tilaan, jos sen alkuperäinen tila on tuntematon.

GPIO-portin bittiasetus/nollausrekisteri (GPIOx_BSRR)

Toisin kuin edellisessä menetelmässä, 0:n kirjoittaminen mihinkään tämän rekisterin biteistä ei johda mihinkään (ja yleensä kaikki bitit ovat vain kirjoituskelpoisia!). 1:n kirjoittaminen bitteihin 0-15 johtaa siihen, että MK:n vastaavaan lähtöön asetetaan "1". Kirjoittaminen 1:n bitteihin 16-31 asettaa "0":n vastaavaan MK:n ulostuloon. Tämä menetelmä on parempi kuin edellinen, jos sinun on asetettava tietty arvo "MK"-nastalle sen muuttamisen sijaan.

Sytytetään LED!
Kun olet löytänyt kaikkien tarvittavien rekisterien osoitteet, voit kirjoittaa ohjelman, joka kytkee LED-valon päälle:
void main() ( //Ota portin D kellotus käyttöön *(signed long*)(0x40023830) |= 0x8; //pieni viive GPIODille valmistaudu haihtuva etumerkitön pitkä i=0; i++; i++; i++; i=0; / /Aseta PD13 yleiskäyttöiseksi lähdöksi *(signed long*)(0x40020C00) = (*(signed long*)(0x40020C00)& (~0x0C000000)) | (0x04000000) 0x40020C14) |= 0x2000 while(1);
Voidaan koota ( Projekti-> Kokoa) ja täytä ( Projekti->Lataa->Lataa aktiivinen sovellus). Tai suorita virheenkorjaus ( Project->Dpwnload and Debug) ja aloita suoritus (F5).
LED palaa!
Vilkkuva LED
LED-valon vilkkuminen ei ole muuta kuin vuorottelua päälle ja pois päältä näiden toimien välillä. Helpoin tapa on laittaa päälle ja pois päältä ikuiseen silmukkaan ja lisätä viive niiden väliin.
void main() ( //Ota portin D kellotus käyttöön *(signed long*)(0x40023830) |= 0x8; //pieni viive GPIODille valmistaudu haihtuva etumerkitön pitkä i=0; i++; i++; i++; i=0; / /Aseta PD13 yleiskäyttöiseksi lähdöksi *(merkitsemätön pitkä*)(0x40020C00) = (*(signed long*)(0x40020C00)& (~0x0C000000)) (0x04000000 while(1) ( //Kytke LED päälle *); unsigned long*)(0x40020C14) |= 0x2000 //Viive for(i=0; i<1000000 ;++i); //Turn LED OFF *(unsigned long*)(0x40020C14) &= ~0x2000; //Delay for(i=0; i<1000000 ;++i); } }
Viivearvo 1 000 000 valittiin kokeellisesti siten, että LEDin vilkkumisjakso oli silmällä nähtävissä, mutta ei liian pitkä.
Algoritmin optimointi
Valitun LED-vilkkumenetelmän haittana on, että MK-ydin viettää suurimman osan ajastaan ​​tyhjissä silmukoissa, vaikka se voisi tehdä jotain hyödyllistä (esimerkissämme ei ole muita tehtäviä, mutta ne tulevat näkyviin tulevaisuudessa).

Tämän välttämiseksi käytetään yleensä syklilaskuria ja MK-nastan tila vaihtuu, kun ohjelma käy läpi tietyn määrän jaksoja.
void main() ( //Ota portin D kellotus käyttöön *(signed long*)(0x40023830) |= 0x8; //pieni viive GPIODille valmistaudu haihtuva etumerkitön pitkä i=0; i++; i++; i++; i=0; / /Aseta PD13 yleiskäyttöiseksi lähdöksi *(signed long*)(0x40020C00) = (*(signed long*)(0x40020C00)& (~0x0C000000)) (0x04000000 while(1) ( i++; if(!); ) %2000000)) ( //Kytke LED PÄÄLLE *(allekirjoittamaton pitkä*)(0x40020С14) |= 0x2020; ) else if(!(i%1000000)) ( //Sammuta LED *(allekirjoittamaton pitkä*)(0x40020С14) & = ~0x2000 ) ) )
Mutta täälläkään ei ole ongelmia, jos syklin aikana suoritettujen komentojen määrä muuttuu, LED-valon vilkkumisjakso (tai syklin muiden komentojen suoritusaika) muuttuu. Mutta tässä vaiheessa emme voi taistella tätä vastaan.

Vähän virheenkorjauksesta
IAR mahdollistaa sovelluksen virheenkorjauksen suoraan laitteistolla. Kaikki näyttää melkein samalta kuin PC-sovelluksen virheenkorjaus. On tila vaiheittaista suorittamista varten, funktion syöttämiseen, muuttujien arvojen katseluun (virheenkorjaustilassa Näytä->Kello->Katso1/4).

Mutta tämän lisäksi on mahdollista tarkastella ydinrekisterien arvoja, oheislaitteiden erikoisrekisterejä (View->Register) jne.
Suosittelen, että tutustut debuggerin ominaisuuksiin samalla kun opettelet MK-ohjelmointia.

Lopuksi muutama sana

Ehkä monet sanovat, että osoitteiden manuaalinen kirjoittaminen ohjelmaan ei ole oikein, koska valmistaja tarjoaa tiedostoja, jotka sisältävät rekisterien ja bittikenttien määritelmiä, kirjastoja oheislaitteiden kanssa työskentelemiseen ja muita työkaluja, jotka helpottavat kehittäjän elämää. Olen tästä täysin samaa mieltä, mutta uskon silti, että ensimmäiset askeleet MK:n ohjelmoinnissa on otettava kaivamalla dokumentaatio läpi manuaalisesti, määrittämällä itsenäisesti tarvittavat rekisterit ja bittikentät. Sinun ei tarvitse käyttää tätä tulevaisuudessa, mutta sinun on ehdottomasti tiedettävä, miten se tehdään.
Tässä on vain muutamia syitä tälle lausunnolle:
  • Joskus valmistajan kirjastoissa on virheitä! Kerran melkein missasin projektin määräajan tämän takia. Juotin sirun uudelleen useita kertoja, koska ajattelin, että kristalli oli vaurioitunut juottamisen aikana (tätä oli tapahtunut ennenkin). Ongelmana oli, että erikoisrekisterin osoite oli kirjoitettu väärin kirjastoon. Tämä tapahtuu yleensä juuri markkinoille tulleiden MK- tai MK-linjojen kanssa.
  • Joidenkin valmistajien oheislaitteiden kanssa työskentelemiseen tarkoitetut kirjastot eivät käytä kaikkia oheislaitteiden ominaisuuksia. Erityisesti tein syntiä tämän kanssa Valaisin Micro, jotka TI myöhemmin osti. Minun piti kirjoittaa oheislaitteiden alustus manuaalisesti.
  • Monet ihmiset tottuvat MK-ohjelmoinnin aloittamiseen tutkimalla esimerkkejä. Uskon, että ensin sinun on päätettävä, mikä mahdollistaa MK:n toteuttamisen. Tämä voidaan ymmärtää vain lukemalla asiakirjoja. Jos jotain ei ole esimerkeissä, tämä ei tarkoita, että laitteisto ei tue sitä. Viimeinen esimerkki on PTP STM32 -laitteistotuki. Tietysti voit löytää jotain verkosta, mutta se ei sisälly valmistajan vakiopakettiin.
  • Joidenkin valmistajien oheislaitteiden ajurit ovat niin optimoimattomia, että nastan tilan vaihtaminen kirjaston avulla kestää jopa 20 kellojaksoa. Tämä on kohtuuhintaista luksusta joihinkin tehtäviin.

Kiitos kaikille postaukseni lukeneille, siitä tuli paljon enemmän kuin aluksi odotin.
Odotan innolla kommenttejasi ja perusteltua kritiikkiäsi. Jos sen lukevilla on halua, yritän jatkaa artikkelisarjaa. Ehkä jollain on ajatuksia aiheista, jotka olisivat esillepanon arvoisia - kuulisin niitä mielelläni.