ARM. Utoaji wa haraka wa STM32. Ustadi wa haraka wa vidhibiti vidogo vya STM32. Mwingiliano wa msingi na kitengo cha pembeni

KATIKA miaka iliyopita Vidhibiti vidogo vya 32-bit (MCUs) kulingana na vichakataji vya ARM vinashinda ulimwengu wa vifaa vya elektroniki kwa haraka. Mafanikio haya yanatokana na utendakazi wao wa hali ya juu, usanifu wa hali ya juu, matumizi ya chini ya nishati, gharama ya chini na zana za juu za programu.

HADITHI FUPI
Jina la ARM ni kifupi cha Mashine za Juu za RISC, ambapo RISC (Kompyuta iliyopunguzwa ya Maelekezo) inawakilisha usanifu wa kichakataji wa seti ya maagizo iliyopunguzwa. Idadi kubwa ya MK maarufu, na mfano wa familia za PIC na AVR, pia wanazo Usanifu wa RISC, ambayo ilifanya iwezekanavyo kuongeza utendaji kwa kurahisisha uainishaji wa maagizo na kuharakisha utekelezaji wao. Kuibuka kwa vidhibiti vidogo vya 32-bit vya ARM vya hali ya juu na tija huturuhusu kuendelea na kutatua matatizo changamano zaidi ambayo MCU za 8 na 16-bit haziwezi kukabiliana nazo tena. Usanifu wa kichakataji kidogo cha ARM chenye msingi wa 32-bit na seti ya maagizo ya RISC ilitengenezwa na kampuni ya Uingereza ya ARM Ltd, ambayo hutengeneza punje, vikusanyaji na zana za utatuzi pekee. Kampuni haizalishi MKs, lakini inauza leseni za uzalishaji wao. MK ARM ni mojawapo ya sehemu zinazokua kwa kasi zaidi katika soko la MK. Vifaa hivi hutumia teknolojia za kuokoa nishati, kwa hivyo hutumiwa sana katika mifumo iliyoingia na kutawala soko. vifaa vya simu, kwa nani ni muhimu matumizi ya chini ya nguvu. Kwa kuongeza, vidhibiti vidogo vya ARM vinatumika kikamilifu katika mawasiliano, vifaa vinavyobebeka na vilivyopachikwa ambapo utendaji wa juu unahitajika. Kipengele cha usanifu wa ARM ni msingi wa kompyuta wa processor, ambayo haina vifaa yoyote. vipengele vya ziada. Kila msanidi programu lazima aandae msingi huu kwa uhuru vitalu muhimu kwa ajili yako kazi maalum. Njia hii imefanya kazi vizuri kwa watengenezaji wakubwa wa chip, ingawa hapo awali ililenga suluhisho za kichakataji cha hali ya juu. Wachakataji wa ARM tayari wamepitia hatua kadhaa za ukuzaji na wanajulikana sana kwa familia za ARM7, ARM9, ARM11 na Cortex. Mwisho umegawanywa katika familia ndogo za wasindikaji wa kawaida wa CortexA, wasindikaji wa wakati halisi wa CortexR na cores za microprocessor za CortexM. Ilikuwa cores ya CortexM ambayo ikawa msingi wa maendeleo ya darasa kubwa la 32-bit MCUs. Zinatofautiana na vibadala vingine vya usanifu wa Cortex hasa katika matumizi ya seti ya maagizo ya 16-bit Thumb2. Seti hii ilichanganya utendakazi na ushikamano wa maagizo ya "classic" ya ARM na Thumb na iliundwa mahususi kwa ajili ya kufanya kazi na lugha za C na C++, ambayo huboresha kwa kiasi kikubwa ubora wa msimbo. Kwa heshima kubwa MK zilizojengwa kwenye msingi wa CortexM zinaendana na programu, ambayo kinadharia inaruhusu matumizi ya msimbo wa programu katika lugha. ngazi ya juu katika mifano kutoka kwa wazalishaji tofauti. Mbali na kuonyesha eneo la matumizi ya msingi, watengenezaji wa MK wanaonyesha utendaji wa msingi wa CortexM kwa kiwango cha alama kumi. Leo, chaguo maarufu zaidi ni CortexM3 na CortexM4. MK pamoja Usanifu wa ARM zinazozalishwa na makampuni kama vile Vifaa vya Analog, Atmel, Xilinx, Altera, Cirrus Logic, Intel, Marvell, NXP, STMicroelectronics, Samsung, LG, MediaTek, MStar, Qualcomm, SonyEricsson, Texas Instruments, nVidia, Freescale, Milander, HiSilicon na wengine.
Shukrani kwa usanifu ulioboreshwa, gharama ya MCU kulingana na msingi wa CortexM katika hali zingine ni ya chini kuliko ile ya vifaa vingi vya 8-bit. Aina za "Mdogo" kwa sasa zinaweza kununuliwa kwa rubles 30. kwa mwili, ambayo inaunda ushindani kwa vizazi vilivyopita vya MK. STM32 MICROCONTROLLERS Hebu tufikirie MCU ya bei nafuu na iliyoenea zaidi ya familia ya STM32F100 kutoka STMicroelectronics, ambayo ni mojawapo ya wazalishaji wakuu duniani wa MCU. Hivi karibuni kampuni ilitangaza kuanza kwa uzalishaji wa 32-bit MK ambayo inachukua faida ya viwanda
Cores za STM32 katika programu za bei ya chini. MCU za familia ya mstari wa Thamani ya STM32F100 zimeundwa kwa ajili ya vifaa ambavyo utendakazi wa 16-bit MCUs hautoshi, na utendakazi dhabiti wa vifaa vya "kawaida" vya 32-bit hauhitajiki. Laini ya STM32F100 ya MCU inatokana na msingi wa kisasa wa ARM CortexM3 na vifaa vya pembeni vilivyoboreshwa kwa matumizi ya kawaida ambapo MCU za 16-bit zilitumika. Utendaji wa STM32F100 MCU katika 24 MHz ni bora kuliko MCU nyingi za 16-bit. Laini hii inajumuisha vifaa vilivyo na vigezo mbalimbali:
● kutoka 16 hadi 128 kbytes ya kumbukumbu ya programu ya flash;
● kutoka 4 hadi 8 kbytes kumbukumbu ya ufikiaji bila mpangilio;
● hadi bandari 80 za pembejeo/pato za GPIO;
● hadi vipima muda tisa vya 16-bit na utendaji wa juu;
● vipima saa viwili;
● 16-channel ya kasi ya juu 12-bit ADC;
● DAC mbili za 12-bit zilizo na jenereta za mawimbi zilizojengewa ndani;
● hadi miingiliano mitatu ya UART inayoauni modi za IrDA, LIN na ISO7816;
● hadi miingiliano miwili ya SPI;
● hadi violesura viwili vya I2C vinavyotumia hali za SMBus na PMBus;
● ufikiaji wa kumbukumbu ya moja kwa moja ya njia 7 (DMA);
● kiolesura cha CEC (Udhibiti wa Elektroniki kwa Wateja) kilichojumuishwa katika kiwango cha HDMI;
● saa ya muda halisi (RTC);
● NVIC imeweka kidhibiti cha kukatiza.

Mchoro wa utendaji wa STM32F100 unaonyeshwa kwenye Mchoro 1.

Mchele. 1. Usanifu wa mstari wa MK STM32F100

Urahisi wa ziada ni utangamano wa pini wa vifaa, ambayo inaruhusu, ikiwa ni lazima, kutumia MK yoyote ya familia na utendaji zaidi na kumbukumbu bila kurekebisha bodi ya mzunguko iliyochapishwa. Laini ya STM32F100 ya vidhibiti inatolewa ndani aina tatu LQFP48, LQFP64 na LQFP100 paket, kuwa na 48, 64 na 100 pini, kwa mtiririko huo. Ugawaji wa pini umewasilishwa katika Mchoro 2, 3 na 4. Matukio hayo yanaweza kuwekwa kwenye bodi za mzunguko zilizochapishwa bila kutumia vifaa maalum, ambayo ni jambo muhimu katika uzalishaji mdogo.


Mchele. 2. STM32 MCU katika kifurushi cha LQFP48 Mtini. 3. STM32 MCU katika mfuko wa LQFP64


Mchele. 4. STM32 MCU katika mfuko wa LQFP100

STM32F100 ni kifaa cha bei nafuu na kilichoboreshwa kulingana na msingi wa CortexM3, inayoungwa mkono na mazingira ya hali ya juu ya maendeleo kwa familia ya STM32 ya vidhibiti vidogo, ambayo ina
Maktaba zisizolipishwa kwa vifaa vyote vya pembeni, ikijumuisha udhibiti wa gari na kibodi za kugusa.

MCHORO WA KUUNGANISHA STM32F100C4
Hebu fikiria matumizi ya vitendo ya MK kwa kutumia mfano wa kifaa rahisi zaidi cha STM32F100C4, ambacho, hata hivyo, kina vizuizi vyote kuu vya mstari wa STM32F100. Msingi mchoro wa umeme ujumuishaji wa STM32F100C4 umeonyeshwa kwenye Mchoro 5.


Mchele. 5. Mchoro wa uunganisho wa MK STM32F100C4

Capacitor C1 inahakikisha kuwa MK imewekwa upya wakati nguvu imewashwa, na capacitors C2-C6 huchuja voltage ya usambazaji. Resistors R1 na R2 hupunguza sasa ya ishara ya pini za MK. Oscillator ya ndani hutumiwa kama chanzo cha saa, kwa hivyo hakuna haja ya kutumia fuwele ya nje.


Pembejeo BOOT0 na BOOT1 inakuwezesha kuchagua njia ya kupakia MK wakati wa kugeuka nguvu kwa mujibu wa meza. Ingizo la BOOT0 limeunganishwa kwenye basi yenye uwezekano wa sifuri kupitia kizuia R2, ambacho hulinda pini ya BOOT0 kutoka kwa mzunguko mfupi inapotumiwa kama lango la pato la PB2. Kutumia kiunganishi J1 na jumper moja, unaweza kubadilisha uwezo kwenye pembejeo ya BOOT0, na hivyo kuamua jinsi MK inavyopakiwa - kutoka kwa kumbukumbu ya flash au kutoka kwa bootloader iliyojengwa. Ikiwa unahitaji kupakia MK kutoka kwa RAM, kontakt sawa na jumper inaweza kushikamana na pembejeo ya BOOT1.
Upangaji wa MK unafanywa kupitia bandari ya serial ya UART1 au kupitia watengenezaji programu maalum - JTAG au vitatuzi vya STLink. Mwisho ni sehemu ya kifaa cha utatuzi maarufu cha STM32VLDISCOVERY, kilichoonyeshwa kwenye Mchoro 6. Kwenye ubao wa STM32VLDIS COVERY, kiunganishi cha pini 4 cha programu - Kitatuzi cha STLink - kimeteuliwa SWD. Mwandishi wa makala anapendekeza kupanga MK kupitia bandari ya serial ya UART1, kwa kuwa ni rahisi zaidi, hauhitaji vifaa maalum na sio duni kwa kasi ya JTAG au ST Link. Kama kifaa cha kudhibiti kinachoweza kutoa amri na kuonyesha matokeo ya programu ya MK, na vile vile programu, unaweza kutumia yoyote. Kompyuta binafsi(PC) iliyo na lango la serial la COM au lango la USB lenye kibadilishaji cha USBRS232.

Ili kuoanisha bandari ya COM ya Kompyuta na MK Yoyote atafanya kibadilishaji cha ishara za RS232 kuwa viwango vya ishara vya mantiki kutoka 0 hadi 3.3 V, kwa mfano, ADM3232 microcircuit. Njia ya maambukizi ya TXD bandari ya serial kompyuta, baada ya kubadilisha kiwango, inapaswa kushikamana na pembejeo ya PA10 ya microcontroller, na mstari wa mpokeaji wa RXD, kwa njia ya kubadilisha fedha sawa, kwa pato la PA9.

Ikiwa unahitaji kutumia saa ya MK isiyo na tete, unapaswa kuunganisha betri ya CR2032 yenye voltage ya 3 V na resonator ya quartz yenye mzunguko wa 32768 Hz kwake. Kwa kusudi hili, MK imewekwa na pini za Vbat/GND na OSC32_IN/OSC32_OUT. Pini ya Vbat lazima kwanza ikatishwe kutoka kwa basi ya umeme ya 3.3 V.

Vituo vya bure vilivyobaki vya MK vinaweza kutumika kama inahitajika. Ili kufanya hivyo, wanapaswa kushikamana na viunganisho ambavyo viko karibu na mzunguko wa bodi ya mzunguko iliyochapishwa kwa MK, kwa kulinganisha na maarufu. Vifaa vya Arduino na bodi ya maendeleo STM32VLDISCOVERY.


Mchele. 6. Tatua kifaa STM32VLDISCOVERY


Mchoro wa mzunguko wa umeme STM32VLDISCOVERY.

Kwa hivyo, kulingana na madhumuni na njia ya kutumia MK, unaweza kuunganisha vitu muhimu kwake kutumia vizuizi vingine vya kazi na bandari, kwa mfano, ADC, DAC, SPI, I2C, nk. Katika siku zijazo, vifaa hivi vitazingatiwa kwa undani zaidi.

KUPANGA
Leo, kampuni nyingi hutoa zana za kuunda na kurekebisha programu kwa vidhibiti vidogo vya STM32. Hizi ni pamoja na Keil kutoka ARM Ltd, IAR Embedded Workbench kwa ARM, Atol lic TrueStudio, CooCox IDE, GCC na Eclipse IDE. Msanidi programu anaweza kuchagua programu kulingana na upendeleo wake. Hapo chini tutaelezea zana ya zana ya Keil uVision 4 kutoka kwa kampuni ya Keil, ambayo inasaidia idadi kubwa ya aina za vidhibiti vidogo, ina mfumo uliotengenezwa wa zana za utatuzi na inaweza kutumika bila malipo na vizuizi kwa saizi ya nambari inayozalishwa ya kbytes 32. ambayo, kwa kweli, ni kiwango cha juu kwa vidhibiti vidogo vinavyozingatiwa).

Anza kwa urahisi na haraka na CooCox CoIDE.

Basi hebu tuanze. Nenda kwenye tovuti rasmi ya CooCox na upakue toleo la hivi karibuni la CooCox CoIDE. Ili kupakua unahitaji kujiandikisha, usajili ni rahisi na bure. Kisha sakinisha faili iliyopakuliwa na uikimbie.

CooCox CoIDE- mazingira ya maendeleo kulingana na Eclipse, ambayo, pamoja na STM32, inasaidia kundi la familia nyingine za vidhibiti vidogo: Freescale, Holtek, NXP, Nuvoton, TI, Atmel SAM, Energy Micro, nk. Kwa kila toleo jipya la CoIDE, orodha ya vidhibiti vidogo vinasasishwa kila mara. Baada ya kusakinisha CoIDE kwa mafanikio, endesha:

Dirisha la kuanza kwa Hatua ya 1 litaonekana, ambalo unahitaji kuchagua mtengenezaji wa microcontroller yetu. Bonyeza ST na uende kwenye Hatua ya 2 (kuchagua microcontroller), ambayo unahitaji kuchagua mfano maalum. Tuna STM32F100RBT6B, kwa hivyo bonyeza mfano unaolingana:

Upande wa kulia, dirisha la Usaidizi linaonekana sifa fupi kila chip. Baada ya kuchagua microcontroller tunayohitaji, tunaendelea hatua ya tatu, Hatua ya 3 - kuchagua maktaba zinazohitajika kwa kazi:

Wacha tuunde mradi rahisi wa kupepesa taa ya LED, kama ilivyo kawaida ya kujifunza vidhibiti vidogo.

Ili kufanya hivyo, tunahitaji maktaba ya GPIO, wakati imewezeshwa, CoIDE itakuomba kuunda mradi mpya. Bofya Ndiyo kwenye pendekezo hili, onyesha folda ambapo mradi wetu utahifadhiwa na jina lake. Wakati huo huo, CoIDE itaunganishwa na mradi mwingine 3 muhimu kwa maktaba kufanya kazi, na pia itaunda muundo wote muhimu wa mradi:

Jambo lingine nzuri kuhusu CoIDE ni kwamba ina uwezo wa kupakia mifano moja kwa moja kwenye mazingira ya maendeleo. Kwenye kichupo cha Vipengele unaweza kuona kuwa kuna mifano kwa karibu kila maktaba, bonyeza kwenye GPIO (na mifano 4) na uwaone:

Unaweza kuongeza mifano yako mwenyewe hapo. Kama unavyoona kwenye picha ya skrini hapo juu, mifano tayari ina msimbo wa kupepesa GPIO_Blink LED. Unaweza kubofya kitufe cha kuongeza na kitaongezwa kwa mradi, lakini kama faili iliyojumuishwa, kwa hivyo tutafanya kwa njia tofauti na kunakili msimbo mzima wa mfano kwenye faili kuu.c. Jambo pekee ni kuchukua nafasi ya GPIO_Blink (utupu) laini na int main(utupu). Kwa hivyo, bonyeza F7 (au chagua Mradi-> Jenga kutoka kwa menyu) ili kukusanya mradi na ... hakuna bahati kama hiyo!

Mazingira yanahitaji Mkusanyaji wa GCC, lakini hatuna. Kwa hivyo, nenda kwenye ukurasa wa Zana za GNU za Vichakata vilivyopachikwa vya ARM, chagua aina yako ya Mfumo wa Uendeshaji ulio upande wa kulia na upakue toleo jipya zaidi la mnyororo wa zana. Kisha tunaendesha faili na kusakinisha gcc toolchain. Ifuatayo, katika mipangilio ya CoIDE tutaonyesha njia sahihi ya mnyororo wa zana:

Bonyeza F7 tena (Mradi-> Jenga) na uone kuwa mkusanyiko ulifanikiwa:

Kinachobaki ni kuwasha microcontroller. Ili kufanya hivyo, lini Msaada wa USB Tunaunganisha bodi yetu kwenye kompyuta. Kisha, katika mipangilio ya debugger unahitaji kusakinisha ST-Link; ili kufanya hivyo, chagua Mradi-> Usanidi kwenye menyu na ufungue kichupo cha Debugger. Chagua ST-Link kutoka kwenye orodha ya kushuka na ufunge dirisha:

Wacha tujaribu kuangaza MK. Katika menyu, chagua Flash-> Upakuaji wa Programu (au bonyeza kwenye ikoni inayolingana kwenye upau wa vidhibiti) na uone kuwa MK imewashwa kwa mafanikio:

Tunaona taa ya LED kwenye ubao, nadhani haina maana kutoa video au picha, kwa sababu... kila mtu aliiona.

Pia, katika CoIDE wanafanya kazi modes mbalimbali kurekebisha, kufanya hivyo bonyeza CTRL+F5 (au kwenye menyu ya Debug->Debug):

Ni hayo tu. Kama unaweza kuona, kusanidi na kufanya kazi na CoIDE ni rahisi sana. Natumai nakala hii itakuhimiza kusoma vidhibiti vidogo vya STM32 vinavyoahidi sana na vya bei nafuu.

Iliyochapishwa 08/09/2016

Vidhibiti vidogo STM32 zinazidi kuwa maarufu kwa sababu ya nguvu zao, vifaa vya pembeni tofauti tofauti, na kubadilika. Tutaanza kujifunza kwa kutumia bodi ya mtihani wa bajeti, gharama ambayo haizidi $ 2 (kutoka kwa Kichina). Tutahitaji pia Kiungo cha ST programu, gharama ambayo ni karibu $ 2.5 (kutoka kwa Wachina). Kiasi kama hicho cha gharama kinaweza kumudu wanafunzi na watoto wa shule, kwa hivyo ninapendekeza kuanza na chaguo hili la bajeti.


Microcontroller hii sio nguvu zaidi kati ya STM32, lakini sio dhaifu pia. Zipo bodi mbalimbali Na STM32, ikiwa ni pamoja na Ugunduzi ambayo inagharimu takriban $20. Kwenye bodi kama hizo, karibu kila kitu ni sawa na kwenye bodi yetu, pamoja na programu. Kwa upande wetu, tutatumia programu kando.

Kidhibiti kidogo STM32F103C8. Sifa

  • Msingi wa ARM 32-bit Cortex-M3
  • Upeo wa mzunguko 72MHz
  • Kumbukumbu ya 64Kb ya Flash kwa programu
  • Kumbukumbu ya 20Kb SRAM
  • Ugavi wa umeme 2.0 … 3.3V
  • 2 x 12-bit ADC (0 ... 3.6V)
  • Kidhibiti cha DMA
  • 37 5V pembejeo/matokeo yanayostahimili
  • Vipima muda 4 16-bit
  • Vipima muda vya 2
  • I2C - 2 mabasi
  • UART - mabasi 3
  • SPI - mabasi 2
  • USB 2.0 kiolesura cha kasi kamili
  • RTC - saa iliyojengwa ndani

Inapatikana kwenye bodi ya STM32F103C8

  • Bandari za pato A0-A12, B0-B1, B3-B15, C13-C15
  • USB ndogo kupitia ambayo unaweza kuwasha bodi. Bodi ina kiimarishaji cha voltage 3.3V. Nguvu ya 3.3V au 5V inaweza kutolewa kwa pini zinazolingana kwenye ubao.
  • Kitufe Weka upya
  • Warukaji wawili BOOT0 Na BOTI1. Tutatumia wakati wa kuangaza kupitia UART.
  • Quartz mbili 8 MHz na 32768 Hz. Microcontroller ina multiplier frequency, hivyo juu ya 8 MHz quartz tunaweza kufikia upeo wa mzunguko kidhibiti 72MHz.
  • LED mbili. PWR- ishara kwamba nguvu hutolewa. PC13- imeunganishwa kwenye pato C13.
  • Kiunganishi cha programu Kiungo cha ST.

Kwa hiyo, hebu tuanze kwa kujaribu kuwasha microcontroller. Hii inaweza kufanywa kupitia UART, au kutumia programu Kiungo cha ST.

Unaweza kupakua faili ya majaribio kwa firmware. Mpango huo unaangaza LED kwenye ubao.

Firmware ya STM32 kwa kutumia adapta ya USB-Uart kwa Windows

Katika kumbukumbu ya mfumo STM32 Kuna Bootloader. Bootloader ni kumbukumbu katika hatua ya uzalishaji na microcontroller yoyote STM32 inaweza kupangwa kupitia interface USART kwa kutumia adapta ya UART-USB. Adapter vile mara nyingi hufanywa kwa misingi ya microcircuits maarufu FT232RL. Awali ya yote, kuunganisha adapta kwenye kompyuta na kufunga madereva (ikiwa inahitajika). Unaweza kupakua madereva kutoka kwa tovuti ya mtengenezaji FT232RL- ftdichip.com. Unahitaji kupakua viendeshaji VCP(bandari ya com virtual). Baada ya kufunga madereva, bandari ya serial ya virtual inapaswa kuonekana kwenye kompyuta yako.


Inaunganisha RX Na TX matokeo kwa pini zinazolingana UART1 kidhibiti kidogo. RX unganisha adapta kwa TX kidhibiti kidogo (A9). TX unganisha adapta kwa RX microcontroller (A10). Kwa kuwa UART-USB ina vyanzo vya umeme vya 3.3V, tutasambaza nguvu kwa bodi kutoka kwayo.

Ili kuweka microcontroller katika hali ya programu, unahitaji kuweka pini BOOT0 Na BOTI1 V hali inayotakiwa na uwashe upya kwa kifungo Weka upya au zima na uwashe nguvu ya kidhibiti kidogo. Kwa hili tuna jumpers. Mchanganyiko tofauti hulazimisha microcontroller katika njia tofauti. Tunavutiwa na hali moja tu. Kwa kufanya hivyo, microcontroller ina BOOT0 kunapaswa kuwa na mantiki, na matokeo BOTI1- sifuri kimantiki. Kwenye ubao hii ni nafasi ifuatayo ya kuruka:

Baada ya kubonyeza kitufe Weka upya au kukata na kuunganisha nguvu, microcontroller lazima iingie mode ya programu.

Programu ya firmware

Ikiwa tunatumia adapta ya USB-UART, jina la bandari litakuwa kitu kama hiki /dev/ttyUSB0

Pata maelezo ya chip

Matokeo:

Tunasoma kutoka kwa chip kwenye faili ya dump.bin

sudo stm32flash -r dump.bin /dev/ttyUSB0

Andika kwa chip

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

Matokeo:

Stm32flash 0.4 http://stm32flash.googlecode.com/ Ukitumia Kichanganuzi: Kiolesura Kibichi cha BINARY serial_posix: 57600 8E1 Toleo: 0x22 Chaguo la 1: 0x00 Chaguo 2: 0x00 Kitambulisho cha Kifaa: 0x0410 (0x0410) KBd -Medium-dens2 RAMs bootloader) - Mweko: 128KiB (ukubwa wa sekta: 4x1024) - Chaguo la RAM: 16b - RAM ya Mfumo: 2KiB Andika kwenye kumbukumbu Inafuta kumbukumbu Anwani iliyoandikwa na kuthibitishwa 0x08012900 (100.00%) Imefanywa. Inaanza kutekeleza kwa anwani 0x08000000... imekamilika.

Firmware ya STM32 inayotumia programu ya ST-Link ya Windows

Wakati wa kutumia programu Kiungo cha ST hitimisho BOOT0 Na BOTI1 hazitumiki na lazima zihifadhiwe ndani nafasi ya kawaida Kwa operesheni ya kawaida mtawala.

(Kitabu katika Kirusi)

kuashiria STM32

Familia ya kifaaAina ya bidhaaFamilia ndogo ya kifaaIdadi ya piniSaizi ya kumbukumbu ya FlashKifurushiKiwango cha joto
STM32 =
Kidhibiti kidogo cha 32-bit cha ARM
F = Kusudi la jumla
L = Nguvu ya chini kabisa
TS = TouchScreen
W = mfumo wa wireless-on-chip
60 = multitouch resistive
103 = mstari wa utendaji
F = pini 20
G = pini 28
K = 32 pini
T = 36 pini
H = 40 pini
C = pini 48/49
R = pini 64
O=pini 90
V = pini 100
Z = pini 144
Mimi = 176 pini
B = 208 pini
N = 216 pini
4 = Kbytes 16 za kumbukumbu ya Flash
6 = Kbytes 32 za kumbukumbu ya Flash
8 = Kbytes 64 za kumbukumbu ya Flash
B = Kbytes 128 za kumbukumbu ya Flash
Z = Kbytes 192 za kumbukumbu ya Flash
C = Kbytes 256 za kumbukumbu ya Flash
D = Kbytes 384 za kumbukumbu ya Flash
E = Kbytes 512 za kumbukumbu ya Flash
F = Kbytes 768 za kumbukumbu ya Flash
G = Kbytes 1024 za kumbukumbu ya Flash
I = Kbytes 2048 za kumbukumbu ya Flash
H = UFBGA
N=TFBGA
P = TSSOP
T = LQFP
U = V/UFQFPN
Y = WLCSP
6 = Kiwango cha joto cha viwandani, -40…+85 °C.
7 = Kiwango cha joto cha viwandani, -40…+ 105 °C.
STM32F103 C8 T6

Jinsi ya kuondoa ulinzi wa kuandika / kusoma?

Ikiwa ulipokea ubao na STM32F103, lakini programu haioni, hii ina maana kwamba Wachina wamelinda kumbukumbu ya Flash ya microcontroller. Swali "kwa nini?" tuipuuze. Ili kuondoa kuzuia, tutaunganisha adapta ya UART na programu kupitia hiyo. Tunaweka virukaji kwa programu na tunaenda:

Nitafanya hivi kutoka kwa Ubuntu kwa kutumia matumizi ya stm32flash.

1. Angalia ikiwa kidhibiti kidogo kinaonekana:

Sudo stm32flash /dev/ttyUSB0

Unapaswa kupata kitu kama hiki:

Stm32flash 0.4 http://stm32flash.googlecode.com/ Interface serial_posix: 57600 8E1 Toleo: 0x22 Chaguo la 1: 0x00 Chaguo la 2: 0x00 Kitambulisho cha Kifaa: 0x0410 (Uzito wa Kati) - RAM: hifadhi ya Flash 20 - 20x00 ya Boot 128KiB (ukubwa wa sekta: 4x1024) - Chaguo la RAM: 16b - RAM ya Mfumo: 2KiB

2. Ondoa ulinzi wa kusoma kisha uandike ulinzi:

Sudo stm32flash -k /dev/ttyUSB0 stm32flash 0.4 http://stm32flash.googlecode.com/ Kiolesura serial_posix: 57600 8E1 Toleo: 0x22 Chaguo 1: 0x00 Chaguo 2: 0x00 Kitambulisho cha Kifaa 1: 0x00 Kitambulisho cha Kifaa 1:0KiB-RAM 0x0 0x0 RAM 512b imehifadhiwa na bootloader) - Mweko: 128KiB (ukubwa wa sekta: 4x1024) - Chaguo la RAM: 16b - RAM ya Mfumo: 2KiB Kusoma-Kutolinda flash Imefanywa. sudo stm32flash -u /dev/ttyUSB0 stm32flash 0.4 http://stm32flash.googlecode.com/ Kiolesura serial_posix: 57600 8E1 Toleo: 0x22 Chaguo 1: 0x00 Chaguo 2: 0x00 Kitambulisho cha Kifaa 1: 0x00 Kitambulisho cha Kifaa 10 KB - 0xden RAM 0x0 - 0x0 Medium 512b imehifadhiwa na bootloader) - Mweko: 128KiB (ukubwa wa sekta: 4x1024) - Chaguo la RAM: 16b - RAM ya Mfumo: 2KiB Andika-bila ulinzi flash Imefanywa.

Sasa unaweza kufanya kazi kwa kawaida na microcontroller.

Microcontrollers kwa kittens

Meow kila mtu, paka :)

Siku moja, paka aliniacha: (Kweli, kwa nini kula valerian, niliamua kuanza biashara, kwa kusema, "kwa faida ya Nchi ya Mama." Kwa muda mrefu nilitaka kufanya kazi kwenye vifaa vya dijiti, lakini sikufanya kazi. sina wakati (unajua, ama kulala au paka hutembea juu ya paa), halafu wakati ulionekana. Kweli, wacha tuanze ..)

Kama kawaida, kila kitu huanza na chaguo. Kweli, inaonekana kama chaguo ni PIC ndogo au AVR. Kwa namna fulani niliipenda ya mwisho zaidi. Pia nilihitaji programu ya USB kwa sababu ya ukosefu wa bandari zingine kwenye kompyuta, bei ambayo karibu ilifanya mkia wangu uanguke. Pia kuna Arduino - mnyama kama huyo. Inaweza pia kupangwa kupitia USB. Vema, nafikiri, “kile tu daktari alichoamuru.” Katika kijiji chetu unaweza kupata tu kupitia duka la mtandaoni. Nilipata ofa bora, karibu kuinunua na... OOP! Natafuta - STM32VL-Discovery. Huyu ni mnyama wa aina gani? Hmm, STM32 .. Nilisikia kitu kutoka kwenye kona ya sikio langu .. Na sifa hufanya masharubu yangu kusimama mwisho, kwa uaminifu!

Na ana miguu mingi!

Kwa hivyo, kwa utaratibu:

  • Arduino ina bandari 14 za dijiti za I/O na pembejeo 6 za analogi. Ugunduzi wa STM32VL una pembejeo/matokeo 45 ya dijiti, 10 kati ya hizo zinaweza kubadilishwa kwa hiari kuwa pembejeo za analogi.
  • Arduino ina 32 KB ya hifadhi ya programu na 2 KB ya RAM. Ugunduzi wa STM32VL una 64 KB ya hifadhi ya programu na 8 KB ya RAM.
  • Kutoka kwa Arduino mzunguko wa saa Ugunduzi wa STM32VL una 16 MHz na 24 MHz.
  • Kidhibiti kidogo chochote cha STM32 kinaweza kubadilishwa na STM32 nyingine, lakini na sifa bora, bila kubadilisha mpango
  • STM32 inaweza kupangwa bila programu kutumia bandari ya COM(zaidi juu ya hili baadaye kidogo)
  • Bei ya Arduino wakati wa kuandika ni ~ rubles 1300, STM32VL-Discovery ~ rubles 600. Hii ni zaidi ya mara 2 nafuu!

Nini kinafuata? Ugunduzi wa STM32VL ina programu/debugger iliyojengwa, ambayo kwa harakati kidogo ya paw (kuondoa jumpers) inaweza kupanga na kurekebisha (debugging ni jambo muhimu sana, lakini zaidi juu ya hilo baadaye) microcontrollers STM32 nje ya bodi. Hii haitafanya kazi na Arduino. Hiyo ni, kwa kutumia STM32VL-Discovery tunaokoa pesa na kupata tija kubwa na uhuru wa ubunifu :)

Na vidhibiti vidogo vya STM32 wenyewe vinaonekana kuvutia zaidi kuliko wengine:

STM32F100C4T6B ATtiny24A-SSU PIC16F688-I/SL STM32F103RET6 ATmega1284P-PU PIC18F4550-I/PT
Bei ya wastani, kusugua 60 65 60 240 330 220
Mzunguko wa saa, MHz 24 20 20 72 20 48
Kumbukumbu ya Flash, KB 16 2 4 512 128 16
RAM, Baiti 4096 128 256 65536 16384 2048
UART, pcs. 2 0 0 5 2 0
SPI, pcs. 1 1 0 3 1 1
ADC, pcs. Biti 16x12 Biti 8x10 Biti 8x10 Biti 16x12 Biti 8x10 13x10Biti
DAC, pcs. Biti 1x12 0 0 Biti 2x12 0 0
Idadi ya mistari ya pembejeo / pato, pcs. 37 12 12 51 32 35

Na STM32 ni 32-bit, ambayo inamaanisha inaweza kufanya kazi na data 32-bit katika mzunguko wa saa moja. AVR na PIC haziwezi kujivunia hili.

Kweli, paka, una hakika? Kisha tuanze mwendo wa shujaa mchanga wa kidijitali!)

Inafanyaje kazi? Inajumuisha nini? Anaweza kufanya nini?

Kama unavyojua, paka wote ni wadadisi sana, na paka za redio haswa!

Microcontroller ni microcircuit ambayo inachanganya kazi za processor, peripherals, RAM, na kumbukumbu ya flash. Kama kompyuta, ndogo tu!

Wacha tufanye mlinganisho: kompyuta inadhibitiwa na mfumo wa uendeshaji, na microcontroller ni "firmware" unayoandika; mfumo wa uendeshaji wa kompyuta huhifadhiwa kwenye gari ngumu, "firmware" ya microcontroller imehifadhiwa kwenye kumbukumbu yake ya flash; Kazi za RAM ni sawa - kuhifadhi data inayobadilika wakati wa utekelezaji wa programu. Na MK pia ina vifaa mbalimbali vya pembeni, kama vile ADC na DAC kwa mfano.

MK anawasiliana na ulimwengu wa nje kwa kutumia miguu kwenye mwili wake (sio kama paka, bila shaka, lakini chuma). Lakini sio zote zinazodhibitiwa na programu, kuna pini za nguvu, pini ya kuweka upya, pini za nguvu za pembeni, nguvu chelezo. Na wale ambao wanadhibitiwa na mpango huo wamegawanywa katika vikundi vinavyoitwa "bandari". Matokeo haya yote yanayodhibitiwa yanaitwa kwa herufi 2 na nambari. Kwa mfano PA1: P - bandari, A - bandari "A", 1 - nambari ya pini ya bandari hii.

Katika programu, bandari zimesanidiwa kama pembejeo au pato, kama unavyotaka.

Pini za mlango uliosanidiwa kwa ingizo zinaweza kuwa ndani modes tofauti, kwa kila pato inaweza kuwa tofauti:

  • Ingizo la kidijitali ni ingizo ambalo thamani yake (mantiki 1 au 0) inaweza kusomwa na programu. Ikiwa voltage kwenye pembejeo ni 0, basi thamani ni 0, ikiwa voltage kwenye pembejeo ni sawa na voltage ya usambazaji, basi thamani ya pembejeo ni 1. Ya tatu haitolewa. Inaweza kufanywa na kontena ya kuvuta-up ama kwa nguvu au chini
  • Pembejeo ya Analog - pembejeo ambayo thamani yake inaweza kusomwa na programu, lakini kunaweza kuwa na maadili mengi - kama 4096. Kwa usahihi, kutoka 0 ikiwa voltage ya pembejeo ni 0 kuhusiana na usambazaji wa nguvu wa chini wa microcontroller hadi 4095. ikiwa voltage ya pembejeo ni sawa na voltage ya usambazaji. Mabadiliko haya yote yanafanywa na ADC - kibadilishaji cha analog-to-digital, kwa msaada wake unaweza, kwa mfano, kupima voltage kwenye thermistor na kujua hali ya joto, au kupima voltage kwenye photoresistor na kujua mwangaza. ya mwanga unaoanguka juu yake ... Naam, unaweza kuja na mambo mengi ikiwa una mawazo :) Ikiwa nguvu ya microcontroller kutoka 3V, basi 0V = 0, na 3V = 4096, ambayo ina maana 3/4096 = 0.000732421 , i.e. wakati voltage ya pembejeo inabadilika na 0.000732421V, thamani ya pembejeo katika programu inabadilika hadi 1. Sio ngumu sana, sawa? Endelea
  • Uingizaji wa dijiti katika hali mbadala ya kazi - pembejeo kwa kufanya kazi na vifaa vya pembeni. Kwa mfano, ingizo la kipima muda au ingizo la kiolesura fulani. Thamani ya ingizo hili haiwezi kusomwa kutoka kwa programu. Katika programu, kwa mfano, unaweza kusoma data iliyopokelewa kutoka kwa pato hili na kiolesura fulani.

Na mlango uliosanidiwa kwa ajili ya pato unaweza kuwa na pini katika njia zifuatazo:

  • Utgång. Njia tu ya kutoka. Pato la kawaida la dijiti. Kuna voltage ya usambazaji kwenye pini (mantiki 1) au hakuna voltage kwenye pini (mantiki 0). Ni rahisi.
  • Pato katika hali mbadala ya kazi - pato kudhibitiwa na vifaa vya pembeni. Pato hili haliwezi kudhibitiwa kutoka kwa programu, lakini programu inaweza kulazimishwa kudhibiti pato hili, kwa mfano kiolesura.

Lakini sio hitimisho zote zinaweza kupewa "kama unavyopenda." Ili kujua kile kinachowezekana na kisichowezekana, unahitaji kutazama nyaraka (Jedwali la 4) au kutumia programu ya MicroXplorer.

Kabla ya kutumia bandari, lazima kwanza uifunge - tuma mapigo ya saa kwa hiyo, kwa sababu mwanzoni hazitolewi kuokoa nishati. Unaweza kuchagua mzunguko wa saa tofauti - juu ya mzunguko, kasi ya pembejeo au matokeo ya kazi ya bandari hii, lakini pia juu ya matumizi ya nishati.

Pia kuna hitimisho BUTI 0 Na BUTI 1. Pini hizi si za bandari; hutumika kudhibiti upakiaji wa kidhibiti kidogo. Ikiwa wakati wa ugavi wa umeme kuna zero ya mantiki kwenye pini ya BOOT 0 (pini imeshikamana na hatua ya kawaida), kisha microcontroller hufanya programu iliyopakiwa kwenye kumbukumbu ya flash, i.e. Firmware yako. Ikiwa, wakati nguvu hutolewa, pini ya BOOT 0 ni ya kimantiki (pini imeunganishwa na usambazaji wa umeme wa microcontroller), na pini ya BOOT 1 ni sifuri ya kimantiki, basi kidhibiti kidogo hakitekelezeki firmware yako, lakini bootloader iliyorekodiwa na kiwanda. . Kumbuka hili! Utatumia hii sana unapofanya kazi na vidhibiti vidogo vya STM32! Wakati mwingine kupakia bootloader iliyorekodiwa kiwandani - njia pekee andika/ ubadilishe kidhibiti kidhibiti kidogo. Hii hutokea, kwa mfano, wakati wa kusanidi katika firmware pini ambazo programu imeunganishwa au wakati wa kuangaza firmware ya microcontroller bila kutumia programu. Hivyo kupendekeza sana Wakati wa kuunda bodi ya mzunguko iliyochapishwa, pini hizi (au angalau BOOT 0) zinapaswa kuwa mahali pazuri.

Kwa hiyo tulifikiri :) Sasa tunajua ni nini microcontroller na inajumuisha nini. Sasa tutajifunza kuhusu hekima zaidi na kuendelea na jambo la kuvutia zaidi - mazoezi!

Mpango katika microcontroller unatekelezwa hatua kwa hatua. Mzunguko mmoja wa processor ni hatua moja ya programu.

Kwa mfano, acha taa nyekundu na kijani ziwashe hadi kitufe kibonyezwe. Muda wa kila taa ni sekunde 5. Hapa kuna algorithm:

  1. Wacha tuangalie ikiwa kuna voltage kwenye pembejeo na kitufe? (kitufe hufunga pato la microcontroller kwa + usambazaji wa nguvu)
  2. Ikiwa hakuna voltage, basi taa nyekundu inakuja kwa sekunde 5, mwanga wa kijani hutoka, ikiwa kuna voltage, basi tunaanza tena.
  3. Inakagua tena
  4. Ikiwa hakuna voltage, basi mwanga wa kijani unakuja kwa sekunde 5, taa nyekundu inazima, ikiwa kuna voltage, basi tunaanza tena.
  5. Hebu tuanze upya

SIMAMA! Je, nikibonyeza kitufe huku mwanga umewashwa? Hakuna kitakachotokea! Kwa sababu programu inatekelezwa hatua kwa hatua, na hatua ya kuangalia kifungo cha kifungo ni wakati wa kubadili balbu za mwanga.
Ni haswa kwa kesi kama hizo kwamba kuna kitu kama hukatiza

Ukatizaji hufanya iwezekanavyo kukatiza utekelezaji wa programu kuu. Hii inaweza kufanyika ama kwa tukio la nje (kubonyeza kifungo, kutolewa kifungo, kupokea data, nk) au ndani (kwa timer au ni wakati wa kulisha paka, kwa mfano). Wakati usumbufu huu sana hutokea, subroutine huanza kutekeleza. Subroutines inaweza kuwa tofauti kwa aina tofauti za usumbufu, subroutines hizi zinaitwa kukatiza washikaji.

Wakati kidhibiti hiki cha kukatiza kinapomaliza kazi yake, programu kuu huanza kutekeleza kutoka mahali ambapo ilikatizwa.

Wacha tusimame!

Kweli, paka, ni wakati wa kuamka kwa miguu yako! Natumai tayari una ubao wa utatuzi? Au angalau microcontroller? Natumaini kuna :) Na ikiwa sio, basi hebu tukimbie kwenye duka! (na ikiwezekana si kwa soseji. Ingawa...) Je, ni mafundisho gani haya bila mazoezi?

Ni vizuri kuwa na bodi ya kurekebisha mara ya kwanza, kwa mfano STM32VL-Discovery, lakini ikiwa chura ananyongwa au bado huna sausage ya kutosha, basi unaweza kupita kwa microcontroller moja na RS-232 -> interface ya UART. kigeuzi (kwa mfano MAX3232) au USB -> UART (mfano FT232RL). Katika kesi hii, rubles 100 zinaweza kufanywa kabisa, lakini utakuwa na kufanya bodi ya mzunguko iliyochapishwa na solder angalau pini 48 0.3 mm kwa upana na pengo la 0.2 mm. Nilionya.

Kwanza unahitaji kushikamana na bodi ya kurekebisha au mtawala kwenye kompyuta.

Ikiwa una bodi ya maendeleo:

Kwa bodi ya kurekebisha, bila shaka, ni rahisi zaidi. Tunachukua kamba ya Mini-USB na kuunganisha bodi kwenye kompyuta, madereva yote yanapaswa kuwekwa moja kwa moja. Tazama STMicroelectronics STLink dongle katika meneja wa kifaa - ishara nzuri! Kweli, ikiwa kuna kitu kilienda vibaya na hakuna kitu kilichofanikiwa, hauitaji kukwaruza sofa, unahitaji tu kuja hapa na kusanikisha. STM32 ST-LINK shirika.

Kweli, ikiwa wewe ni mmiliki mwenye furaha wa kompyuta inayoendesha Windows 8, basi kabla ya kutekeleza hatua zilizo hapo juu unahitaji kufanya yafuatayo: Chaguo -> Badilisha mipangilio ya kompyuta -> Ni kawaida -> Chaguzi maalum za kupakua na uchague chaguo Inalemaza uthibitishaji wa sahihi ya dereva.

Ikiwa una microcontroller:

Ikiwa una microcontroller moja, basi lazima uwe na miguu ya moja kwa moja. Lakini sina shaka na wewe!

Kabla ya kuunganisha microcontroller kwenye kompyuta, inapaswa kuuzwa kwa bodi ya mzunguko iliyochapishwa. Kwa hili, pamoja na microcontroller na paws moja kwa moja, unahitaji angalau bodi ya mzunguko iliyochapishwa. Na kisha kuna ubunifu wako.

Kiwango cha chini cha kufanya kazi katika mchoro hapa chini:

Lakini hii ni kiwango cha chini kisichovutia.

Ongeza LED na vifungo (usisahau pini za BOOT), kama hii

Lakini kunaweza kuwa na shida na kutengenezea kiroboto hiki. Lakini natumai hawatatokea. Nilizunguka kuitengeneza kwa chuma changu ninachopenda cha Soviet 25 W na upana wa ncha 3/4 ya upana wa mtawala. Nimewahi matatizo zaidi na utengenezaji wa bodi ya mzunguko iliyochapishwa ... vizuri, kila mtu ana teknolojia yake mwenyewe.

Na adapta inahitaji kufanywa kwa UART kulingana na nyaraka za microcircuit uliyonunua.

Tunaunganisha pini za TxD na RxD kwenye bodi ya mzunguko iliyochapishwa na pini za RxD na TxD, kwa mtiririko huo, za adapta. Hebu tusisahau kuhusu hatua ya kawaida na lishe ya yote.

Uchaguzi na ufungaji wa programu

Tutatumia mazingira ya maendeleo Kitambulisho cha CooCox, lakini hii sio hivyo tu, lakini kwa sababu kadhaa:

  • Kwanza, ni programu inayosambazwa kwa uhuru. Hii ina maana kwamba karma yako itakuwa safi
  • Kwa maoni yangu (na sio yangu tu), mazingira haya ya maendeleo ni rahisi zaidi kuliko wengine
  • Inaruhusu matumizi ya utatuzi
  • Mifano mingi inayoweza kupakiwa katika mazingira ya ukuzaji (muhimu kwa paka na zaidi)

Mazingira ya ukuzaji ni programu ya usimbaji, mkusanyaji, na kitatuzi vyote kwa pamoja. Urahisi :) Lakini ikiwa paka fulani mkali wa Chelyabinsk ni rahisi zaidi kuandika msimbo (kwenye notepad, kwa mfano), kuandaa na kuangaza na programu tofauti - sijali, basi utahitaji matumizi ya STM32 ST-LINK ili kupakia firmware. kwenye microcontroller. Mmiliki ni muungwana, kama wanasema.

Mazingira haya ya maendeleo yanatokana na Eclipse inayojulikana sana.

  1. Twende hapa
  2. Poking Pakua kupitia CoCenter (Inapendekezwa)
  3. Ingiza anwani yako ya barua pepe (ni sawa, ipo "kwa maonyesho")
  4. Baada ya kupakua, sakinisha hii CoCenter
  5. Katika mstari wa kwanza ambapo inasema CooCox CoIDE piga Pakua
  6. Baada ya upakuaji kukamilika, badala ya Pakua mapenzi Sakinisha. Bonyeza hapa
  7. Twende hapa
  8. Haki kwenye safu Pakua pakua faili hiyo .exe. Hebu tusakinishe.
  9. Tunafungua wenyewe CooCox CoIDE, kichupo Mradi, Chagua Njia ya Toolchain.
  10. Tunaonyesha njia ya faili arm-none-eabi-gcc.exe (tulisakinisha hii katika hatua ya 8, njia ni takriban kama hii: D: Faili za Programu (x86) GNU Tools ARM Embedded4.7 2013q1bin)
  11. Kufungua tena CoIDE, vyombo vya habari Tazama -> Usanidi, fungua kichupo Kitatuzi na tunafanya hivi [picha]
  12. Tunafurahi kwa sababu sasa tunaweza kuandika programu na kuiingiza kwenye kidhibiti kidogo! Hiyo ndiyo tutafanya.

Ikiwa unayo chaguo bila bodi ya kurekebisha / programu, basi utahitaji programu ya kupakia programu kwenye MK. Mwanyesho wa Kipakiaji cha Flash ambayo iko

Tunapata lugha ya pamoja

Kabla ya kuandika programu yako ya kwanza, unahitaji kupata lugha ya kawaida na MK. Haiwezekani kwamba atajifunza lugha yetu, kwa hivyo tutalazimika kujifunza (au labda tu kukumbuka) lugha ambayo tutawasiliana na MK, hii ni C. Tunahitaji tu misingi (muundo wa programu, kazi, waendeshaji). Ikiwa unajua lugha hii, basi unaweza kwenda mara moja kwenye kipengee cha "Programu ya Kwanza", lakini nitawaleta wale ambao hawajui hadi sasa.

Mradi huo una faili zilizo na viendelezi .c Na .h. Ya kwanza ina kazi, ya pili ina majina ya kazi zinazotumiwa na mara kwa mara, kwa mfano. Ndivyo ilivyo. Faili muhimu zaidi iliyo na msimbo wa programu kuu.c. Kwa matumizi kazi mbalimbali unahitaji kujumuisha maktaba na vitendaji hivi. Wanaunganisha kwa kurekodi #pamoja na "jina_la_maktaba" Kweli, maktaba lazima ziwe kwenye mradi. Zimejumuishwa mwanzoni mwa faili.

Kazi ni sehemu ya kipekee ya programu. Kwa ujumla, mpango una kazi moja au zaidi. Utendaji unaonekana kama:

return_variable_type function_name (aina_inayobadilika)
{
Mwili wa kazi
}

Unaweza kutuma kigezo fulani kwa chaguo za kukokotoa, chaguo la kukokotoa litalichakata na kurudisha thamani fulani. Ni rahisi sana kutumia chaguo la kukokotoa kwa vitendo vinavyorudiwa mara kwa mara badala ya kuandika kila mara kipande kimoja cha msimbo; unaweza tu kutuma kibadilishio kwa chaguo la kukokotoa na kupokea thamani iliyochakatwa tena.

Kabla ya kutumia chaguo za kukokotoa, lazima itangazwe mwanzoni mwa faili. Wanafanya hivi:

return_variable_type function_name (aina_inayobadilika);

Ndio, nilisahau jambo muhimu zaidi! Lazima kuwe na nusu koloni mwisho wa kila mstari!

Ikiwa kazi hairudi chochote (kwa mfano, kuchelewa kwa muda, huvuta paka tu kwa mkia kwa wakati), basi aina imeonyeshwa. utupu.

Wakati wa kuanza, kazi daima inatekelezwa kwanza kuu ().

Kweli, inaonekana tumegundua kazi, uelewa utakuja na mazoezi tu.

Nilitaja hapo juu aina ya kutofautiana. Vigezo vyote vinaweza kuwa vya aina tofauti, hapa ndio kuu:

  • INT - tofauti ya aina hii inaweza tu kuwa nambari kamili kutoka -2147483648 hadi 2147483647
  • FLOAT - kutofautiana kwa aina hii ni nambari yenye usahihi wa hadi tarakimu 7 kutoka ± 1.5 * 10-45 hadi ± 3.4 * 1033
  • DOUBLE - nambari yenye usahihi wa hadi tarakimu 16 kutoka ±5*10-324 hadi ±1.7*10306
  • ULONG pia ni nambari kamili, lakini kutoka 0 hadi 18446744073709551615
  • NDEFU - nambari kamili kutoka -9223372036854775808 hadi 9223372036854775807
  • CHAR - tabia moja
  • BOOL ni tofauti ya kimantiki. Inaweza kuwa na maadili 2 pekee: kweli au si kweli.

Kamba (neno, sentensi) inaweza kuwakilishwa kama safu ya wahusika chapa chapa. Kwa mfano:

char string = "Neno";

Hapa, mabano ya mraba ni idadi ya wahusika katika mstari, "stroka" ni jina la safu.

Kabla ya kutumia kutofautiana, lazima itangazwe. (taja tu aina tofauti na jina)

  • + - nyongeza.
  • - - kutoa.
  • * - kuzidisha.
  • / - mgawanyiko.
  • = - kugawa thamani kwa kigezo.

Kwa mfano usemi a=b+c inamaanisha kugawa kwa kutofautisha a thamani ya jumla ya maadili ya vigezo b Na c.

  • ++ - ongezeko. Ongeza thamani ya kigezo kwa 1
  • -- - kupungua. Kupunguza thamani ya kigezo kwa 1

Kwa mfano usemi a++ inamaanisha kuongeza thamani ya kutofautisha a kwa 1 (sawa na a=a+1)

  • == - kulinganisha, ishara sawa. (USICHANGANYIKIWE NA KAZI)
  • != - kulinganisha, ishara "sio sawa".
  • < - kulinganisha, ishara "chini ya".
  • <= - kulinganisha, ishara "chini ya au sawa".
  • > - kulinganisha, ishara "zaidi".
  • >= - kulinganisha, ishara "kubwa kuliko au sawa".

Kwa mfano usemi a inakuwa kweli ikiwa thamani ya kutofautisha a chini ya thamani ya kutofautiana b na si kweli ikiwa maadili ni sawa au a zaidi b. Kujieleza a==b kweli kama a sawa b na uongo kama a si sawa b, LAKINI usemi a=b kweli Kila mara kwa sababu sio kulinganisha, ni mgawo wa kutofautisha a maadili tofauti b.

  • % - iliyobaki ya mgawanyiko

Kwa mfano kama a=5,b=3, basi thamani ya usemi a%b itakuwa sawa na 2 (tangu 5/3=1 (iliyobaki 2))

  • << - kuhama kidogo kuelekea kushoto. Bila kuingia kwa undani maana ya usemi huo a< katika lugha C itakuwa sawa na usemi a*2 b
  • >> - bitwise shift kulia. Kujieleza a >> b katika mpango ni sawa na usemi a/2 b
  • & - mantiki NA.
  • | - mantiki AU.
  • ~ - inversion.

Karibu nilisahau kukuambia kuhusu mizunguko. Msingi:

wakati (hali) (

mwili wa kitanzi

Mwili wa kitanzi (kila kitu ndani braces curly) inatekelezwa wakati hali ni kweli (mpaka hali inakuwa ya uwongo).

kwa (thamani_ya_awali; kitanzi_kimetekelezwa_mpaka, hatua) (

mwili wa kitanzi

Thamani_ya_Awali- thamani ya awali ya kukabiliana

Kitanzi_kitekeleze_mpaka - Hadi thamani gani imefikiwa kitanzi kinaendesha

Hatua - Je, kaunta inahesabu katika hatua gani?

Kwa mfano

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

mwili wa kitanzi

Hapa kuna thamani ya awali ya kutofautiana i sawa na 0, kitanzi kinaendesha hadi thamani ya kutofautisha i chini ya 10, kila wakati kitanzi kinatekelezwa kwa kutofautisha i 1 imeongezwa. Unaweza pia kubadilisha thamani ya kigezo moja kwa moja kwenye kitanzi.

ikiwa (hali) (

mwili 1

) mwingine (

mwili 2

Katika mpito wa masharti, "mwili 1" hutekelezwa ikiwa hali ni kweli na "mwili 2" hutekelezwa ikiwa hali hiyo si ya kweli. Pia kuna chaguo hili:

ikiwa (sharti 1) (

) vinginevyo ikiwa (sharti 2) (

Katika kesi hii, "mwili 1" hutekelezwa ikiwa "sharti 1" ni kweli, "mwili 2" hutekelezwa ikiwa "sharti 2" ni kweli. Kunaweza kuwa na idadi yoyote ya hali kama hizo, na kunaweza pia kuwa na nyingine.

Masharti yanaweza kuwa rahisi na yenye mchanganyiko: rahisi - usemi mmoja wa kimantiki, na mchanganyiko - semi kadhaa za kimantiki zilizounganishwa na ishara & (masharti ni kweli wakati hali zote zilizounganishwa na ishara hii ni kweli) au | (hali ni kweli ikiwa angalau hali moja iliyounganishwa na ishara hii ni kweli).

Jambo lingine muhimu ni maoni. Watakusaidia kujua mradi uliosahaulika :) au tu ili usisahau kitu. Unaweza kutoa maoni baada ya ishara // na hadi mwisho wa mstari au kuanza na wahusika /* na mwisho */ , katika kesi hii maoni yanaweza kuwa idadi yoyote ya mistari. Maoni hayaathiri ukubwa wa programu.

Kweli, hiyo inaonekana kuwa yote juu ya misingi. Inatosha kwa mara ya kwanza (hadi kuandika sehemu inayofuata ya kifungu)

Programu ya kwanza

Hebu tusikengeuke kutoka kwa mila (vinginevyo huwezi kujua) na tuanze na Hello World. Na njiani tutaendelea kufahamiana na microcontroller na kupata uzoefu, kwa kusema.

Fungua mazingira ya maendeleo:

Bofya Vinjari kwenye Hifadhi

Chagua ST

Kisha tutaona orodha ya maktaba zilizounganishwa.

Kwa programu yetu rahisi tutahitaji: Msingi wa CMSIS, Boot ya CMSIS, RCC, GPIO.

Maktaba Msingi wa CMSIS Na Boot ya CMSIS - zile za mfumo, lazima ziunganishwe

Maktaba RCC kwa kufanya kazi na mfumo wa muda

Maktaba GPIO kwa kufanya kazi na bandari za I/O

Sasa upande wa kushoto kwenye dirisha Mradi fungua faili kuu.c.

Kwanza tunahitaji kuunganisha maktaba zetu (CMSIS haihitaji kuunganishwa).

Tunaenda mwanzoni mwa programu na kuongeza mistari:

#pamoja na "stm32f10x_gpio.h"
#pamoja na "stm32f10x_rcc.h"

Ucheleweshaji utupu (int i) (
kwa (; i != 0; i--);
}

Hivyo. Hapa kwa utaratibu, kazi hairudi chochote, hivyo utupu, jina la kazi Kuchelewa, mara moja tangaza kutofautisha i aina int. Katika braces curly mwili wa kazi ni kitanzi kwa. Huu ni mstari wake wa kuingia. Thamani ya awali i hatubadiliki, kitanzi kinaendesha mpaka i sio sawa na sifuri (kama i inakuwa sawa na sifuri, mzunguko unaacha, kazi "imezimwa"). Kwa kila utekelezaji wa mwili wa kitanzi (mzunguko), kutofautiana i hupungua kwa 1. Hiyo ni Kiini cha mzunguko ni kurudia tu idadi sawa ya nyakati i. Wakati kitanzi kinaendesha, wakati unapita, kuchelewa hutokea.

Ni bandari gani inayowajibika ambayo matokeo yanaweza kupatikana katika hati za MK:

Ili kuweka bandari C, ongeza laini:

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC , WASHA);

Ongeza mstari kwenye programu:

GPIO_InitTypeDef GPIO_Init1;

Kwa mstari huu tulitangaza muundo GPIO_InitTypeDef- alimpa jina GPIO_Init kwa matumizi katika programu yetu zaidi.

Ni vigezo gani vinaweza kusanidiwa katika muundo huu na fomu gani wanayo, tunaangalia kila kitu sawa stm32f10x_gpio.h:

Sasa, ili kusanidi vigezo vya pini kwa kutumia muundo, unahitaji kuandika jina lake, weka dot na dirisha litatokea ambalo vigezo hivi vinaonyeshwa.

Bonyeza mara mbili kwenye mmoja wao, na inaonekana kwenye mstari, kisha uweke = (kabidhi) na uandike thamani kutoka stm32f10x_gpio.h

Tunafanya vivyo hivyo na vigezo vyote. Usisahau semicolon mwishoni mwa kila mstari!

GPIO_Init(GPIOC , &GPIO_Init);

Sasa tutapepesa macho! Tutapepesa kwa mzunguko, tutafunga kitanzi wakati. Hali ya mzunguko itakuwa 1. Moja ni kweli kila wakati, sifuri ni uwongo kila wakati ... hiyo ndio c'est la vie...

Ili kutumia sasa kwenye pato, unahitaji kuweka kidogo; ili kuzima pato, unahitaji kuweka upya biti. Jinsi ya kufanya hivyo - kila kitu ni sawa stm32f10x_gpio.h:

Tunafanya hivi:

wakati (1)(

GPIO_SetBits(GPIOC, GPIO_Pin_9);

Kuchelewa (200000);

GPIO_ResetBits(GPIOC, GPIO_Pin_9);

Kuchelewa (200000);

1 ni kweli kila wakati, ambayo inamaanisha kuwa kitanzi kitakuwa kitanzi.

GPIO_SetBits - kazi ya kuweka kidogo

GPIO_ResetBits - kazi ya kuweka upya kidogo

Kuchelewa (200000) - kwenye mstari huu utekelezaji wa programu huenda kwenye kazi Kuchelewa, ile ile ambayo mzunguko kwa. Nambari 200000 kwenye mabano hupitishwa kwa chaguo hili la kukokotoa kama kigezo i. (kumbuka mstari Ucheleweshaji utupu (int i)?) na kitanzi sawa kinatekelezwa katika kazi hii, mara zote 200,000. Ni haraka :) baada ya kumaliza mzunguko kwa kazi Delay inamaliza kazi yake kwa sababu yeye utupu, basi hairudishi chochote na programu inaendelea kutekeleza.

Kwa sababu wakati ni looped, basi LED juu, kuchelewa, LED mbali, kuchelewa kutafanywa katika kitanzi kutokuwa na mwisho. Mpaka nguvu itakapokatika au usumbufu kutokea (zaidi juu ya hilo katika makala inayofuata).

Kweli, programu ya kwanza iko tayari. Sasa bonyeza F7, programu inakusanya.

Sasa ikiwa una ubao wa kurekebisha, kisha uunganishe kwa kutumia kamba ya USB na ubonyeze Pakua Msimbo Ili Kumweka. Tunafurahi na kazi iliyofanywa na maarifa yaliyopatikana :)

Na ikiwa huna bodi ya kurekebisha, kisha uunganishe adapta iliyofanywa mapema kwenye ubao wako, na adapta kwenye bandari ya COM ya kompyuta. Ifuatayo, unganisha pato BUTI 0 na ugavi chanya wa nguvu ya microcontroller na kuwasha nguvu ya microcontroller. Hii itasababisha microcontroller kuingia katika hali ya firmware. Kwa ujumla, utaratibu wa firmware sio ngumu. Unahitaji tu kufuata maagizo ya programu Mwanyesho wa Kipakiaji cha Flash. Kwanza, onyesha nambari ya bandari ya COM ambayo microcontroller yako imeunganishwa na kasi. Ili kuepuka kushindwa, ni bora kuchagua kasi ya chini

Ikiwa programu inaona microcontroller yako, dirisha litaonekana ambalo litaandikwa ni kiasi gani cha kumbukumbu kina.

Baada ya kubofya "Ifuatayo", utaona ukurasa wa anwani ya kumbukumbu. Hatutahitaji.

Hatua inayofuata ni muhimu zaidi. Unaweza kuchagua kufuta kumbukumbu au firmware

Kwa firmware chagua Pakua kwa kifaa na shambani Pakua kutoka kwa faili chagua faili iliyokusanywa ya .hex, ambayo iko kwenye folda CooCox -> CooIDE -> nafasi ya kazi -> project_name -> project_name -> Debug -> Bin. Kisha bonyeza "Next" tena.

Baada ya kuona dirisha hili:

Zima nguvu kwa microcontroller na ufunge Mwanyesho wa Kipakiaji cha Flash, ondoa adapta, na uwashe kidhibiti kidogo ndani hali ya kawaida(Lini inapowashwa pin BOOT 0 imeunganishwa na usambazaji wa nguvu mdogo wa kidhibiti kidogo). Tunafurahi!

Kwa hivyo, sasa tunajua kwa nini vidhibiti vidogo vya STM ni bora kuliko vingine, tunajua jinsi kidhibiti kidogo kinavyofanya kazi, tunajua jinsi ya kuwasha kidhibiti kidogo kwenye ubao wa utatuzi na kwenye ubao wetu, tunajua misingi ya lugha ya C ambayo inahitajika kupanga programu. STM32, tumepata uzoefu wa kufanya kazi na kidhibiti kidogo (kwa matumaini chanya) na jambo kuu zaidi ni kwamba sasa unaweza kutambua maoni yako. vifaa vya digital maishani (na uwaambie kwenye RadioKot yetu tuipendayo)! Wanaweza bado kuwa rahisi, lakini kila kitu kinaundwa na uzoefu. Na katika makala zifuatazo nitajaribu kuzungumzia ADCs, DACs, interrupts, matumizi ya debugging na mambo mengine muhimu.

Una maoni gani kuhusu makala hii?

ST-Link/V2 kifaa maalum iliyotengenezwa na ST kwa utatuzi na utayarishaji wa vidhibiti vidogo vya mfululizo vya STM8 na STM32. Unaweza kusoma kuhusu kifaa chenyewe kwenye tovuti ya kampuni ya ST.

Vipengele vyake kuu:

    Toleo la 5V ili kuwasha kifaa

    USB 2.0 kiolesura cha kasi ya juu

    SWIM, JTAG/utatuzi wa mfululizo wa waya (SWD).

    Usaidizi wa kuogelea kwa hali za chini na za kasi ya juu

    SWD na kitazamaji cha waya cha serial (SWV)

    Uwezekano wa sasisho la Firmware

Kwa kuwa vidhibiti vidogo vya STM32 vimejengwa kwenye msingi wa ARM Cortex, ambao una kiolesura cha utatuzi cha SWD, ST-Link hukuruhusu kupanga na kutatua vidhibiti vidogo-vidogo 32 kulingana na ARM-Cortex.

Hii inaweza kusemwa kuwa programu ya kidhibiti kidogo cha STM8 pekee. Kuna watengenezaji programu wengine wote wa programu STM32.

Ninaweza kununua wapi programu ya STM8 STM32 ST-Link

Washa wakati huu Kuna maslahi mengi katika vidhibiti vidogo vya ST. Kwa hivyo, programu ya kiungo cha ST imeenea sana kwenye soko. Kuna matoleo kadhaa ambayo yanatofautiana kwa bei.

Kiungo cha asili cha ST kutoka ST ni, kama kawaida, chaguo ghali zaidi. Gharama ya zaidi ya 2,000 rubles.

Kiungo cha Mini ST (sawa na toleo letu la programu hii) hugharimu takriban 600 rubles. Unaweza kuuunua kutoka kwa wauzaji wakuu wa umeme - Compel, Terra Electronics na wengine.

Ali express (China) - hapa wanatoa idadi kubwa ya matoleo rahisi zaidi ya Mtayarishaji, lakini kwa ujumla, wote wanafanya kazi, wanaweza kutumika kwenye shamba. Kama sheria, zinafaa kwa programu STM8 na STM32. Jambo pekee ni kwamba hawana pato la SWO, lakini haihitajiki mara nyingi. Pengine hasi pekee hapa ni kusubiri kwa ununuzi. Gharama ni kuhusu rubles 150-200.

Ikiwa hauitaji programu ya STM8, lakini unahitaji tu safu ya STM32, basi bodi za Ugunduzi kutoka ST ni chaguo nzuri; pia wana programu ya kiunga cha ST kwenye ubao. Walakini, kama sheria, kiunganishi cha programu cha STM8 hakijapitishwa hapo.

Na bila shaka, unaweza tu kununua sehemu na kufanya kifaa hiki peke yake. Sio kwa msingi wa kidhibiti cha bei rahisi zaidi cha STM32, na sio rahisi sana kununua sehemu kwa bei rahisi, kwa hivyo gharama itakuwa kutoka rubles 300 hadi 400. Katika makala hii tutakuambia jinsi ya kukusanya kifaa hiki mwenyewe kutoka kwa seti ya vipengele muhimu vya SMD. Bila shaka, tunapendekeza uende kwa njia hii. Hii ndiyo njia pekee unayoweza kujifunza jinsi ya kufuatilia bodi, kuzitengeneza na kuziuza.

Jinsi ya kutengeneza programu ya ST-LINK V2

2. Andaa au ununue zana zinazohitajika: kila kitu cha kutengenezea, adapta ya USB UART (itahitajika kwa kupanga MK)

4. Pakua faili zinazohitajika kwa kifaa hiki kutoka kwa github.

5. Fanya ubao kwa kifaa mwenyewe (hii si vigumu kabisa, kila kitu kinaelezwa kwa undani katika maagizo yetu).

6. Unaweza kununua vipengele vyote muhimu katika duka yetu kwa 300 kusugua.

7. Solder vipengele vyote kwenye ubao, angalia yetu video.

KIFAA KIKO TAYARI, unaweza kuitumia!

Tafuta mzunguko wa programu ya ST Link, debugger

Kampuni ya ST yenyewe haitupatii mchoro wa kifaa hiki, hata hivyo, kuna michoro ya bodi zake za tathmini za mfululizo wa DISCOVERY, ambayo pia ina mchoro wa debugger. Kwa mfano hati UM0919. Lakini haijakamilika, kuna kiolesura cha SWD tu. Inategemea kidhibiti kidogo cha STM32F103C8T6.


Mzunguko wa pili, ulio katika hati ya UM1670, una pini za pato za SWIM, lakini hii tayari ni toleo la V2.2 kwenye microcontroller nyingine ya STM32F103CBT6.


Pia tulifanikiwa kupata saketi ya ST-LINK v2 kwenye Mtandao, iliyorejeshwa kutoka kwa kifaa asili:

Kutoka kwa nyaya hizi tatu tunahitaji kuendeleza mzunguko kwa kifaa chetu. Lakini kwanza, hebu tutengeneze mahitaji ya msingi ya kifaa ambacho tutatengeneza.

Mahitaji ya ST-LINK yetu

Tutatengeneza vifaa kulingana na STM8, pamoja na vichakataji vya STM32, NUVOTON Cortex-M0, ATMEL. Zote zitaendeshwa na 3.3V au 5V. Kwa hivyo, hatuhitaji uwezo wa kufanya kazi na vidhibiti vidogo katika 1.8V. Lakini uwezo wa kupanga STM8 yenyewe ni muhimu kabisa.

Tunatengeneza kifaa kwa madhumuni yetu, kwa hivyo hatuhitaji viunganishi vya kawaida vya SWIM na JTAG. Itafanya kiunganishi ambacho kinafaa zaidi kwa kufuatilia ubao.

Toleo la 2.2 kwenye kidhibiti kidogo cha STM32F103CBT6 kinaongeza sekunde Kifaa cha USB- bandari ya COM UART, lakini tayari tunayo, kwa hiyo hakuna maana ya kulipia zaidi, microcontroller ni ghali zaidi huko. Ni kweli anayo fursa nzuri- firmware kupitia interface ya DFU, yaani, microcontroller inaonekana kama gari la flash wakati limeunganishwa kupitia USB, na firmware inahitaji tu kunakiliwa kwenye diski. Lakini utahitaji kuiwasha mara moja, na kwa hili tuna adapta ya UART ya USB, mara ya kwanza utaiangaza kupitia hiyo. Sasisho zaidi za firmware zinafanywa kupitia programu kutoka ST kupitia USB. Tutafanya toleo la 2.0 kulingana na STM32F103C8T6.

Toleo la asili la ST-Link lina chip ya ubadilishaji wa kiwango, ambayo ni rahisi kwa utatuzi na firmware kifaa kilichokamilika, na ni muhimu kwa kufanya kazi na voltages chini ya 3.3V. Hatutakuwa na haya, na kufanya kazi na 5V na 3.3V, ubadilishaji wa kiwango sio lazima.

Tutatengeneza kifaa katika umbizo la dongle la USB; ipasavyo, kiunganishi cha kiume cha USB-A kitatumika.

Unaweza kuokoa kwa kulinda matokeo, kwa hivyo hatutatumia diodi za kinga. Kutakuwa na upinzani wa kutosha katika matokeo yote ya kiunganishi ikiwa tutawaunganisha ghafla kwa 5V au ardhi. Ni muhimu kukumbuka kuwa lazima utumie kifaa hiki kwa uangalifu! Angalia matokeo yote mara kadhaa wakati wa kuunganisha! Pato la 3.3V linalindwa zaidi; hupitia kidhibiti cha voltage ambacho hulinda dhidi ya nyaya fupi. Kwa hivyo, ni bora kuwasha mizunguko ya mtihani kutoka kwake!

Sasa tunaweza kuchora mchoro wa mwisho wa ST-Link yetu.

Kuna bodi nyingi zilizopangwa tayari na nyaya za kifaa hiki zinazotolewa kwenye mtandao, lakini kwa madhumuni ya mafunzo, tunajenga hasa mzunguko na kufanya bodi wenyewe, kulingana na DATASHEET iliyotumwa na mtengenezaji. Ikiwa unakili mchoro kutoka kwa tovuti nyingine yoyote, lazima uijue, ni nini kilifanyika huko na jinsi gani, kwa nini ulitupa au kuongeza baadhi ya vipengele.

Mpango wa mwisho

Unaweza kuona mchoro yenyewe kwenye faili za kifaa hiki. Tunawasilisha hapa ili kutoa maoni juu ya nodi kuu.

Sehemu kuu:


Nguvu na viunganishi:

Maoni madogo.

Kama kidhibiti cha nguvu cha 3.3V tunatumia NCP603 - LDO nzuri sana, hutoa mkondo wa hadi 300mA na kushuka kwa 300mv na usahihi wa + -3%. Viashiria vya LED ni LED za kawaida za SMD za rangi mbili. Ili kupanga kupitia UART, unahitaji kuunganisha pini ya BOOT0 kwenye +3V; ili kufanya hivyo, tutaiunganisha kwenye kiunganishi. Inahitajika pia kutoa UART yenyewe - miguu ya RX TX. Pini nyingine zote bila ulinzi zitaunganishwa kwenye kontakt. Nimekuwa nikitumia programu hii kwa zaidi ya mwaka mmoja sasa, na kumekuwa na mizunguko fupi na kuingiliwa - hakuna kitu ambacho kimewahi kuchomwa moto.

Miundo mingine huweka fuse ya kujiweka upya kwenye usambazaji wa nishati ya USB ili kulinda mlango yenyewe. Kompyuta za kisasa kuwa na ulinzi Bandari za USB, ikiwa ni pamoja na fuses na swichi za kupunguza sasa, kwa hiyo hazihitajiki. Lakini ni bora, bila shaka, si kuangalia hili, na si kuwa na makosa! Voltage ya 3.3V inatoka kwa LDO yetu, ambayo ina ulinzi dhidi ya mzunguko mfupi na overheating, na haina pato zaidi ya 600mA, hakuna cha kulinda huko pia.

Ni rahisi sana kuunganisha STM8 kwa programu kwa kutumia ST-Link, unahitaji waya 3 tu - nguvu, ardhi na pato la SWIM. Hii pia ni rahisi wakati wa bodi za waya; unaweza tu kuunganisha pato la SWIM; ardhi na nguvu zinaweza kupatikana kwenye ubao kila wakati.

Kuelekeza ubao katika Kicad kwa kutumia Topor autorouter

Katika adapta ya USB UART, tayari tumefanya mazoezi ya kufuatilia ubao katika Kicad kwa mikono. Kifaa hiki ni ngumu zaidi kidogo. Hapa unaweza kujifunza jinsi ya kuelekeza ubao TOPOR autorouter. Ni bora kutazama mchakato mzima kwenye video mwishoni mwa kifungu; kutakuwa na maoni madogo tu kwenye video.

Kuandaa bodi kwa autorouting

Ili kufanya kazi na Topor, lazima kwanza uandae bodi katika Kicad. Unahitaji kufafanua mipaka ya bodi, kuagiza vipengele vyote na kuziweka kabla. Hatuna mahitaji ya viunganisho, hivyo katika hatua ya kwanza ni bora kuondoa kontakt yenyewe kutoka kwa bodi. Kwa kuwa kila pini ya kiunganishi imeunganishwa kwa njia ya kupinga, vipinga vitakuwa hatua ya kumbukumbu kwa pini za kontakt. Pia, kupanga vipengele, unaweza kuondoa capacitors zote za nguvu, quartz, microcircuits za nguvu (ni bora kuziweka. upande wa nyuma- kwa kawaida kuna nafasi nyingi huko) - yote haya yanaweza kupangwa baadaye.

Sasa unahitaji kuamua upande wa kila sehemu. Na takriban nafasi yao kama ni lazima, kuweka viungio makali. Na katika hatua hii, unaweza kuhamisha yote haya kwa Topor na kuendelea kuweka vipengele hapo. Kiunganishi cha USB, LEDs huwekwa mara moja upande wa nyuma, kila kitu kingine ni upande wa mbele.

Kuweka Vipengele Kutumia Topor

Sasa tunahamisha haya yote kwa Topor na kuendelea huko. Nini nzuri kuhusu Topor? Ukweli ni kwamba kila wakati unapohamisha vipengele, unaweza kurekebisha njia zote moja kwa moja na uone ikiwa imekuwa bora au mbaya zaidi. Topor pia inaweza flip vipengele rahisi - resistors, capacitors. Ni muhimu kwetu kuelewa jinsi ya kupanga kwa urahisi zaidi pini za kiunganishi na sehemu kuu.

Baada ya kupotosha na kusonga vifaa huko Topor, tulikuja kwenye mpangilio huu:


Sasa unahitaji kuhamisha matokeo haya kwenye Kicad na kuongeza vipengele vilivyobaki. Kabla ya kufuatilia mwisho lazima:

    panga chips za nguvu

    unganisha kwa mikono mizunguko ya usambazaji wa umeme

    kupanga na kuunganisha quartz na capacitors nguvu

    fafanua tena pini za kiunganishi kwenye mchoro.

Njia ya kiotomatiki

Tunahamisha alama yetu ya nusu hadi Topor.

Ni muhimu mara moja kuanzisha sheria za uelekezaji - upana wa mapungufu, nyimbo, vipimo vya vias. Wakati wa kuagiza kutoka kwa Kicad kwa mara ya kwanza, tunahitaji kuchagua vipengele vyote na kuzirekebisha ili tuweze kuzifuta kwa urahisi na kifungo cha del na kuelekeza upya, na kuacha chaguo letu la nusu-mwongozo. Katika vigezo vya uelekezaji kiotomatiki, ni muhimu kuangalia kisanduku cha kuteua "Tumia uelekezaji uliopo kama chaguo la kwanza", vinginevyo uelekezaji wetu wa mwongozo utaelekezwa upya (tazama video ya mchakato wa kufanya kazi huko Topor).

Baada ya kuelekeza kiotomatiki, tunarudisha kila kitu na kuileta kwa toleo la mwisho - ongeza poligoni za udongo, panga njia inapobidi. Bodi iko tayari.

Toleo la mwisho la bodi

Upande wa mbele


upande wa nyuma

ST Link firmware, ufungaji wa dereva

Bodi iko tayari, tunaifanya kwa kutumia njia ya uhamisho wa toner baridi na acetone (au nyingine yoyote), piga, na kukusanya kifaa. Kabla ya kuiwasha kwa mara ya kwanza, hakikisha uangalie na multimeter yoyote kwamba hakuna upinzani kati ya 5V na GND (usio juu) - hii itahakikisha kuwa hakuna mzunguko mfupi. Pia unahitaji kuangalia upinzani kati ya 3.3V na GND.

Ili kufanya kazi na kifaa chetu, unahitaji kusakinisha madereva, kuiwasha kwa mara ya kwanza kupitia UART na firmware inayoanza na kisha usasishe firmware kwa toleo la hivi karibuni. programu maalum kutoka ST.

Vidhibiti vidogo vyote vya STM32 vina kifaa cha kupakia vifaa na huwashwa kupitia UART. Kwa firmware unahitaji:

Sasa tuna ST LINK, lakini kwa firmware ya zamani. Tunaondoa waya zote. Pakua programu ya kusasisha programu dhibiti ya STSW-LINK007 na programu ya kusasisha viendeshaji vya STSW-LINK009 ya Windows kutoka kwenye tovuti ya ST. Tunaingiza ST-Link mpya ndani Mlango wa USB kompyuta, na uzindua programu ya sasisho la programu, bofya CONNECT ndani yake na kisha usasishe firmware kwa toleo jipya zaidi. Kifaa kiko TAYARI! Sasa una kitengeneza programu-suluhishi na unaweza kuendelea na upangaji programu.

Kifaa kilichokamilika

Kazi ya kujitegemea

Fanya mazoezi ya kuunganisha ubao. Fanya kwa mikono, na au bila programu ya Topor. Unapaswa kuwa na uwezo wa kufanya haraka bodi yoyote rahisi.

Makala hii ni ya kwanza katika mfululizo uliopangwa wa makala juu ya kusoma programu ya microcontroller. Wakati wa kusoma vifaa anuwai, niligundua kuwa karibu zote huanza na ukweli kwamba anayeanza anaulizwa kupakua (au kutumia maktaba inayokuja na mazingira ya ukuzaji) kwa kufanya kazi na vifaa vya pembeni na kuitumia kuandika programu yake ya kwanza (kawaida. kuangaza kwa LED).

Hili lilinishangaza sana. Ikiwa unaamini makala haya, huhitaji hata kusoma hati ili kidhibiti kinachoweza kuratibiwa kupangwa. Nilifundishwa hekima "programu ya vifaa" tofauti kabisa.

Katika nakala hii, njia kutoka kwa kifungu "Ndio, nataka kujaribu!" mpaka wink ya furaha ya LED itakuwa ndefu zaidi kuliko ile ya waandishi wengine. Nitajaribu kufichua vipengele vya programu ya microcontroller ambayo imefichwa nyuma ya matumizi ya kazi za maktaba na mifano iliyopangwa tayari.
Ikiwa unakusudia kusoma kwa umakini upangaji wa microcontroller, nakala hii ni kwa ajili yako. Labda inaweza pia kuwa ya kupendeza kwa wale ambao wamecheza vya kutosha na Arduino na wanataka kupata mikono yao juu ya uwezo wote wa vifaa vya vifaa.

Kuchagua microcontroller

Wengi wanaweza kusema kuwa ni bora kuanza kujifunza vidhibiti vidogo na AVR, PIC, 8051 au kitu kingine. Suala hilo lina mambo mengi na yenye utata. Ninajua mifano ya kutosha ambapo watu, wamesoma Cortex-M, AVR iliyopangwa, ARM7, nk. Mimi mwenyewe nilianza na Cortex-M3. Ikiwa unakabiliwa na kazi maalum, kuna habari nyingi kwenye mtandao kulinganisha aina tofauti za microcontrollers na kazi ambazo wanaweza kutatua. Swali hili pia liliibuliwa kwa Habre, kwa mfano.

Tutafikiri kwamba tumegundua aina ya microcontroller. Lakini soko hutoa anuwai kubwa ya marekebisho tofauti kutoka kwa wazalishaji tofauti. Wanatofautiana katika vigezo vingi - kutoka kwa ukubwa wa kumbukumbu ya flash hadi idadi ya pembejeo za analog. Kwa kila kazi, uchaguzi unapaswa kufanywa mmoja mmoja. Hakuna mapendekezo ya jumla Haipo na haiwezi kuwa hapa. Nitagundua tu kuwa inafaa kuanza masomo yako na watengenezaji wa MK ambao wana safu kubwa zaidi inayowezekana. Halafu, wakati wa kuchagua MK kwa kazi maalum, kuna nafasi kubwa sana kwamba kitu kutoka kwa safu iliyowasilishwa kitakufaa.

Nilichagua STM32(ingawa nadhani ni bora kuanza kusoma na MK kutoka TexasInstruments - hati zimeundwa vizuri), kwa sababu zimeenea kati ya watengenezaji wa vifaa vya elektroniki vya Urusi. Ikiwa una matatizo yoyote au maswali, unaweza kupata ufumbuzi kwa urahisi kwenye vikao. Nyingine ya ziada ni uteuzi mpana wa bodi za maonyesho kutoka kwa mtengenezaji na mashirika ya tatu.

Unahitaji kujifunza nini?

Kwa bahati mbaya, kuanza programu ya MK, PC tu haitoshi. Itabidi upate bodi ya onyesho na programu mahali fulani. Ingawa hii inapunguza ushindani katika soko la ajira.

Mimi mwenyewe ninatumia ubao wa onyesho. STM3220G-EVAL na mpanga programu J-Link PRO. Lakini kwa wanaoanza, itakuwa ya kutosha UGUNDUZI wa STM32F4, ambayo inaweza kununuliwa bila matatizo yoyote kwa kiasi kidogo.

Mifano yote itakuwa mahsusi kwa bodi ya utatuzi UGUNDUZI wa STM32F4. Katika hatua hii, haitakuwa muhimu kwetu kwamba bodi hii ina MCU kulingana na msingi wa Cortex-M4. Hatutatumia vipengele na manufaa yake zaidi ya Cortex-M3 katika siku za usoni. Tutaona kitakachofuata.

Ikiwa una bodi nyingine yoyote kulingana na STM32F2xx/STM32F4xx, unaweza kufanya kazi nayo. Katika kuwasilisha nyenzo, nitajaribu kuelezea kwa undani zaidi iwezekanavyo. Kwa nini tunafanya hivi na si vinginevyo. Natumai hakuna mtu atakayekuwa na shida kuhamisha mifano kwa vifaa vingine.

Mazingira ya maendeleo

Kama ilivyotajwa mara nyingi, kwa Vidhibiti vidogo vya ARM Kuna idadi ya kutosha ya mazingira ya maendeleo, kulipwa na sio sana. Na tena ningependa kuacha mabishano juu ya jambo hili. Ninatumia IAR Iliyopachikwa Workbench kwa ARM 6.60. Mifano yote itakuwa katika mazingira haya. Ikiwa unapenda (au shirika lako linatumia) kitu kingine (Keil, Eclipse, CCS, CooCoc, n.k.) basi hii pia haitakuumiza. Nitalipa kipaumbele maalum kwa vipengele vinavyohusiana hasa na mazingira ya maendeleo.

Kwa nini mazingira ya maendeleo ya kulipwa?

Labda mtu hatafurahiya kabisa na ukweli kwamba ninapendekeza kutumia mazingira ya maendeleo ya kulipwa, lakini katika IAR inawezekana kupata leseni ya muda bila vikwazo vya utendaji, au leseni isiyo na ukomo na kikomo cha ukubwa wa kanuni (32KB kwa MK ni mengi sana. )
Kwa kuongeza, mara moja nitaona kwamba kwa baadhi ya MK haipo mazingira huru maendeleo. Na kwa bahati mbaya, MK hizi hazibadilishwi katika baadhi ya maeneo.


Sitaelezea mchakato wa ufungaji.

Wapi kuanza?

Kutengeneza Mradi
Kwanza, hebu tuunde mradi tupu. IAR hukuruhusu kuunda miradi katika ASM, C na C++. Tutatumia C.

Mradi tupu na faili kuu itaonekana mbele yetu.

Sasa unahitaji kusanidi mradi ili kuanza kufanya kazi na "yetu" MK na debugger. MK imewekwa kwenye ubao wa STM32F4DISCOVERY STM32F407VG. Lazima ichaguliwe katika sifa za mradi (Chaguzi za Jumla-> Lengwa-> Kifaa):

Unapochagua processor inayolengwa inayoweza kupangwa, maelezo yake yanapakiwa, ambayo hutoa fursa nyingi za kurekebisha (hii itajadiliwa hapa chini). Kwa kuongeza, faili ya usanidi inayoelezea nafasi inayopatikana ya anwani ya kiunganishi imeambatishwa kiotomatiki. Ikiwa ni lazima, tutagusa mada faili ya usanidi kiungo katika makala zifuatazo.

Baada ya hayo, unahitaji kusanidi debugger. Uharibifu wa programu hutokea moja kwa moja "katika vifaa". Hii inafanywa kwa kutumia kitatuzi cha JTAG. Unaweza kujifunza zaidi kuhusu jinsi hii inavyotokea kwenye Wikipedia. Kitatuzi cha ST-LINK/V2 kimeunganishwa kwenye ubao wa STM32F4DISCOVERY. Ili kufanya kazi na debugger, lazima uchague dereva wake kwenye menyu Kitatuzi-> Sanidi-> Kiendeshi. Inahitajika pia kuonyesha kuwa urekebishaji unapaswa kufanywa moja kwa moja kwenye vifaa. Ili kufanya hivyo, unahitaji kuweka bendera Kitatuzi-> Pakua->Tumia vipakiaji vya flash


Kwa wale walioona neno Simulator

Kwa nadharia, IAR hukuruhusu kutatua programu kwa kutumia kiigaji. Lakini sijawahi kuona kutumika katika mazoezi.

Sasa mradi uko tayari kwa kazi (programu, kujaza na kurekebisha).

"TZ" kwa mradi wa kwanza
Hebu tufanye muhtasari: MK na bodi ya utatuzi imechaguliwa, mradi umeandaliwa. Ni wakati wa kuamua juu ya kazi.

Wacha tusigeuke kutoka kwa classics. Mradi wa kwanza utakuwa LED inayowaka. Kwa bahati nzuri, ziko nyingi kwenye ubao. Hii ina maana gani kutoka kwa mtazamo wa programu? Kwanza kabisa, unahitaji kusoma mchoro wa mpangilio bodi ya maonyesho na kuelewa jinsi LED "inaanza".
inapatikana kwenye tovuti ya mtengenezaji. KATIKA maelezo haya kuna sehemu tofauti kuhusu LED kwenye ubao - 4.4 LEDs. Kwa mfano, tutatumia Mtumiaji LD3. Wacha tuipate kwenye mchoro:

Uchambuzi rahisi zaidi wa mzunguko unaonyesha kwamba ili "kuwasha" LED, unahitaji kutumia "1" kwenye pini ya MK (ambayo kwa MK hii inafanana na 3.3V). Kuzima kunafanywa kwa kutumia "0" kwenye kipini hiki. Katika mchoro pini hii imeteuliwa PD13(huenda hii ndiyo habari muhimu zaidi kutoka kwa waraka huu).

Kama matokeo, tunaweza kuandika "TK" kwa programu yetu ya kwanza:
Mpango wa MK lazima uhamishe hali ya pini ya MK PD13 kutoka kwa hali "0" hadi hali "1" na kurudi na upimaji fulani unaoonekana kwa jicho la mwanadamu (noti muhimu, ikiwa LED huangaza jicho mara nyingi sana. inaweza kuwa na uwezo wa kutofautisha hii).

Kabla ya kuanza programu, au nadharia kidogo
Kabla ya kuanza kutekeleza vipimo vyetu vya kiufundi, ni muhimu kuelewa jinsi MK inasimamiwa.

Wacha tuanze na ukweli kwamba MK yoyote inajumuisha msingi, kumbukumbu na vitengo vya pembeni. Nadhani kwa kumbukumbu kila kitu ni wazi kwa sasa. Acha niseme tu kwamba STM32 ina kumbukumbu ya flash ambayo programu ya MK imehifadhiwa (kwa ujumla, hii sio taarifa ya kweli, programu inaweza kuhifadhiwa kwenye kumbukumbu ya nje isiyo ya tete, lakini tutaipuuza kwa sasa) na data nyingine, ikiwa ni pamoja na data ya mtumiaji. Kuna pia SRAM - kumbukumbu ya ufikiaji bila mpangilio.

Msingi ni sehemu ya microcontroller ambayo hutekeleza mtiririko mmoja wa amri. Katika MK yetu aina ya msingi ni Cortex-M4. Msingi wa MK unaweza kulinganishwa na processor kwenye PC. Inaweza tu kutekeleza amri na kuhamisha data kwa vitengo vingine (wachakataji walio na vichapuzi vilivyounganishwa vya michoro hazizingatiwi katika ulinganisho huu).
Wakati huo huo, mtengenezaji wa MK hauendelezi msingi. Msingi hununuliwa kutoka kwa ARM Limited. Tofauti kuu kati ya MK tofauti iko kwenye pembezoni.

Vitalu vya pembeni ni vitalu vinavyoingiliana na "ulimwengu wa nje" au hufanya kazi maalum ambazo hazipatikani kwa msingi wa MK. MCU za kisasa (pamoja na STM32) zina anuwai kubwa ya vitengo vya pembeni. Vitengo vya pembeni vimeundwa kutatua kazi mbalimbali, kutoka kwa kusoma thamani ya voltage kutoka kwa pembejeo ya analog ya MK hadi kupeleka data kwa vifaa vya nje kupitia basi ya SPI.
Tofauti na msingi wa MK, vitengo vya pembeni havitekelezi maagizo. Wanatekeleza tu amri za kernel. Katika kesi hii, ushiriki wa kernel wakati wa kutekeleza amri hauhitajiki.

Mfano

Mfano ni kizuizi cha UART, ambacho kimeundwa kupokea na kusambaza data kutoka kwa MK hadi vifaa vya nje. Kernel inahitaji tu kusanidi kizuizi na kuipa data kwa usambazaji. Baada ya hayo, kernel inaweza kuendelea kutekeleza maagizo. Kitengo cha pembeni kina jukumu la kudhibiti pato la MK linalolingana kwa usambazaji wa data kwa mujibu wa itifaki. Kitengo cha pembeni yenyewe huhamisha pato la MK kwa hali inayohitajika "0" au "1" ndani wakati sahihi wakati wa kufanya uhamisho.

Mwingiliano wa msingi na kitengo cha pembeni
Uingiliano wa msingi wa MK na kitengo cha pembeni unafanywa kwa kutumia rejista maalum (pia kuna mwingiliano kupitia utaratibu wa usumbufu na DMA, lakini zaidi juu ya hayo katika machapisho yafuatayo). Kwa mtazamo wa kernel, hii ni kipande cha kumbukumbu na anwani maalum, hiyo sio kweli. Kuandika data kwa rejista maalum ni sawa na kupeleka amri au data kwa kitengo cha pembeni. Kusoma - kupokea data kutoka kwa kizuizi au kusoma hali yake. Maelezo ya vitalu vya pembeni na rejista zao maalum huchukua sehemu kubwa ya maelezo ya MK.

MUHIMU: Baada ya kuandika data kwenye rejista maalum na kisha kuisoma, unaweza kupata data tofauti kabisa. Kwa mfano, kutuma data kwa kizuizi cha UART kutuma, na kusoma data iliyopokelewa na kizuizi kutoka kifaa cha nje, unafanywa kwa kutumia rejista hiyo hiyo.

Rejesta maalum kawaida hugawanywa katika sehemu ndogo. Biti moja (au zaidi) hudhibiti kigezo maalum cha kizuizi cha pembeni, kawaida kwa kujitegemea. Kwa mfano, biti tofauti za rejista moja hudhibiti serikali exits tofauti MK.

Kumbuka C
Ikiwa wewe ni gwiji wa lugha C, unaweza kuruka sehemu hii kwa usalama. Inakusudiwa hasa kwa wale ambao walifundishwa (au ambao walijifunza wenyewe) kupanga kwa Kompyuta. Uzoefu unaonyesha kwamba mara nyingi watu hawakumbuki amri muhimu. Hapa nitakukumbusha kwa ufupi kuhusu shughuli za bitwise na kufanya kazi moja kwa moja na kumbukumbu kwenye anwani yake.

Kuandika data kwa anwani ya kumbukumbu

Wacha tufikirie kwamba kwa kusoma maelezo ya kitengo cha pembeni, tuligundua hiyo kwa hiyo operesheni sahihi unahitaji kuandika nambari 0x3B ndani yake. Anwani maalum ya usajili ni 0x60004012. Daftari ni 32-bit.
Ikiwa hujui mara moja jinsi ya kufanya hivyo, nitajaribu kuelezea mlolongo wa hoja ili kupata amri sahihi.

Thamani 0x60004012 si kitu zaidi ya thamani ya pointer kwa eneo la kumbukumbu. Hivi ndivyo tunahitaji kuonyesha katika programu yetu, ambayo ni, kufanya ubadilishaji wa aina kulingana na syntax ya lugha ya C:

(muda mrefu usiotiwa saini*)(0x60004012)

Hivyo tuna pointer kwa kipengele. Sasa unahitaji kuandika thamani inayotakiwa katika kipengele hiki. Hii inafanywa kwa kuondoa kiashiria. Kwa hivyo tunapata amri sahihi:

*(urefu usio na saini*)(0x60004012) = 0x3B;

Kuweka biti za kiholela kuwa 1

Tuseme unataka kuweka bits 7 na 1 kwa anwani 0x60004012 hadi "1" bila kubadilisha thamani ya bits nyingine zote kwenye rejista. Ili kufanya hivyo, unahitaji kutumia operesheni ya binary |. Nitakupa jibu sahihi mara moja:

*(muda mrefu usiotiwa saini*)(0x60004012) |= 0x82;

Zingatia ukweli 2. Bits huhesabiwa kutoka sifuri, sio kutoka kwanza. Operesheni hii inachukua angalau mzunguko wa saa 3 - kusoma thamani, kurekebisha, kuandika. Wakati mwingine hii haikubaliki kwa sababu kati ya kusoma na kuandika, thamani ya moja ya bits ambayo haturuhusiwi kubadilisha inaweza kubadilishwa na kitengo cha pembeni. Usisahau kuhusu kipengele hiki, vinginevyo mende zinaweza kuonekana ambazo ni vigumu sana kupata.

Kuweka biti za kiholela hadi 0

Wacha tufikirie kuwa tunataka kuweka bits 7 na 1 kwa anwani 0x60004012 hadi "0" bila kubadilisha thamani ya bits zingine zote kwenye rejista. Ili kufanya hivyo, unahitaji kutumia binary & operator. Nitakupa jibu sahihi mara moja:

*(muda mrefu usiotiwa saini*)(0x60004012) &= 0xFFFFFF7D;

Au nukuu yake rahisi (usijali kuhusu operesheni ya ziada, mkusanyaji atahesabu kila kitu mapema hata kwa uboreshaji mdogo):

*(urefu ambao haujasainiwa*)(0x60004012) &= (~0x82);

Baadhi ya vipengele vya programu za MK
Hapa nitajaribu kuelezea baadhi ya vipengele vya programu za MK ambazo ni muhimu kukumbuka. Mambo ni wazi kabisa, lakini bado.
Mpango hauna mwisho
Tofauti na programu nyingi za Kompyuta, programu ya MK haipaswi kuisha, KAMWE! Je, MK italazimika kufanya nini hasa baada ya kukamilisha programu yako? Swali ni la kivitendo la kejeli. Kwa hiyo, usisahau kuhakikisha kuwa haujasahau mzunguko wa milele. Ikiwa inataka, unaweza kuweka MK katika hali ya usingizi.
Tumia vigezo kamili
Licha ya ukweli kwamba tunatumia kidhibiti kidogo na msingi wa Cortex-M4, ambayo hufanya shughuli kwenye nambari za sehemu zinazoelea kwenye vifaa, nakushauri usizitumie. Katika kidhibiti kidogo bila msaada kwa shughuli kama hizo, wakati wa hesabu utakuwa mkubwa sana.
Epuka mgao wa kumbukumbu unaobadilika
Huu ni ushauri tu. Sababu ni rahisi - hakuna kumbukumbu ya kutosha. Mara nyingi nimekutana na maktaba ambazo zilikuwa na uvujaji wa kumbukumbu "polepole". Haikuwa ya kufurahisha sana wakati, baada ya wiki kadhaa za operesheni thabiti, MK ilianguka na hitilafu. Ni bora kufikiria kupitia usanifu wa programu yako mapema ili sio lazima utumie ugawaji wa kumbukumbu wenye nguvu.
Ikiwa bado unataka kuitumia, jifunze kwa uangalifu kazi ya meneja wa kumbukumbu au uandike yako mwenyewe.

Twende kazi!

Kufanya kazi kwenye mpango wa MK daima huanza na kusoma nyaraka. Kwa MK yetu inapatikana kwenye tovuti ya mtengenezaji. Kuna kurasa nyingi, lakini zisome zote Kwaheri hakuna haja. Kama ilivyoelezwa tayari, nyaraka nyingi zina maelezo ya vitengo vya pembeni na rejista zao. Pia nataka kuteka mawazo yako kwa ukweli kwamba Mwongozo huu wa Marejeleo haukuandikwa kwa MK moja, lakini kwa mistari kadhaa. Hii inapendekeza kwamba msimbo utabebeka wakati wa kuhamia MK zingine katika mistari hii (isipokuwa, bila shaka, ukijaribu kutumia vitengo vya pembeni ambavyo haviko kwenye MK unayotumia).

Kwanza kabisa, unahitaji kuamua ni vitalu gani vya kufanya kazi. Ili kufanya hivyo, soma tu sehemu Utangulizi Na Sifa kuu.

Udhibiti wa moja kwa moja wa hali ya pini za MK unafanywa kwa kutumia kizuizi cha GPIO. Kama ilivyoonyeshwa kwenye hati, STM32 MCU inaweza kuwa na hadi vitalu 11 vya GPIO huru. Vizuizi anuwai vya pembeni vya GPIO huitwa bandari. Bandari zimeteuliwa kwa herufi A hadi K. Kila mlango unaweza kuwa na hadi pini 16. Kama tulivyoona hapo awali, LED imeunganishwa kwa pini PD13. Hii inamaanisha kuwa pini hii inadhibitiwa na kitengo cha pembeni cha GPIO port D. Pin nambari 13.

Wakati huu hatutahitaji vitengo vingine vya pembeni.

Udhibiti wa saa ya pembeni
Ili kupunguza matumizi ya nguvu ya MK, karibu vitengo vyote vya pembeni huzimwa baada ya kuwasha MK. Kizuizi kinawashwa / kuzima kwa kutumia / kusimamisha usambazaji wa ishara ya saa kwa pembejeo yake. Kwa uendeshaji sahihi, ni muhimu kusanidi mtawala wa ishara ya MK ili kitengo cha pembeni kinachohitajika kupokea ishara ya saa.
Muhimu: Kitengo cha pembeni hakiwezi kuanza kufanya kazi mara moja baada ya ishara ya saa kuwashwa. Unahitaji kusubiri kupe chache hadi "kuanza". Watu wanaotumia maktaba vifaa vya pembeni, mara nyingi hata hawajui kuhusu kipengele hiki.

Rejesta zina jukumu la kuwezesha uwekaji saa wa vitengo vya pembeni RCC XXX saa ya pembeni wezesha rejista.Badala ya XXX kunaweza kuwa na matairi AHB1, AHB2, AHB3, APB1 na APB2. Baada ya kusoma kwa uangalifu maelezo ya rejista zinazolingana, tunaweza kuhitimisha kuwa saa ya kizuizi cha pembeni cha GPIOD imewashwa kwa kuweka "1" kwenye sehemu ya tatu ya rejista. Rejesta ya kuwasha saa ya pembeni ya RCC AHB1 (RCC_AHB1ENR):

Sasa unahitaji kujua jinsi ya kujua anwani ya rejista yenyewe RCC_AHB1ENR.

Maoni: Maelezo ya mfumo wa saa wa STM32 MK yanastahili makala tofauti. Ikiwa wasomaji wangependa, nitashughulikia sehemu hii kwa undani zaidi katika mojawapo ya makala zifuatazo.

Kuamua anwani maalum za rejista
Kuamua anwani za rejista maalum lazima kuanza kwa kusoma sehemu Ramani ya kumbukumbu katika mwongozo wa Marejeleo. Unaweza kuona kwamba kila kizuizi kimepewa sehemu yake ya nafasi ya anwani. Kwa mfano, kwa kizuizi cha RCC hii ni sehemu 0x4002 3800 - 0x4002 3BFF:

Ili kupata anwani ya rejista, ni muhimu kuongeza thamani ya awali ya nafasi ya anwani ya kuzuia RCC Addr. kukabiliana rejista inayohitajika. Anwani kukabiliana imeonyeshwa pia katika maelezo ya rejista (tazama picha ya skrini hapo juu).

Matokeo yake, tumeamua anwani ya rejista RCC_AHB1ENR- 0x4002 3830.

Kizuizi cha GPIO
Kwa uelewa wa jumla wa kizuizi cha GPIO, ninapendekeza sana kusoma sehemu nzima ya Mwongozo wa Marejeleo. Kwa sasa huwezi kulipa kipaumbele sana Hali mbadala. Tutaacha hilo baadaye.

Sasa kazi yetu ni kujifunza jinsi ya kusimamia hali ya pini za MK. Wacha tuende moja kwa moja kwa maelezo ya rejista za GPIO.

Hali ya uendeshaji
Kwanza kabisa, unahitaji kuweka hali ya uendeshaji ya pin 13 ya bandari D kama Hali ya jumla ya pato, ambayo inamaanisha kuwa kizuizi cha GPIO kitadhibiti hali ya pini ya MK. Njia ya uendeshaji ya pini za MK inadhibitiwa kwa kutumia rejista Rejesta ya hali ya bandari ya GPIO (GPIOx_MODER) (x = A..I/J/K):

Kama inavyoonekana kutoka kwa maelezo, kufanya marekebisho tunayohitaji, tunahitaji kuandika thamani 01b kwenye bits 26-27 za rejista. GPIOx_MODER. Anwani ya rejista inaweza kuamua kwa kutumia njia sawa na ilivyoelezwa hapo juu.

Inasanidi vigezo vya uendeshaji wa pini za pato za mlango wa GPIO
Kizuizi cha GPIO hukuruhusu kutumia mipangilio ya ziada kwa pini za bandari za pato. Mipangilio hii inafanywa katika rejista:
  • Sajili ya aina ya pato la bandari ya GPIO (GPIOx_OTYPER)- weka aina ya pato push-pull au open-drain
  • Rejesta ya kasi ya pato la bandari ya GPIO (GPIOx_OSPEEDR)- kuweka kasi ya pato
Hatutabadilisha vigezo hivi, kwa kuwa tunafurahiya sana maadili ya msingi.
Kuweka thamani kwenye pini ya MK
Hatimaye, tumefikia wakati wa kudhibiti hali ya pato la MK. Kuna njia mbili za kuweka thamani ya pato kwenye pini maalum ya MK.

Tunatumia rejista ya kuweka/weka upya bandari ya GPIO (GPIOx_BSRR)

Kuandika "0" au "1" kwa bits 0-16 husababisha mabadiliko yanayolingana katika hali ya pini za bandari. Ili kuweka thamani fulani katika pato la pini moja au zaidi za MK na si kubadilisha hali ya wengine, itakuwa muhimu kutumia uendeshaji wa kurekebisha bits binafsi. Operesheni hii inafanywa kwa angalau mizunguko 3. Ikiwa ni muhimu kuandika 1 kwa bits fulani na 0 kwa wengine, basi angalau mzunguko wa saa 4 utahitajika. Njia hii hutumiwa vyema kubadilisha hali ya pato kwa hali yake tofauti ikiwa hali yake ya asili haijulikani.

GPIO lango la kuweka/rejesha upya (GPIOx_BSRR)

Tofauti na njia ya awali, kuandika 0 kwa bits yoyote ya rejista hii haitaongoza kwa chochote (na kwa ujumla, bits zote ni kuandika tu!). Kuandika 1 hadi bits 0-15 itasababisha "1" kuwekwa kwenye pato linalofanana la MK. Kuandika 1 hadi bits 16-31 itaweka "0" kwenye pato linalofanana la MK. Njia hii ni bora kuliko ile ya awali ikiwa unahitaji kuweka thamani maalum kwenye pini ya "MK" badala ya kuibadilisha.

Hebu tuwashe LED!
Baada ya kupata anwani za rejista zote muhimu, unaweza kuandika programu inayowasha LED:
void main() ( //Washa saa ya bandari ya D *(isiyo na saini*)(0x40023830) |= 0x8; //kucheleweshwa kidogo kwa GPIOD jitayarishe tete bila kusainiwa kwa muda mrefu i=0; i++; i++; i++; i=0; / /Weka PD13 kama matokeo ya madhumuni ya jumla *(muda ambao haujasainiwa*)(0x40020C00) = (*(urefu ambao haujasainiwa*)(0x40020C00)& (~0x0C000000)) | (0x04000000); //WASHA LED! *(isiyo sainiwa kwa muda mrefu*) (0x40020C14) |= 0x2000; huku(1);)
Inaweza kukusanywa ( Mradi-> Unganisha) na kujaza ( Mradi-> Pakua-> Pakua programu inayotumika) Au endesha utatuzi ( Mradi->Dpwnload na Utatuzi) na kuanza utekelezaji (F5).
LED iliwaka!
LED inayowaka
Kumweka kwa LED sio kitu zaidi ya kuwasha na kuzima mbadala kwa kuchelewesha kati ya vitendo hivi. Njia rahisi ni kuweka na kuzima katika kitanzi cha milele, na kuingiza kuchelewa kati yao.
void main() ( //Washa saa ya bandari ya D *(isiyo na saini*)(0x40023830) |= 0x8; //kucheleweshwa kidogo kwa GPIOD jitayarishe tete bila kusainiwa kwa muda mrefu i=0; i++; i++; i++; i=0; / /Weka PD13 kama pato la madhumuni ya jumla *(muda ambao haujasainiwa*)(0x40020C00) = (*(urefu ambao haujasainiwa*)(0x40020C00)& (~0x0C000000)) | (0x04000000); huku(1) (// WASHA LED *( muda ambao haujatiwa saini*)(0x40020C14) |= 0x2000;//Kuchelewa kwa(i=0; i<1000000 ;++i); //Turn LED OFF *(unsigned long*)(0x40020C14) &= ~0x2000; //Delay for(i=0; i<1000000 ;++i); } }
Thamani ya kuchelewa ya 1,000,000 ilichaguliwa kwa majaribio ili kipindi cha blinking cha LED kionekane kwa jicho, lakini haikuwa ndefu sana.
Kuboresha algorithm
Ubaya wa mbinu iliyochaguliwa ya kupepesa ya LED ni kwamba msingi wa MK hutumia wakati wake mwingi kwenye vitanzi tupu, ingawa inaweza kuwa inafanya kitu muhimu (kwa mfano wetu hakuna kazi zingine, lakini zitaonekana katika siku zijazo).

Ili kuepuka hili, counter ya mzunguko hutumiwa, na hali ya MK pin swichi wakati mpango unapitia idadi fulani ya mizunguko.
void main() ( //Washa saa ya bandari ya D *(isiyo na saini*)(0x40023830) |= 0x8; //kucheleweshwa kidogo kwa GPIOD jitayarishe tete bila kusainiwa kwa muda mrefu i=0; i++; i++; i++; i=0; / /Weka PD13 kama matokeo ya madhumuni ya jumla *(muda ambao haujasainiwa*)(0x40020C00) = (*(urefu ambao haujasainiwa*)(0x40020C00)& (~0x0C000000)) | (0x04000000); huku(1) (i++; ikiwa(!(i) %. = ~0x2000; ))
Lakini hata hapa haitakuwa na shida; na mabadiliko katika idadi ya amri zinazotekelezwa ndani ya mzunguko, kipindi cha kuangaza kwa LED (au kipindi cha utekelezaji wa amri zingine kwenye mzunguko) kitabadilika. Lakini katika hatua hii hatuwezi kupigana na hii.

Kidogo kuhusu utatuzi
IAR hukuruhusu kutatua programu moja kwa moja kwenye maunzi. Kila kitu kinaonekana sawa na kurekebisha programu ya PC. Kuna hali ya utekelezaji wa hatua kwa hatua, kuingiza kazi, kutazama maadili ya vigezo (Katika hali ya kurekebisha Tazama->Tazama->Tazama1/4).

Lakini kwa kuongeza hii, inawezekana kutazama maadili ya rejista za kernel, rejista maalum za vitengo vya pembeni (Tazama-> Usajili), nk.
Ninapendekeza sana kwamba ujitambulishe na uwezo wa debugger wakati wa kujifunza programu ya MK.

Maneno machache kwa kumalizia

Labda wengi watasema kuwa kuandika kwa mikono katika programu sio sahihi, kwani mtengenezaji hutoa faili na ufafanuzi wa rejista na uwanja kidogo, maktaba za kufanya kazi na vifaa vya pembeni na zana zingine ambazo hufanya maisha iwe rahisi kwa msanidi programu. Ninakubaliana kabisa na hili, lakini bado ninaamini kwamba hatua za kwanza katika programu ya MK lazima zichukuliwe kwa kuchimba nyaraka kwa manually, kwa kujitegemea kuamua rejista muhimu na mashamba kidogo. Sio lazima kutumia hii katika siku zijazo, lakini hakika unahitaji kujua jinsi ya kuifanya.
Hapa kuna sababu chache tu za kauli hii:
  • Wakati mwingine maktaba kutoka kwa mtengenezaji huwa na makosa! Wakati fulani nilikaribia kukosa tarehe ya mwisho ya mradi kwa sababu ya hii. Niliuza tena chip mara kadhaa, nikifikiri kwamba kioo kilikuwa kimeharibiwa wakati wa soldering (hii ilikuwa imetokea hapo awali). Shida ilikuwa kwamba anwani ya rejista maalum iliingizwa vibaya kwenye maktaba. Hii kawaida hufanyika na mistari ya MK au MK ambayo imeingia sokoni.
  • Maktaba za kufanya kazi na vifaa vya pembeni kutoka kwa wazalishaji wengine hazitekelezi uwezo wote wa vitengo vya pembeni. Nilitenda dhambi hasa kwa hili Mwangaza wa Micro, ambazo baadaye zilinunuliwa na TI. Ilinibidi kuandika uanzishaji wa vifaa vya pembeni kwa mikono.
  • Watu wengi huzoea kuanzisha programu ya MK kwa kusoma mifano. Ninaamini kwamba kwanza unahitaji kuamua nini kinakuwezesha kutekeleza MK. Hii inaweza kueleweka tu kwa kusoma nyaraka. Ikiwa kitu haipo katika mifano, hii haimaanishi kuwa vifaa haviungi mkono. Mfano wa mwisho ni msaada wa vifaa vya PTP STM32. Bila shaka, unaweza kupata kitu mtandaoni, lakini haijajumuishwa katika kuweka kiwango kutoka kwa mtengenezaji.
  • Viendeshi vya vitengo vya pembeni kutoka kwa watengenezaji wengine vimeboreshwa sana hivi kwamba kubadili hali ya pini kwa kutumia maktaba huchukua hadi mizunguko 20 ya saa. Hii ni anasa isiyoweza kumudu kwa baadhi ya kazi.

Asante kwa kila mtu ambaye alisoma chapisho langu, iligeuka zaidi kuliko nilivyotarajia mwanzoni.
Natarajia maoni yako na ukosoaji wa sababu. Ikiwa wale wanaoisoma wana hamu, nitajaribu kuendeleza mfululizo wa makala. Labda mtu yeyote ana mawazo kuhusu mada ambayo yangefaa kuzungumzia - nitafurahi kuyasikia.