Talaan ng mga Nilalaman:

Kaya, Naglo-load ka ng STM32duino Bootloader sa Iyong "Blue Pill" Kaya Ano Ngayon ?: 7 Hakbang
Kaya, Naglo-load ka ng STM32duino Bootloader sa Iyong "Blue Pill" Kaya Ano Ngayon ?: 7 Hakbang

Video: Kaya, Naglo-load ka ng STM32duino Bootloader sa Iyong "Blue Pill" Kaya Ano Ngayon ?: 7 Hakbang

Video: Kaya, Naglo-load ka ng STM32duino Bootloader sa Iyong
Video: Humprey - Nagloko ka rin naman (Lyrics) 2024, Hulyo
Anonim
Kaya, Naglo-load ka ng STM32duino Bootloader sa Iyo
Kaya, Naglo-load ka ng STM32duino Bootloader sa Iyo
Kaya, Naglo-load ka ng STM32duino Bootloader sa Iyo
Kaya, Naglo-load ka ng STM32duino Bootloader sa Iyo

Kung nabasa mo na ang aking mga itinuturo na nagpapaliwanag kung paano mag-load ng STM32duino bootloader o anumang iba pang katulad na dokumentasyon, subukan mo ang halimbawa ng pag-load ng code at….hindi maaaring mangyari ang lahat.

Ang problema ay, marami, kung hindi lahat ng mga halimbawa para sa "Generic" STM32 ay hindi gagana sa labas ng kahon. Kakailanganin ang mga menor de edad na pagbabago upang magtrabaho pagkatapos sa iyong board na "Blue Pill" na STM32.

Pipili ako ng mga halimbawa ng 4 na code upang ipaliwanag kung ano ang kailangang baguhin at bakit. Ang mga code ay: "BlinkWithoutDelay", "Fading", "Dimmer" at "AnalogInSerial".

Tandaan HINDI ako nag-code ng anuman. Naglalabas lang ako ng mga menor de edad na pagbabago sa mga code na nilikha ng:

David A. Mellis at huli na binago ni Tom Igoe, Marti Bolivar at ilang mga kaso ni Scott Fitzgerald

Tom Igoe at huli na binago ni Bryan Newbold

Kaya, mas gusto kong panatilihin ang mga pangalan ng may-akda kahit sa mga code na binago ko, pinapanatili ang kredito ng paglikha.

Hakbang 1: Mga Pins at Pin…. Bakit Hindi Gumana ang Code?

Mga Pins at Pin…. Bakit Hindi Gumagawa ang Code?
Mga Pins at Pin…. Bakit Hindi Gumagawa ang Code?

Hayaan tingnan ang STM32 "Blue Pill" na naka-pin out. Ang mga pin na tala ay makikilala bilang PA1 o PC2 ….. Isang bagay na tulad nito.

Kung titingnan mo, halimbawa, halimbawa ng code na "BlinkWithoutDelay", ang pin ay idineklara bilang "33"…. Bakit?

Pinaghihinalaan ko na dahil si G. Marti Bolivar ay nag-port ng code na ito para sa board ng MAPLE.

Sa palagay ko hindi iyon ang kanyang intensyon na hayaan ang code na katugma sa mga board na "Blue Pill".

Ang mga maple at Maple mini board pin ay ipinahayag bilang bilang, tulad ng Arduino, bagaman gumagamit sila ng mga bilang tulad ng 33, 24 at ilang tulad nito.

Sinabi kong hindi gumagana ang code? Ang pagkakamali ko. Ang compile ng code nang walang anumang error at pag-upload ng tama sa "Blue Pill", sa gayon, ang palagay ko ito ay talagang gumagana, ngunit ang paggamit ng isang output ng GPIO ay hindi namin inaasahan. Maaaring hindi man magamit.

Napakaliit na pagbabago ang kinakailangan sa code upang gumana ito tulad ng inaasahan.

Hakbang 2: "tukuyin" natin ang Ilang Mga Pins …

Tara na
Tara na

Ito ay isang mahusay na kasanayan sa code na idineklara ang mga mapagkukunan na madaling makilala o nangangahulugang mga variable o pare-pareho. Hahayaan ka nitong mas madaling maunawaan at ma-troubleshoot ang code.

Ginamit ko ang pagdeklara ng mga Arduino na pin tulad nito:

Const int ledPin = 13;

…"

Kung gusto mo ako, marahil ay tinatanong mo ang iyong sarili: "Paano ko maipapahayag ang mga pin na may mga pangalan tulad ng PC13 ???"

Ang sagot ay: Gumamit ng "#define" na pahayag ng C.

Kaya, ayon sa draw na pinout, ang PC13 ay ang pin na nakasakay sa LED sa "BluePill". Upang magamit ito, idedeklara kong ganito, pagkatapos lamang ng kahulugan ng mga aklatan (# isama …) at bago ang anupaman:

# tukuyin ang LedPin PC13

…"

Tandaan na WALANG ";" pagwawakas ng linya, NOR "=" pagtatalaga.

Ihambing ang parehong mga code. Ang isa ay ang orihinal na halimbawang na-load mula sa IDE. Pangalawa ay ang ginawa kong pag-aayos upang magtrabaho kasama ang "BluePill".

Masidhi kong inirerekumenda na ideklara ang lahat ng mga pin na balak mong gamitin sa code. Kahit na ang mga balak na gamitin bilang ADC input (higit pa tungkol dito sa paglaon).

Gagawin nitong madali ang iyong buhay.

Hakbang 3: PinMode ()… Paano Mo Gagamitin ang Iyong Mga Pins…

Bago magpatuloy, hayaan mong maunawaan ang PinMode () funtion.

Tulad ng Arduino, maraming mga pag-andar ang STM32 pin. Ang pinakasimpleng paraan upang pumili ng isa o iba pa ay ang paggamit ng pahayag na pinMode ().

Ang Arduino ay mayroon lamang 3 mga mode na magagamit, INPUT, OUTPUT, o INPUT_PULLUP.

Ang STM32, sa kabilang banda ay may maraming mga lasa ng pinMode (). Sila ay:

OUTPUT -Mga pangunahing digital na output: kapag ang pin ay TAAS, ang boltahe ay gaganapin sa + 3.3v (Vcc) at kapag ito ay mababa, ito ay hinila pababa sa lupa

OUTPUT_OPEN_DRAIN -Sa bukas na mode ng pag-alis, ang pin ay nagpapahiwatig ng "mababa" sa pamamagitan ng pagtanggap ng kasalukuyang daloy sa lupa at "mataas" sa pamamagitan ng pagbibigay ng mas mataas na impedance

INPUT_ANALOG -Ito ay isang espesyal na mode kung kailan gagamitin ang pin para sa mga analog (hindi digital) na binabasa. Pinapagana ang ADC conversion na maisagawa sa boltahe sa pin

INPUT_PULLUP -Ang estado ng pin sa mode na ito ay iniulat sa parehong paraan tulad ng sa INPUT, ngunit ang boltahe ng pin ay dahan-dahang "hinugot" patungo sa + 3.3v

INPUT_PULLDOWN -Ang estado ng pin sa mode na ito ay iniulat sa parehong paraan tulad ng sa INPUT, ngunit ang boltahe ng pin ay dahan-dahang "hinila pababa" patungo sa 0v

INPUT_FLOATING -Synonym para sa INPUT

PWM -Ito ay isang espesyal na mode kung kailan gagamitin ang pin para sa PWM output (isang espesyal na kaso ng digital output)

PWM_OPEN_DRAIN-Tulad ng PWM, maliban sa halip na alternating cycle ng LOW at HATAAS, ang boltahe sa pin ay binubuo ng mga alternating cycle ng LOW at lumulutang (naka-disconnect)

(tala: nakuha mula sa

Bubuksan ko lamang ang panaklong na ito dahil kapag nagsimula kang lumikha ng iyong sariling code, mag-ingat na gumamit ng tamang pinMode () para sa iyong pangangailangan.

Hakbang 4: AnalogWrite () Versus PwmWrite ()… Analog Output sa 2 Flavors

AnalogWrite () Versus PwmWrite ()… Analog Output sa 2 Flavors
AnalogWrite () Versus PwmWrite ()… Analog Output sa 2 Flavors
AnalogWrite () Versus PwmWrite ()… Analog Output sa 2 Flavors
AnalogWrite () Versus PwmWrite ()… Analog Output sa 2 Flavors

Bago gamitin ang "Blue Pill" GPIO pin kinakailangan na ideklara ang pag-uugali nito, ibig sabihin, kung paano ito gagana. Iyon mismo ang ginagawa ng pagpapaandar ng pinMode ().

Kaya, hinayaan nating pagtuunan ngayon kung paano ang tamang pagtatakda ng isang analog output. Maaari itong ideklara alinman sa OUTPUT mode o PWM mode.

Parehong paraan, ang mga halaga ng analog ay maaaring maiugnay sa GPIO sa 2 paraan: analogWrite () o pwmWrite (), NGUNIT, gagana ang analogWrite () gagana lamang kung pinMode () = OUTPUT. Sa kabilang banda, ang pwmWrite () AY gagana lamang kung pinMode () = PWM.

Hinahayaan nating kumuha ng PA0, halimbawa: ito ay isang kandidato sa analog / pwm na output.

analogWrite (): ipinahayag nito sa ganitong paraan:

….

#define ledPin PA0

pinMode (ledPin, OUTPUT);

analogWrite (ledPin, <number>);

……"

kung saan ang numero ay dapat nasa pagitan ng 0 at 255, tulad ng Arduino. Sa totoo lang, ito ay paatras na tumutugma sa Arduino.

pwmWrite (): ideklara sa ganitong paraan:

#define ledPin PA0

pinMode (ledPin, PWM);

pwmWrite (ledPin, <number.>);

…."

Kung saan ang numero ay dapat na nasa pagitan ng 0 ~ 65535, isang resolusyon na mas mataas kaysa sa Arduino.

Sa mga imahe posible na ihambing sa pagitan ng 2 mga code. Maaari mo ring makita ang orihinal na code.

Hakbang 5: Serial na Komunikasyon ng STM32

Serial na Komunikasyon sa STM32
Serial na Komunikasyon sa STM32

Tingnan natin kung paano nakaayos ang mga interface ng USART sa STM32. Oo, mga interface sa maramihan…..

Ang "Blue Pill" ay mayroong 3 USART's (RX / TX 1 ~ 3), at, kung gumagamit ka ng isang bootloader ay pinapayagan kang gumamit ng USB, hindi ito nakakonekta sa alinman sa pagkatapos.

Nakasalalay sa iyong paggamit o hindi sa USB, kailangan mong ideklara ang serial port sa isa o ibang paraan sa iyong code.

Kaso 1: Paggamit ng USB:

Sa ganitong paraan, ang mga sketch ay nai-download nang direkta sa pamamagitan ng USB. Hindi na kailangang ilipat ang BOOT0 jumper sa 1 posisyon at bumalik sa 0.

Sa kasong ito, anumang oras na ideklara mong "Serial" na walang index, nangangahulugang komunikasyon sa pamamagitan ng USB.

Kaya, ang Serial1, nangangahulugang TX / RX 1 (Pins PA9 at PA10); Ang Serial2, nangangahulugang TX / RX 2 (pin PA2 at PA3) at Serial 3 ay nangangahulugang TX / RX 3 (Pin PA10 at PA11).

Ito ang paraan ng pagtatrabaho namin. Magpapakita ako ng mga pagbabago sa mga halimbawa para sa ganitong paraan ng pag-coding.

Isa pang bagay: ang "Serial USB" ay hindi kailangang magsimula. Sa madaling salita, "… Serial.begin (15200);" ay hindi kinakailangan.

Posibleng tumawag sa anumang pagpapaandar ng Serial (Serial.read (), Serial.write (), atbp) nang walang anumang pagsisimula.

Kung sa ilang kadahilanan ay naroroon ito sa code, hindi ito papansinin ng tagatala.

Kaso 2: Paggamit ng TTL seria sa USB adapter:

Sa ganitong paraan, hindi sinusuportahan ng bootloader ang katutubong pakikipag-usap sa STM32 USB, kaya kailangan mo ng isang USB sa serial adapter na konektado sa TX / RX 1 (pin PA9 at PA10) upang mag-upload ng mga sketch.

Sa kasong ito, anumang oras na "Serial" na walang index ay code, nangangahulugang TX / RX1 (ginamit na port upang i-upload ang code). Kaya't, ang Serial1 ay tumutukoy sa TX / RX 2 (mga pin na PA2 at PA3) at ang Serial2 ay tumutukoy saTX / RX 3 (Pins PA10 at PA11). Walang magagamit na Serial3.

Hakbang 6: Pagpasa ng isang Halaga sa Microcontroller

Pagpasa ng isang Halaga sa Microcontroller
Pagpasa ng isang Halaga sa Microcontroller

Ang halimbawa ng dimmer ay isang simpleng paraan upang maipakita kung paano ipasa ang isang halaga sa microcontroller.

Ipagpalagay nito na pumasa sa isang halaga mula 0 hanggang 255 upang makontrol ang liwanag ng LED.

Hindi ito gagana tulad ng inaasahan sa Blue Pill na dapat bayaran:

  1. Upang magamit ang pwmWrite () function, ang pinMode () DAPAT na ideklara bilang PWM mode.
  2. Hindi ka makakakuha ng buong numero ng 3 digit. Ang function ng Serial.read () ay nakakakuha lamang ng nilalaman ng buffer, na isang "BYTE". kung nagta-type ka ng "100" at pinindot ang "enter", ang huling "0" lamang ang makukuha mula sa buffer. At ang halaga nito ay magiging "48" (decimal ASCII na halaga para sa "0"). Kung balak na maglabas ng halagang "100", kinakailangang i-type ang "d". Kaya, tama na sabihin na magko-convert ito ng isang ASCII simbolo halagang decimal sa LED brightness, tama ??…. Well, isang uri ng…
  3. Ang problema, ang mga halaga ng mapa nang direkta mula sa pagpapaandar ng Serial.read () ay isang pagkilos na trick. Ito ay halos tiyak na makakuha ng hindi inaasahang mga halaga. Ang mas mahusay na diskarte ay ang nilalaman ng buffer ng imbakan sa isang pansamantalang variable at Kaysa mapa ito.

Tulad ng ipinaliwanag ko dati sa item 2, ang code na ipinakilala ko ang mga pagbabago ay magpapahintulot sa pagpasok ng isang simbolo ng ASCII at makokontrol nito ang LED brightness batay sa ASCII decimal na halaga nito … halimbawa, ang "space" ay halagang 32 (sa totoo lang ay ang pinakamababang nai-print na character na maaari mong ipasok) at ang "}" posible na pinakamataas (halagang 126). Ang ibang mga character ay hindi mai-print na isa, kaya hindi maiintindihan ng terminal o posible silang isang tambalan ng character (tulad ng "~" ay isang patay na susi sa aking keyboard at hindi gagana nang tama). Nangangahulugan ito, ang character na tambalang ito, kapag pumasok sa terminal, ay magpapadala ng character mismo at iba pa. Karaniwan isang hindi nai-print na isa. At ang huling isang code na ito ay makukuha. Gayundin, tandaan na ang iyong Terminal, sa kasong ito, ay HINDI magpapadala alinman sa "Carriage Return" o "Line Feed". Dapat mong bigyang pansin ito upang gumana nang tama ang code.

Kung nahulog ka ay maliit na nakalilito, napakasama …..

Hakbang 7: At Kung Nais Kong Mag-type ng Tatlong Digit …. o Kahit Higit Pa ??

At Kung Nais Kong Mag-type ng Tatlong Digit …. o Kahit Higit Pa ??
At Kung Nais Kong Mag-type ng Tatlong Digit …. o Kahit Higit Pa ??

Makatanggap ng maraming character mula sa isang serial na komunikasyon ay hindi isang simpleng gawain.

Ang serial buffer ay FIFO byte tumpok ng mga chars. Anumang oras ang function ng Serial.read () ay tumatawag, ang unang ipinadala na char ay tinanggal mula sa tumpok at nakaimbak sa ilan kung saan pa. Karaniwan isang char variable sa code. Tandaan, nakasalalay sa hardware, karaniwang may timeout para sa kung paano mapapanatili ng log buffer ang impormasyon.

Kung balak mong maglagay ng higit sa isang digit sa pamamagitan ng serial, kailangan mong "bumuo" ng isang character na string ayon sa character, habang papasok sila sa UART buffer.

Nangangahulugan ito na basahin ang pagbibisikleta sa bawat buffer char, mag-imbak sa isang variable ng temp, i-load ito sa unang posisyon ng isang string array, lumipat sa susunod na posisyon at magsimula muli, hanggang sa … mabuti, nakasalalay sa application. Mayroong 2 paraan upang wakasan ang ikot:

  1. Gumagamit ng ilang character na "marka ng pagtatapos", tulad ng "Carriage Return" o "Line Feed". Kaagad na natagpuan ang char na "end Mark", nagtatapos ang loop.
  2. Bilang kahalili, ang bilang ng mga character sa string chain ay maaaring limitado, kaya gawin, bilang ng mga interactive na cycle. Kapag naabot nito ang hangganan, sasabihin nating, 4, kumuha ng mga nakagawiang gawain sa pagtatapos ng ito mismo.

Hayaang tingnan ang isang simpleng halimbawa kung paano ito gagawin:

  • Magtakda ng isang "end" char, tulad ng '\ n' (nangangahulugan ito ng feed ng linya na ASCII char).
  • looping samantala Serial.available () ay totoo
  • ang pag-iimbak ng Serial.read () na nagreresulta sa isang pansamantalang variable ng char. Tandaan: sa lalong madaling Serial.read () na talagang "nagbabasa" ng buffer, malinis ito at susunod na pag-load ng character dito.
  • dagdagan ang isang variable ng string sa char na ito
  • Kung ang huling char ay "end" exit sa loop.

Karaniwan, ang gawain para sa pagkuha ng serial character array ay mukhang larawan.

Ito ay batay sa isang malawak na pagbagay ng orihinal na code ni G. David A. Mellis.

Malaya upang magamit at subukan ito. Tandaan: ang mga halagang DAPAT ipasok sa 3 digit na format.

Ito ito ngayon Ito ay masyadong kumplikado upang masakop dito at nararapat na pagmamay-ari nito ng Infectables.

Inaasahan kong matulungan ka nitong gumamit ng mga halimbawa sa Blue Pill at bigyan ka ng kaunting kaliwanagan kung gaano tamang code para sa maliit na board na ito.

Magkita-kita sa paligid sa ibang itinuturo.

Inirerekumendang: