- Paghahanda ng Hardware
- Pag-unawa sa mga GPIO Pinout sa STM8S103F
- Paglalarawan ng Pinout at Mga Tip para sa STM8S103F GPIO Selection
- Programming STM8S para sa GPIO Input at Output gamit ang SPL
- Pag-upload at Pagsubok sa Program
Para sa mga microcontroller, isang LED blinking program ay katumbas ng programang "hello world". Sa aming nakaraang tutorial, natutunan namin kung paano magsimula sa STM8S103F3 Development Board at kung paano i-set up ang IDE at tagatala upang mai-program ang aming mga STM8S Controller. Natutunan din namin kung paano gamitin ang karaniwang mga paligid ng aklatan, at kung paano sumulat at mai-upload ang code sa aming microcontroller. Sa lahat ng mga pangunahing kaalaman na sakop, hinahayaan na magsimula talagang magsulat ng code. Sa tutorial na ito, matututunan natin kung paano magsagawa ng pangkalahatang mga pag-andar ng GPIO sa mga kontrol sa STM8S. Ang board ay mayroon nang onboard LED na konektado sa pin 5 ng port B, matututunan natin kung paano i-blink ang LED na ito at magdagdag din ng isang panlabas na LED at kontrolin ito ng isang push-button. Kung ganap kang bago, lubos na inirerekumenda na basahin ang nakaraang tutorial bago ka magpatuloy sa anumang karagdagang.
Paghahanda ng Hardware
Bago kami sumisid sa programa, handaang handa ang mga koneksyon sa hardware. Tulad ng nabanggit nang maaga, gagamit kami ng dalawang LEDs dito, ang isa ay isang onboard LED na kung saan ay magpikit ng tuloy-tuloy at ang isa ay isang panlabas na LED na mapapalitan ng isang pindutan ng push. Ang ideya ay upang malaman ang lahat ng pagpapaandar ng GPIO sa isang simpleng pag-set up. Ang on-board Led ay konektado na sa PB5 (pin5 ng PORTB), kaya nakakonekta ko lang ang isang LED sa PA3 at isang push-button sa PA2, tulad ng nakikita mo sa diagram sa ibaba.
Ngunit, sa lahat ng mga output pin na magagamit sa aming kinokontrol bakit pinili ko ang PA3 para sa output at PA2 para sa pag-input? Ang mga katanungan ay wasto at ipapaliwanag ko sa ibang pagkakataon sa artikulong ito. Ang aking pag-set up ng hardware para sa tutorial na ito ay ipinapakita sa ibaba. Tulad ng nakikita mo, nakakonekta ko rin ang aking programmer ng ST-link sa mga pin ng programa na hindi lamang iprogram ng aming board ngunit gagana rin bilang isang mapagkukunan ng kuryente.
Pag-unawa sa mga GPIO Pinout sa STM8S103F
Bumabalik ngayon sa tanong, bakit PA2 para sa pag-input at bakit PA3 para sa output? Upang maunawaan iyon, tingnan natin nang mas malapit ang pinout ng microcontroller na ipinakita sa ibaba.
Alinsunod sa diagram ng pinout, mayroon kaming apat na port sa aming microcontroller, lalo, PORT A, B, C, at D na tinukoy ng PA, PB, PC, at PD ayon sa pagkakabanggit. Ang bawat GPIO pin ay clubbed din sa ilang iba pang mga espesyal na pag-andar. Halimbawa, ang PB5 (pin 5 ng PORT B) ay hindi lamang maaaring gumana bilang isang GPIO pin ngunit din bilang isang SDA pin para sa komunikasyon ng I2C at bilang isang Timer 1 output pin. Kaya, kung gagamitin namin ang pin na ito para sa mga simpleng layunin ng GPIO tulad ng pagkonekta sa isang LED, hindi namin magagamit ang I2C at ang LED nang sabay. Nakalulungkot, ang on-board LED ay konektado sa pin na ito, kaya wala kaming pagpipilian dito, at sa program na ito, hindi namin gagamitin ang I2C, kaya't hindi gaanong problema.
Paglalarawan ng Pinout at Mga Tip para sa STM8S103F GPIO Selection
Tunay na nagsasalita, hindi masaktan ang paggamit ng PA1 ng isang input pin at gagana lang ito ng pin. Ngunit sadya kong dinala ito upang magbigay sa akin ng isang pagkakataon upang ipakita sa iyo ang ilang mga karaniwang traps na maaari kang mahulog kapag pumipili ng mga GPIO pin sa isang bagong microcontroller. Ang pinakamahusay na maiwasan ang mga traps ay basahin ang mga detalye ng pin at paglalarawan ng pin na ibinigay sa STM8S103F3P6 datasheet. Para sa mga detalye ng paglalarawan ng mikropono ng STM8S103F3P6 na nabanggit sa datasheet ay ipinapakita sa ibaba ng mga imahe.
Ang mga input pin sa aming microcontroller ay maaaring lumutang o mahina ang pull-up at ang mga output pin ay maaaring maging Open Drain o Push-pull. Ang pagkakaiba-iba sa pagitan ng Open Drain at Push-Pull Output pins ay tinalakay na, kaya't hindi namin masisiyahan iyon. Upang mailagay itong simple, ang isang pin ng Open Drain output ay maaaring gawing mababa lamang ang output na hindi gaano kataas, habang ang isang push-pull output pin ay maaaring gawing pareho mataas at mataas din ang output.
Bukod sa mula sa talahanayan sa itaas, maaari mo ring mapansin na ang isang output pin ay maaaring maging Mabilis na output (10 Mhz) o Slow Output (2 MHz). Natutukoy nito ang Bilis ng GPIO, kung nais mong ilipat ang iyong mga GPIO pin sa pagitan ng mataas at mababa nang napakabilis, pagkatapos ay maaari kaming pumili ng Mabilis na output.
Ang ilang mga GPIO pin sa aming tagasuporta ay sumusuporta sa True Open Drain (T) at High Sink Kasalukuyan (HS) tulad ng nabanggit sa imahe sa itaas. Ang isang malaking pagkakaiba sa pagitan ng Open Drain at True Open Drain ay ang output na konektado upang buksan ang alisan ng tubig ay hindi maaaring hilahin nang mataas kaysa sa operating boltahe ng microcontroller (Vdd) habang ang isang tunay na open-drain output pin ay maaaring hilahin mas mataas kaysa sa Vdd. Ang mga pin na may Kakayahang Mataas na Sink ay nangangahulugan na maaari itong lumubog nang mas kasalukuyang. Ang pinagmulan at sink na kasalukuyang ng anumang GPIO HS pin ay 20mA, habang ang linya ng kuryente ay maaaring ubusin hanggang sa 100 mA.
Kung masusing pagtingin sa imahe sa itaas, mapapansin mo na halos lahat ng mga pin ng GPIO ay uri ng High Sink Kasalukuyan (HS) maliban sa PB4 at PB5 na True Open Drain Type (T). Nangangahulugan ito na ang mga pin na ito ay hindi maaaring gawing mataas, hindi nila maibibigay ang 3.3V kahit na ang pin ay ginawang mataas. Ito ang dahilan kung bakit ang onboard na humantong ay konektado sa isang 3.3V at grounded sa pamamagitan ng PB5 sa halip na i-power ito nang direkta mula sa GPIO pin.
Sumangguni sa pahina 28 sa datasheet para sa detalyadong paglalarawan ng pin. Tulad ng nabanggit sa imahe sa itaas, ang PA1 ay awtomatikong na-configure bilang isang mahinang pull-up at hindi inirerekumenda na magamit bilang isang output pin. Anyways maaari itong magamit bilang isang input pin kasama ang isang push-button, ngunit nagpasya akong gamitin ang PA2 upang subukang paganahin ang mag-pull up mula sa programa. Ito ay ilan lamang sa mga pangunahing bagay na magiging kapaki-pakinabang kapag nagsusulat kami ng mas kumplikadong mga programa. Sa ngayon, okay lang kung maraming bagay ang tumalbog sa iyong ulo, papasok kami sa layer nito sa iba pang mga tutorial.
Programming STM8S para sa GPIO Input at Output gamit ang SPL
Lumikha ng isang workspace at bagong proyekto tulad ng tinalakay sa aming unang tutorial. Maaari kang magdagdag ng lahat ng mga header at pinagmulan ng mga file o idagdag lamang ang gpio, config, at mga file na stm8s. Buksan ang main.c file at simulang isulat ang iyong programa.
Tiyaking isinama mo ang mga file ng header tulad ng ipinakita sa imahe sa itaas. Buksan ang main.c file at simulan ang code. Ang kumpletong main.c code ay matatagpuan sa ilalim ng pahinang ito at magagawa mong i-download ang file ng proyekto mula doon. Ang paliwanag ng code ay ang mga sumusunod, maaari ka ring mag-refer sa manu-manong SPL User o ang video na naka-link sa ilalim ng pahinang ito kung nalilito ka tungkol sa bahagi ng pag-coding.
De-Initializing ang Kinakailangan Port
Sinimulan namin ang aming programa sa pamamagitan ng De-Initializing ng mga kinakailangang port. Tulad ng tinalakay namin nang mas maaga, ang bawat GPIO pin ay magkakaroon ng maraming iba pang mga pagpapaandar na nauugnay dito maliban sa pagtatrabaho tulad ng isang normal na Input at Output. Kung ang mga pin na ito ay dati nang nagamit para sa ilang iba pang mga application, dapat itong De-Initialized bago namin gamitin ang mga ito. Hindi ito sapilitan, gayunpaman, ito ay isang mahusay na kasanayan. Ang sumusunod na dalawang linya ng code ay ginagamit upang De-Initialize Port A at Port B. Gumamit lamang ng syntax GPIO_DeInit (GPIOx); at banggitin ang pangalan ng port sa lugar ng x.
GPIO_DeInit (GPIOA); // ihanda ang Port A para sa pagtatrabaho GPIO_DeInit (GPIOB); // ihanda ang Port B para sa pagtatrabaho
Pagpapahayag ng Input at Output ng GPIO
Susunod, kailangan naming ideklara kung aling mga pin ang gagamitin bilang input at alin bilang output. Sa aming kaso, ang pin PA2 ay gagamitin bilang input, idedeklara rin namin ang pin na ito sa pamamagitan ng panloob na Pull-up upang hindi namin kailangang gumamit ng isang panlabas. Ang syntax ay GPIO_Init (GPIOx, GPIO_PIN_y, GPIO_PIN_MODE_z); . Kung saan ang x ay ang pangalan ng port, y ang pin number, at z ang GPIO Pin mode.
// Declare PA2 as input pull up pin GPIO_Init (GPIOA, GPIO_PIN_2, GPIO_MODE_IN_PU_IT);
Susunod, kailangan naming ideklara ang mga pin na PA3 at PB5 bilang output. Muli maraming mga uri ng pagpapahayag ng output ang posible ngunit gagamitin namin ang "GPIO_MODE_OUT_PP_LOW_SLOW" na nangangahulugang ideklara namin ito bilang isang output pin ng uri ng push-pull na may mabagal na bilis. At bilang default, ang halaga ay magiging mababa. Ang syntax ay magiging pareho.
GPIO_Init (GPIOA, GPIO_PIN_3, GPIO_MODE_OUT_PP_LOW_SLOW); // Declare PB5 as push pull Output pin GPIO_Init (GPIOB, GPIO_PIN_5, GPIO_MODE_OUT_PP_LOW_SLOW);
Ang snapshot sa ibaba mula sa manwal ng gumagamit ng SPL ay binabanggit ang lahat ng posibleng mga mode na GPIO (z).
Walang hanggan habang loop
Matapos ang deklarasyon ng pin, kailangan naming lumikha ng isang walang katapusang loop sa loob kung saan mananatili kaming magpikit ng LED magpakailanman at subaybayan ang katayuan ng pindutan ng push upang i-toggle ang LED. Ang infinite loop ay maaaring lumikha ng isang habang (1) o may isang para sa (;;) . Dito ko na ginamit habang (1).
habang (1) {}
Sinusuri ang katayuan ng Input pin
Kailangan nating suriin ang katayuan ng input pin, ang syntax upang gawin iyon ay GPIO_ReadInputPin (GPIOx, GPIO_PIN_y); kung saan x ang pangalan ng port at y ang pin number. Kung ang pin ay mataas, makakakuha kami ng '1' at kung ang pin ay mababa, makakakuha kami ng isang '0'. Nasanay kami sa loob ng isang kung loop upang suriin kung ang pin ay mataas o mababa.
kung (GPIO_ReadInputPin (GPIOA, GPIO_PIN_2)) // kung pinindot ang pindutan
Ginagawa ang isang GPIO Pin Mataas o Mababang
Upang makagawa ng isang GPIO pin Mataas o Mababang, maaari naming gamitin ang GPIO_WriteHigh (GPIOx, GPIO_PIN_y); at GPIO_WriteLow (GPIOx, GPIO_PIN_y); ayon sa pagkakabanggit. Ginawa namin dito ang LED upang i-on kung ang pindutan ay pinindot at patayin kung ang pindutan ay hindi pinindot.
kung (GPIO_ReadInputPin (GPIOA, GPIO_PIN_2)) // kung ang pindutan ay pinindot ang GPIO_WriteLow (GPIOA, GPIO_PIN_3); // LED ON else GPIO_WriteHigh (GPIOA, GPIO_PIN_3); // LED OFF
Pag-toggle ng isang GPIO Pin
Upang i-toggle ang isang GPIO pin, mayroon kaming GPIO_WriteReverse (GPIOx, GPIO_PIN_y); Ang pagtawag sa pagpapaandar na ito ay magbabago sa katayuan ng output pin. Kung ang pin ay mataas, mababago ito sa mababa, at kung ito ay mababa, mababago ito sa mataas. Ginagamit namin ang pagpapaandar na ito upang pumikit ang onboard LED sa PB5.
GPIO_WriteReverse (GPIOB, GPIO_PIN_5);
Pag-antala ng Pag-andar
Hindi tulad ng Arduino, ang cosmic compiler ay walang paunang natukoy na pagpapaandar na pagkaantala. Kaya kailangan nating lumikha ng isa sa ating sarili. Ang pagpapaandar ng pagpapaandar ay ibinibigay sa ibaba. Ang halagang doe na pagkaantala ay tatanggapin sa variable na ms at gagamit kami ng dalawa para sa loop na hawakan o pagpapatupad ng programa. Tulad ng _asm ("nop") ay isang tagubilin sa pagpupulong na nangangahulugang walang operasyon. Nangangahulugan ito na ang controller ay magiging looping para sa loop nang hindi gumaganap ng anumang operasyon, sa gayon ay lumilikha ng pagkaantala.
void delay (int ms) // Function Definition {int i = 0; int j = 0; para sa (i = 0; i <= ms; i ++) {para (j = 0; j <120; j ++) // Nop = Fosc / 4 _asm ("nop"); // Gumawa ng walang operasyon // code ng pagpupulong}}
Pag-upload at Pagsubok sa Program
Ngayong handa na ang aming programa, maaari na namin itong i-upload at subukan ito. Kapag na-upload, gumagana ang aking hardware tulad ng inaasahan. Ang on-board red LED ay kumikislap para sa bawat 500 milliseconds at ang panlabas na berdeng LED ay nakabukas tuwing pinindot ko ang switch.
Ang kumpletong pagtatrabaho ay matatagpuan sa video na naka-link sa ibaba. Kapag naabot mo ang puntong ito, maaari mong subukang ikonekta ang switch at LED sa iba't ibang mga pin at muling isulat ang code upang maunawaan ang konsepto. Maaari mo ring i-play ang oras ng pagkaantala upang suriin kung naintindihan mo nang malinaw ang mga konsepto.
Kung mayroon kang anumang mga katanungan, mangyaring iwanan ang mga ito sa seksyon ng komento sa ibaba at para sa iba pang mga teknikal na katanungan, maaari mong gamitin ang aming mga forum. Salamat sa pagsunod sa, kita sa susunod na tutorial.