- Aparatūras sagatavošana
- Izpratne par GPIO Pinouts ierīcē STM8S103F
- Pinout apraksts un padomi STM8S103F GPIO izvēlei
- STM8S programmēšana GPIO ieejai un izejai, izmantojot SPL
- Programmas augšupielāde un testēšana
Mikrokontrolleriem gaismas diode mirgo, kas ir līdzvērtīga programmai “sveika pasaule”. Iepriekšējā apmācībā mēs uzzinājām, kā sākt darbu ar STM8S103F3 izstrādes padomi un kā iestatīt IDE un kompilatoru mūsu STM8S kontrolieru programmēšanai. Mēs arī esam iemācījušies izmantot standarta perifērijas bibliotēkas un kā apkopot un augšupielādēt kodu mūsu mikrokontrollerī. Ņemot vērā visus pamatus, faktiski var sākt rakstīt kodu. Šajā apmācībā mēs uzzināsim, kā veikt vispārīgas GPIO funkcijas STM8S kontrolieros. Dēlim jau ir iebūvēts LED, kas savienots ar B porta 5. kontaktu. Mēs uzzināsim, kā šo LED mirgot, kā arī pievienosim ārējo LED un vadīsim to ar spiedpogu. Ja esat pilnīgi jauns, pirms turpināt darbu, ļoti ieteicams izlasīt iepriekšējo apmācību.
Aparatūras sagatavošana
Pirms ienirstam programmā, ļaujiet sagatavoties aparatūras savienojumiem. Kā jau minēts agri, šeit mēs izmantosim divas gaismas diodes, viena ir borta LED, kas nepārtraukti mirgos, un otra ir ārējā LED, kas tiks pārslēgta ar spiedpogu. Ideja ir vienkāršā iestatījumā iemācīties visu GPIO funkcionalitāti. Borta Led jau ir savienots ar PB5 (PORTB pin5), tāpēc es tikko savienoju LED ar PA3 un spiedpogu pie PA2, kā redzat zemāk redzamajā diagrammā.
Bet no visām mūsu kontrolētajām izejas tapām, kāpēc es izejai izvēlējos PA3 un ievadei PA2? Jautājumi ir pamatoti, un es to paskaidrošu vēlāk šajā rakstā. Mana aparatūras iestatīšana šai apmācībai ir parādīta zemāk. Kā redzat, es arī esmu savienojis savu ST-link programmētāju ar programmēšanas tapām, kas ne tikai ieprogrammēs mūsu dēli, bet arī darbosies kā strāvas avots.
Izpratne par GPIO Pinouts ierīcē STM8S103F
Tagad atgriežoties pie jautājuma, kāpēc PA2 ievadei un kāpēc PA3 izejai? Lai to saprastu, aplūkosim tuvāk redzamo mikrokontrollera kontaktligzdu.
Saskaņā ar pinout diagrammu mūsu mikrokontrollerī ir četras ostas, proti, PORT A, B, C un D, attiecīgi apzīmētas ar PA, PB, PC un PD. Katra GPIO tapa ir aprīkota arī ar kādu citu īpašu funkcionalitāti. Piemēram, PB5 (PORT B 5. kontakts) var darboties ne tikai kā GPIO, bet arī kā SDA kontakts I2C sakariem un kā Timer 1 izejas kontakts. Tātad, ja mēs izmantojam šo tapu vienkāršiem GPIO mērķiem, piemēram, LED savienošanai, mēs nevarēsim vienlaikus izmantot I2C un LED. Diemžēl iebūvētais LED ir pievienots šai tapai, tāpēc mums šeit nav lielas izvēles iespējas, un šajā programmā mēs neizmantosim I2C, tāpēc tā nav liela problēma.
Pinout apraksts un padomi STM8S103F GPIO izvēlei
Patiesi runājot, tas nenāks par ļaunu izmantot PA1 ievades tapu, un tas vienkārši darbotos. Bet es to apzināti izaudzināju, lai sniegtu man iespēju parādīt dažus izplatītākos slazdus, kuros jūs varētu iekrist, izvēloties GPIO tapas jaunam mikrokontrollerim. Vislabāk izvairīties no slazdiem ir izlasīt informāciju par tapu un tapas aprakstu, kas sniegts STM8S103F3P6 datu lapā. STM8S103F3P6 mikrokontrollera tapu apraksta informācija, kas minēta datu lapā, ir parādīta zem attēliem.
Mūsu mikrokontrollera ieejas tapas var būt gan peldošas, gan vājas pievilkšanās, un izejas tapas var būt vai nu atvērtas drenāžas, vai spiedpogas. Atšķirība starp Open Drain un Push-Pull Output tapām jau ir apspriesta, tāpēc mēs to neiedziļināsimies. Vienkāršāk sakot, Open Drain izejas tapa var padarīt izvadi tikai tik zemu, ne tik augstu, savukārt push-pull izejas tapa var padarīt izvadi gan augstu, gan augstu.
Papildus iepriekšminētajai tabulai varat arī pamanīt, ka izejas tapa var būt vai nu ātra izeja (10 Mhz), vai lēna izeja (2 MHz). Tas nosaka GPIO ātrumu, ja vēlaties ļoti ātri pārslēgt GPIO tapas starp augstu un zemu, tad mēs varam izvēlēties ātru izvadi.
Daži GPIO tapas uz mūsu kontroliera atbalsta True Open Drain (T) un augstas izlietnes strāvu (HS), kā minēts iepriekš redzamajā attēlā. Būtiska atšķirība starp atvērto noteci un patieso atvērto noteci ir tāda, ka izeju, kas savienota ar atvērtu drenāžu, nevar novilkt augstāk par mikrokontrollera (Vdd) darba spriegumu, savukārt patieso atvērtās drenāžas izejas tapu var pievilkt augstāk par Vdd. Adatas ar augstu izlietnes spēju nozīmē, ka tā var noslīdēt vairāk strāvas. Jebkura GPIO HS kontakta avota un izlietnes strāva ir 20mA, savukārt strāvas līnija var patērēt līdz 100 mA.
Rūpīgāk aplūkojot iepriekš minēto attēlu, pamanīsit, ka gandrīz visas GPIO tapas ir augstas izlietnes strāvas (HS) tipa, izņemot PB4 un PB5, kas ir True Open Drain Type (T). Tas nozīmē, ka šīs tapas nevar padarīt augstas, tās nespēs nodrošināt 3,3 V strāvu pat tad, ja tapa ir augsta. Tāpēc borta led ir savienots ar 3.3V un iezemēts caur PB5, nevis barojot to tieši no GPIO tapas.
Detalizētu tapu aprakstu skatiet datu lapas 28. lpp. Kā minēts iepriekšējā attēlā, PA1 tiek automātiski konfigurēts kā vājš pievilkšanās brīdis, un to nav ieteicams izmantot kā izejas tapu. Jebkurā gadījumā to var izmantot kā ievades tapu kopā ar spiedpogu, taču es nolēmu izmantot PA2 tikai tāpēc, lai mēģinātu iespējot izvilkšanu no programmas. Šīs ir tikai dažas pamata lietas, kas būs noderīgas, kad mēs rakstīsim daudz sarežģītākas programmas. Pagaidām ir labi, ja daudzas lietas atlec no galvas, mēs tajā iekļūsim citās apmācībās.
STM8S programmēšana GPIO ieejai un izejai, izmantojot SPL
Izveidojiet darbvietu un jaunu projektu, kā mēs to apspriedām mūsu pirmajā apmācībā. Varat pievienot visus galvenes un avota failus vai pievienot tikai failus gpio, config un stm8s. Atveriet failu main.c un sāciet rakstīt programmu.
Pārliecinieties, vai esat iekļāvis galvenes failus, kā parādīts attēlā iepriekš. Atveriet failu main.c un sāciet kodu. Pilns main.c kods ir atrodams šīs lapas apakšdaļā, un jūs no tā varēsiet arī lejupielādēt projekta failu. Kods ir izskaidrots šādi. Varat arī atsaukties uz SPL lietotāja rokasgrāmatu vai video, kas ir saistīts ar šīs lapas apakšdaļu, ja esat neskaidrs par kodēšanas daļu.
Nepieciešamās ostas inicializēšana
Mēs sākam savu programmu ar nepieciešamo portu inicializēšanu. Kā mēs iepriekš apspriedām, katrai GPIO tapai būs saistītas arī daudzas citas funkcijas, izņemot to, ka tā darbojas tikai kā parasta ieeja un izeja. Ja šīs tapas iepriekš tika izmantotas dažām citām lietojumprogrammām, pirms to izmantošanas to vajadzētu inicializēt. Tas nav obligāti, tomēr tā ir laba prakse. Sekojošās divas koda rindas tiek izmantotas, lai inicializētu A un B porti . Vienkārši izmantojiet sintaksi GPIO_DeInit (GPIOx); un x vietā min ostas nosaukumu.
GPIO_DeInit (GPIOA); // sagatavot A portu darbam GPIO_DeInit (GPIOB); // sagatavot B ostu darbam
Ievades un izvades GPIO deklarācija
Tālāk mums jāpaziņo, kuras tapas tiks izmantotas kā ievade un kuras kā izeja. Mūsu gadījumā tapu PA2 izmantos kā ievadi, mēs arī deklarēsim šo tapu ar iekšējo Pull-up, lai mums tā nebūtu jāizmanto ārēji. Sintakse ir GPIO_Init (GPIOx, GPIO_PIN_y, GPIO_PIN_MODE_z); . Kur x ir porta nosaukums, y ir pin numurs un z ir GPIO PIN režīms.
// Paziņot PA2 par ievades izvilkšanas tapu GPIO_Init (GPIOA, GPIO_PIN_2, GPIO_MODE_IN_PU_IT);
Tālāk mums jāpaziņo tapas PA3 un PB5 kā izvadi. Atkal ir iespējami daudzi izvades deklarēšanas veidi, taču mēs izmantosim “GPIO_MODE_OUT_PP_LOW_SLOW”, kas nozīmē, ka mēs to deklarēsim kā push-pull tipa izvades kontaktu ar lēnu ātrumu. Un pēc noklusējuma vērtība būs zema. Sintakse būs tāda pati.
GPIO_Init (GPIOA, GPIO_PIN_3, GPIO_MODE_OUT_PP_LOW_SLOW); // Paziņot PB5 par push pull Output pin GPIO_Init (GPIOB, GPIO_PIN_5, GPIO_MODE_OUT_PP_LOW_SLOW);
Zemāk esošajā SPL lietotāja rokasgrāmatas momentuzņēmumā ir minēti visi iespējamie GPIO režīmi (z).
Bezgalīgs, kamēr cilpa
Pēc tapas deklarēšanas mums ir jāizveido bezgalīga cilpa, kuras iekšpusē mēs nemitīgi mirgosim LED un uzraugīsim spiedpogas statusu, lai pārslēgtu LED. Bezgalīgā cilpa var izveidot vai nu ar brīdi (1), vai ar a for (;;) . Šeit es esmu izmantojis (1).
kamēr (1) {}
Ievades tapas stāvokļa pārbaude
Mums ir jāpārbauda ievades tapas statuss, tā sintakse ir GPIO_ReadInputPin (GPIOx, GPIO_PIN_y); kur x ir porta nosaukums un y ir tapas numurs. Ja tapa ir augsta, mēs saņemsim “1” un, ja tapa ir zema, mēs saņemsim “0”. Mēs esam pieraduši iekšā if cilnē, lai pārbaudītu, vai tapa ir augsta vai zema.
ja (GPIO_ReadInputPin (GPIOA, GPIO_PIN_2)) // ja tiek nospiesta poga
GPIO tapas izveidošana augsta vai zema
Lai GPIO tapa būtu augsta vai zema, mēs varam izmantot GPIO_WriteHigh (GPIOx, GPIO_PIN_y); un GPIO_WriteLow (GPIOx, GPIO_PIN_y); attiecīgi. Šeit mēs esam izveidojuši LED, lai ieslēgtos, ja tiek nospiesta poga, un izslēdzas, ja poga netiek nospiesta.
ja (GPIO_ReadInputPin (GPIOA, GPIO_PIN_2)) // ja poga ir nospiesta GPIO_WriteLow (GPIOA, GPIO_PIN_3); // LED ieslēdzas citur GPIO_WriteHigh (GPIOA, GPIO_PIN_3); // LED izslēgts
GPIO tapas pārslēgšana
Lai pārslēgtu GPIO tapu, mums ir GPIO_WriteReverse (GPIOx, GPIO_PIN_y); izsaucot šo funkciju, tiks mainīts izejas tapas statuss. Ja tapa ir augsta, tā tiks mainīta uz zemu, un, ja tā ir zema, tā tiks mainīta uz augstu. Mēs izmantojam šo funkciju, lai mirgotu iebūvēto LED uz PB5.
GPIO_WriteReverse (GPIOB, GPIO_PIN_5);
Kavēšanās funkcija
Atšķirībā no Arduino, kosmiskajam kompilatoram nav iepriekš definētas aizkaves funkcijas. Tāpēc mums tas ir jāizveido patstāvīgi. Mana kavēšanās funkcija ir dota zemāk. Vērtība doe the delay tiks saņemta mainīgajā ms, un mēs izmantosim divus cilpa turēšanai vai programmas izpildei. Tāpat kā _asm (“nop”) ir montāžas instrukcija, kas nenozīmē nekādu darbību. Tas nozīmē, ka kontrolieris izveidos cilpu for, neveicot nekādas darbības, tādējādi radot kavēšanos.
void delay (int ms) // Funkcijas definīcija {int i = 0; int j = 0; par (i = 0; i <= ms; i ++) {par (j = 0; j <120; j ++) // Nop = Fosc / 4 _asm ("nop"); // neveic nekādas darbības // montāžas kods}}
Programmas augšupielāde un testēšana
Tagad, kad mūsu programma ir gatava, mēs varam to augšupielādēt un pārbaudīt. Pēc augšupielādes mana aparatūra darbojās, kā paredzēts. Borta sarkanā gaismas diode mirgo ik pēc 500 milisekundēm, un ārējā zaļā gaismas diode iedegās katru reizi, kad nospiedu slēdzi.
Pilnīgu darbu var atrast zemāk esošajā videoklipā. Kad esat sasniedzis šo punktu, varat mēģināt savienot slēdzi un LED ar dažādām tapām un pārrakstīt kodu, lai saprastu jēdzienu. Varat arī spēlēt ar aizkaves laiku, lai pārbaudītu, vai jūs saprotat jēdzienus skaidri.
Ja jums ir kādi jautājumi, lūdzu, atstājiet tos komentāru sadaļā zemāk, un, ja rodas citi tehniski jautājumi, varat izmantot mūsu forumus. Paldies, ka sekojāt, tiekamies nākamajā apmācībā.