
Բովանդակություն:
- Քայլ 1. Քորոցներ և կապում….Ինչու՞ ծածկագիրը չի աշխատում:
- Քայլ 2. Եկեք «սահմանենք» որոշ կապում…
- Քայլ 3: PinMode ()… Ինչպես եք օգտագործելու ձեր կապում…
- Քայլ 4: AnalogWrite () ընդդեմ PwmWrite ()… Անալոգային ելք 2 համով
- Քայլ 5: STM32 սերիական հաղորդակցություն
- Քայլ 6: Արժեք փոխանցեք միկրոկոնտրոլերին
- Քայլ 7: Եվ եթե ես կցանկանայի մուտքագրել երեք թվանշան…. կամ նույնիսկ ավելին ??
2025 Հեղինակ: John Day | [email protected]. Վերջին փոփոխված: 2025-01-23 14:48


Եթե դուք արդեն կարդացել եք իմ հրահանգները, որոնք բացատրում են, թե ինչպես է բեռնում STM32duino բեռնիչը կամ ցանկացած այլ նմանատիպ փաստաթուղթ, փորձեք բեռնել կոդի օրինակը և…. Գուցե ոչինչ ընդհանրապես չպատահի:
Խնդիրն այն է, որ շատերը, եթե ոչ, «Ընդհանուր» STM32- ի բոլոր օրինակները տուփից դուրս չեն աշխատի: Ձեր STM32 «Կապույտ դեղահատ» տախտակում աշխատելու համար անհրաժեշտ կլինեն փոքր փոփոխություններ:
Ես կընտրեմ 4 կոդի օրինակ `բացատրելու համար, թե ինչ է պետք փոխել և ինչու: Կոդերն են ՝ «BlinkWithoutDelay», «Fading», «Dimmer» և «AnalogInSerial»:
Նշում, ես ոչինչ չեմ կոդավորել: Ես պարզապես տալիս եմ փոքր փոփոխություններ ծածկագրերի կողմից ստեղծված ՝
Դեյվիդ Ա. Մելիս և ուշ փոփոխված ՝ Թոմ Իգոյի, Մարտի Բոլիվարի և որոշ դեպքերի ՝ Սքոթ Ֆիցջերալդի կողմից
Թոմ Իգո և ուշ փոփոխված ՝ Բրայան Նյուբոլդի կողմից
Այսպիսով, ես նախընտրում եմ հեղինակի անունները պահել նույնիսկ իմ փոփոխած ծածկագրերում ՝ պահպանելով ստեղծագործության վարկը:
Քայլ 1. Քորոցներ և կապում…. Ինչու՞ ծածկագիրը չի աշխատում:

Եկեք նայենք STM32 «Կապույտ դեղահատ» քորոցին: Նշման կապում նույնականացվում է որպես PA1 կամ PC2…: նման բան:
Եթե նայեք, օրինակ, «BlinkWithoutDelay» կոդի օրինակին, ապա քորոցը հայտարարվում է որպես «33»…. Ինչու՞:
Ես կասկածում եմ, որ դա այն պատճառով է, որ պարոն Մարտի Բոլիվարը այս ծածկագիրը փոխանցեց MAPLE տախտակին:
Կարծում եմ, որ նրա մտադրությունը չէր թույլատրել «Կապույտ դեղահատ» տախտակների հետ համատեղելի ծածկագիր:
Maple- ի և Maple- ի մինի տախտակի կապումներն թվային հայտարարված են, ինչպես Arduino- ն, չնայած դրանք օգտագործում են թվեր, ինչպիսիք են 33 -ը, 24 -ը և ոմանք այսպիսին:
Ես ասացի, որ կոդը չի աշխատում: Իմ սխալը. Կոդը կազմեք առանց որևէ սխալի և ճիշտ վերբեռնեք «Կապույտ դեղահատ», այնպես որ, իմ կարծիքով, այն իսկապես աշխատում է, բայց GPIO ելքի օգտագործմամբ մեզ չեն սպասում: Կարող է նույնիսկ մատչելի չլինել:
Այսպիսով, օրենսգրքում փոքր փոփոխություններ են անհրաժեշտ, որպեսզի այն աշխատի ինչպես և սպասվում էր:
Քայլ 2. Եկեք «սահմանենք» որոշ կապում…

Լավ օրենսդրական պրակտիկա է, որը ռեսուրսները հայտարարում է որպես փոփոխականների կամ հաստատունների հեշտ նույնականացում կամ նշանակում: Դա թույլ կտա ձեզ ավելի հեշտ հասկանալ և անսարքություններ գտնել:
Ես օգտագործել եմ հայտարարված Arduino կապում այսպիսին.
…
const int ledPin = 13;
…"
Եթե ինձ դուր է գալիս, գուցե ինքդ քեզ հարցնես.
Պատասխանը հետևյալն է. Օգտագործել «#define» C հայտարարությունը:
Այսպիսով, ըստ pinout վիճակահանության, PC13- ն այն քորոցն է, որը մենք ունենք «BluePill» - ի LED- ում: Այն օգտագործելու համար ես կհայտարարեի այսպես ՝ գրադարանների սահմանումից անմիջապես հետո (#ներառեք…) և որևէ այլ բանից առաջ.
…
#սահմանեք LedPin PC13- ը
…"
Ուշադրություն դարձրեք, ՉԿԱ ";" տողի դադարեցում, NOR "=" հանձնարարություն:
Համեմատեք երկու կոդերը: Մեկը IDE- ից բեռնված բնօրինակ օրինակն է: Երկրորդը մեկն է, որը ես որոշ չափով հարմարեցրել եմ «BluePill» - ի հետ աշխատելու համար:
Ես խստորեն խորհուրդ եմ տալիս հայտարարել բոլոր կապում, որոնք մտադիր եք օգտագործել կոդի մեջ: Նույնիսկ նրանք, ովքեր մտադիր են օգտագործել որպես ADC մուտքագրում (դրա մասին ավելի ուշ):
Սա կդարձնի ձեր կյանքը հեշտ:
Քայլ 3: PinMode ()… Ինչպես եք օգտագործելու ձեր կապում…
Շարունակելուց առաջ եկեք հասկանանք PinMode () գործառույթը:
Ինչպես և Arduino- ն, STM32 քորոցներն ունեն բազմաթիվ գործառույթներ: Մեկը կամ մյուսը ընտրելու ամենապարզ ձևը pinMode () հայտարարության օգտագործումն է:
Arduino- ն ունի ընդամենը 3 ռեժիմ ՝ INPUT, OUTPUT կամ INPUT_PULLUP:
STM32- ը, մյուս կողմից, ունի pinMode () շատ համեր: Նրանք են:
ԵԼՔ -Հիմնական թվային ելք. Երբ քորոցը ԲԱՐՁՐ է, լարումը պահվում է +3.3v (Vcc), իսկ երբ այն OWԱOWՐ է, այն իջեցվում է գետնին:
OUTPUT_OPEN_DRAIN -Բաց արտահոսքի ռեժիմում քորոցը ցույց է տալիս «ցածր» ՝ հոսքն ընդունելով գետնին, իսկ «բարձր» ՝ ապահովելով դիմադրության բարձրացում:
INPUT_ANALOG -Սա հատուկ ռեժիմ է, երբ քորոցը կօգտագործվի անալոգային (ոչ թվային) ընթերցումների համար: Թույլ է տալիս ADC- ի փոխարկումը կատարել քորոցում գտնվող լարման վրա:
INPUT_PULLUP -Այս ռեժիմում քորոցի վիճակը հաղորդվում է այնպես, ինչպես INPUT- ի դեպքում, սակայն կապի լարումը նրբորեն «քաշվում է» դեպի +3.3v:
INPUT_PULLDOWN -Այս ռեժիմում քորոցի վիճակը հաղորդվում է այնպես, ինչպես INPUT- ի դեպքում, բայց քորոց լարումը նրբորեն «իջեցվում է» դեպի 0v:
INPUT_FLOATING -INPUT- ի հոմանիշ:
PWM -Սա հատուկ ռեժիմ է, երբ քորոցը կօգտագործվի PWM ելքի համար (թվային ելքի հատուկ դեպք):
PWM_OPEN_DRAIN -Ինչպես PWM- ն, միայն թե LOW և HIGH- ի փոփոխվող ցիկլերի փոխարեն, քորոցի լարումը բաղկացած է LOW- ի և լողացող (անջատված) փոփոխական ցիկլերից:
(նշում. քաղված է
Ես պարզապես բացում եմ այս փակագիծը, քանի որ երբ սկսում ես ստեղծել քո սեփական կոդը, զգույշ եղիր ՝ քո կարիքների համար օգտագործել ճիշտ pinMode ():
Քայլ 4: AnalogWrite () ընդդեմ PwmWrite ()… Անալոգային ելք 2 համով


«Կապույտ դեղահատ» GPIO կապում օգտագործելուց առաջ անհրաժեշտ է հայտարարել դրա վարքագիծը, այսինքն ՝ ինչպես է այն աշխատելու: Դա հենց այն է, ինչ անում է pinMode () գործառույթը:
Այսպիսով, եկեք հիմա կենտրոնանանք, թե ինչպես ճիշտ սահմանել անալոգային ելքը: Այն կարող է հայտարարվել կամ որպես OUTPUT ռեժիմ, կամ որպես PWM ռեժիմ:
Նույն կերպ, անալոգային արժեքները կարող են վերագրվել GPIO- ին 2 եղանակով ՝ analogWrite () կամ pwmWrite (), BUT, analogWrite () WILL միայն այն դեպքում, եթե pinMode () = OUTPUT: Մյուս կողմից, pwmWrite ()- ը կաշխատի միայն այն դեպքում, եթե pinMode () = PWM:
Եկեք օրինակ վերցնենք PA0- ն. Դա անալոգային/pwm ելքային թեկնածու է:
analogWrite (): սա հայտարարեք այսպես.
….
#սահմանեք ledPin PA0- ը
pinMode (ledPin, OUTPUT);
analogWrite (ledPin, <համար>);
……"
որտեղ թիվը պետք է լինի 0 -ից 255 -ի սահմաններում, ինչպես Arduino- ն: Իրականում, այն հետընթաց կերպով համատեղելի է Arduino- ի հետ:
pwmWrite (): հայտարարեք այս կերպ.
…
#սահմանեք ledPin PA0- ը
pinMode (ledPin, PWM);
pwmWrite (ledPin, <համար.>);
…."
Այն դեպքում, երբ թիվը պետք է լինի 0 ~ 65535 -ի միջև, լուծումը շատ ավելի բարձր է, քան Arduino- ն:
Պատկերներում հնարավոր է համեմատել 2 կոդի միջև: Կարող եք նաև տեսնել սկզբնական ծածկագիրը:
Քայլ 5: STM32 սերիական հաղորդակցություն

Տեսնենք, թե ինչպես են դասավորված USART ինտերֆեյսերը STM32- ում: Այո, ինտերֆեյսերը հոգնակի թվով…..
«Կապույտ դեղահատ» -ն ունի 3 USART (RX/ TX 1 ~ 3) և, եթե դուք օգտագործում եք բեռնախցիկ, թույլ է տալիս օգտագործել USB, այն այնուհետև որևէ մեկին միացված չէ:
Կախված այն բանից, թե USB եք օգտագործում, թե ոչ, անհրաժեշտ է ձեր ծածկագրում այս կամ այն ձևով հայտարարել սերիական պորտ:
Գործ 1: USB- ի օգտագործումը
Այս կերպ, ուրվագծերը ներբեռնվում են անմիջապես USB- ի միջոցով: Կարիք չկա BOOT0 ցատկիչը տեղափոխել 1 դիրքի և հետ ՝ 0:
Այս դեպքում, ցանկացած անգամ, երբ հայտարարում եք «Սերիա» ՝ առանց ինդեքսի, նշանակում է կապ USB- ի միջոցով:
Այսպիսով, Serial1, նշանակում է TX/ RX 1 (կապում PA9 և PA10); Serial2, նշանակում է TX/ RX 2 (կապում PA2 և PA3) և Serial 3 նշանակում է TX/ RX 3 (կապում PA10 և PA11):
Սա այն ճանապարհն է, որի հետ մենք աշխատում ենք: Կոդավորման այս եղանակի համար կներկայացնեմ փոփոխություններ օրինակներում:
Մեկ այլ բան. «Սերիական USB» - ն նախաստորագրման կարիք չունի: Այլ կերպ ասած, "… Serial.begin (15200);" անհրաժեշտ չէ.
Հնարավոր է զանգահարել ցանկացած Սերիական գործառույթ (Serial.read (), Serial.write () և այլն) ՝ առանց որևէ նախաստորագրման:
Եթե ինչ -ինչ պատճառներով այն առկա է ծածկագրում, ապա կոմպիլյատորն անտեսում է այն:
Գործ 2: TTL seria- ից USB ադապտեր օգտագործելը
Այս կերպ, bootloader- ը չի ապահովում բնիկ STM32 USB հաղորդակցություն, այնպես որ ձեզ պետք է USB- ից սերիական ադապտեր, որը միացված է TX/ RX 1 -ին (pin PA9 և PA10) ՝ էսքիզներ վերբեռնելու համար:
Այս դեպքում ցանկացած ժամանակ «Սերիա», առանց ինդեքսի, ծածկագիր է, նշանակում է TX/ RX1 (նավահանգիստ, որն օգտագործվում է ծածկագիրը վերբեռնելու համար): Այսպիսով, Serial1- ը վերաբերում է TX/ RX 2 -ին (կապեր PA2 և PA3), իսկ Serial2- ը ՝ TX/ RX 3 (կապում PA10 և PA11): Serial3- ը հասանելի չէ:
Քայլ 6: Արժեք փոխանցեք միկրոկոնտրոլերին

Dimmer- ի օրինակը պարզ միջոց է ՝ ցույց տալու, թե ինչպես է արժեքը փոխանցում միկրոկոնտրոլերին:
Այն ենթադրում է, որ 0 -ից 255 -ի արժեք է անցնում LED լուսավորությունը վերահսկելու համար:
Այն ՉԻ գործի այնպես, ինչպես սպասվում էր Blue Pill- ում, քանի որ.
- PwmWrite () գործառույթը օգտագործելու համար pinMode () - ը ՊԵՏՔ է հայտարարվի որպես PWM ռեժիմ:
- Դուք երբեք չեք ստանա ամբողջական 3 նիշանոց համար: Serial.read () գործառույթը գրավում է միայն բուֆերային բովանդակությունը, որը «BYTE» է: եթե մուտքագրեք «100» և սեղմեք «enter», ապա միայն վերջին «0» –ը կբռնվի բուֆերից: Եվ դրա արժեքը կլինի «48» (տասնորդական ASCII արժեքը «0» -ի համար): Եթե մտադիր եք թողարկել «100» արժեքը, ապա անհրաժեշտ է մուտքագրել «դ»: Այսպիսով, ճիշտ է ասել, որ այն կփոխի ASCII խորհրդանիշի տասնորդական արժեքը LED պայծառության մեջ, այնպես չէ՞…… Դե, մի տեսակ…
- Խնդիր, քարտեզի արժեքները անմիջապես Serial.read () գործառույթից հնարք է: Գրեթե վստահ է, որ կստանաք անսպասելի արժեքներ: Ավելի լավ մոտեցում է պահեստային բուֆերի բովանդակության պահպանումը ժամանակավոր փոփոխականում և ՔԱՆԻ քարտեզագրումը:
Ինչպես նախկինում բացատրում էի 2 -րդ կետում, փոփոխություններ մտցնելու կոդը թույլ կտա մուտքագրել ASCII խորհրդանիշ, և դա կվերահսկի LED պայծառությունը ՝ հիմնված նրա ASCII տասնորդական արժեքի վրա … օրինակ ՝ «տարածությունը» 32 արժեքն է (իրականում ամենափոքր տպելի նիշն է, որը կարող ես մուտքագրել) իսկ «}» - ը հնարավոր է ամենաբարձրը (արժեքը 126): Մյուս նիշերը տպելի չեն, այնպես որ տերմինալը չի հասկանա կամ հնարավոր է դրանք բնույթի բարդություն լինի (ինչպես «~» - ն իմ ստեղնաշարի մեռած բանալին է և ճիշտ չի աշխատի): Սա նշանակում է, որ այս բարդ նիշը, տերմինալ մուտքագրելիս, կուղարկի բնույթն ինքը և այլ բան: Սովորաբար ոչ տպագրելի: Եվ արդյո՞ք այս վերջին ծածկագիրը կգրավի: Բացի այդ, հիշեք, որ ձեր Տերմինալը, այս դեպքում, ՉԻ ուղարկի ո՛չ «Վագոնի վերադարձ», ո՛չ էլ «Գծային հոսք»: Դուք պետք է ուշադրություն դարձնեք դրան ՝ կոդերի ճիշտ աշխատանքի համար:
Եթե ընկել ես, դա փոքր -ինչ շփոթեցնող է, ամենավատն է դառնում…..
Քայլ 7: Եվ եթե ես կցանկանայի մուտքագրել երեք թվանշան…. կամ նույնիսկ ավելին ??

Սերիական հաղորդակցությունից բազմակի կերպար ստանալը պարզ խնդիր չէ:
Սերիական բուֆերը ՖԻՖՈ -ի բայթերի նիշերն են: Ամեն անգամ, երբ Serial.read () գործառույթը կանչում է, առաջին ուղարկված նշանը հանվում է կույտից և պահվում այլուր: Սովորաբար կոդի մեջ char փոփոխական է: Ուշադրություն դարձրեք ՝ ապարատից կախված:
Եթե մտադիր եք սերիայի միջոցով մուտքագրել մեկից ավելի թվանշաններ, դուք պետք է «կազմեք» տող ՝ ըստ բնույթի, քանի որ դրանք մտնում են UART բուֆեր:
Սա նշանակում է, որ հեծանիվ վարելը կարդում է յուրաքանչյուր բուֆերային նշան, պահում է ժամանակավոր փոփոխականում, բեռնում այն տողերի զանգվածի առաջին դիրքում, տեղափոխում հաջորդ դիրքը և սկսում նորից, մինչև… Cycleիկլը ավարտելու 2 եղանակ կա.
- Օգտագործելով «վերջնական նշանի» ինչ -որ կերպար, օրինակ ՝ «կառքի վերադարձ» կամ «Գծային հոսք»: Հենց որ գտնվի «end Mark» նշանը, հանգույցն ավարտվում է:
- Այլապես, լարային շղթայի նիշերի թիվը կարող է սահմանափակ լինել, այնպես էլ ՝ ինտերակտիվ ցիկլերի քանակը: Երբ այն հասնում է սահմանին, ասենք 4 -ին, ինքնուրույն ձեռք բերեք սովորական ավարտներ:
Եկեք պարզ օրինակով նայենք, թե ինչպես դա անել.
- Սահմանեք «վերջ» նշան, օրինակ '\ n' (սա նշանակում է տող ASCII նշան):
- looping Մինչդեռ Serial.available () ճիշտ է
- Serial.read () պահելը հանգեցնում է ժամանակավոր char փոփոխականի: Հիշեք. Հենց որ Serial.read () - ը իրականում «կարդա» բուֆերը, այն մաքուր է, և հաջորդ նիշը բեռնվում է դրանում:
- այս նշանով ավելացրեք լարային փոփոխական
- Եթե վերջին նշանը «վերջ» է, դուրս եկեք օղակից:
Սովորաբար, սերիական կերպարների զանգված ստանալու ռեժիմը պատկերի տեսք ունի:
Այն հիմնված էր պարոն Դեյվիդ Ա. Մելլիսի սկզբնական ծածկագրի ընդարձակ հարմարեցման վրա:
Ազատ արձակվեց օգտագործել և փորձարկել այն: Հիշեք. Արժեքները ՊԵՏՔ է մուտքագրվեն եռանիշ ձևաչափով:
Սա առայժմ: Ես չեմ երկարաձգվի լրացուցիչ սերիական հաղորդակցության մանրամասներով: Այն չափազանց բարդ է այստեղ լուսաբանելու համար և արժանի է իր սեփական Intructables- ին:
Հուսով եմ, որ դա կօգնի ձեզ օգտագործել օրինակներ Blue Pill- ում և ձեզ որոշակի լուսավորություն կտա, թե որքանով է ճիշտ այս փոքրիկ տախտակի ծածկագիրը:
Կտեսնվենք այլ ուսանելի դասերում:
Խորհուրդ ենք տալիս:
12 վոլտ մարտկոցի կոտրում! Դուք չեք հավատա ձեր աչքերին !!!!! (թարմացված) ՝ 7 քայլ

12 վոլտ մարտկոցի կոտրում! Դուք չեք հավատա ձեր աչքերին !!!!! (թարմացված). Ոգեշնչված Կիպկայի հրահանգով, ես մտածեցի, որ կվերցնեմ այլ ապրանքանիշի իմ սեփական մարտկոցները … Եվ, տղա՛ս, ես զարմացա:
AVR միկրոկառավարիչի ապահովիչների բիտերի կազմաձևում: Միկրոկոնտրոլերի ֆլեշ հիշողության մեջ LED թարթման ծրագրի ստեղծում և բեռնում. 5 քայլ

AVR միկրոկառավարիչի ապահովիչների բիտերի կազմաձևում: Միկրոկոնտրոլերի ֆլեշ հիշողության մեջ LED թարթման ծրագիր ստեղծելը և բեռնելը. Այս դեպքում մենք կստեղծենք պարզ ծրագիր C կոդով և այն կգրենք միկրոկոնտրոլերի հիշողության մեջ: Մենք կգրենք մեր սեփական ծրագիրը և կկազմենք վեցանկյուն ֆայլ ՝ օգտագործելով Atmel Studio- ն որպես ինտեգրված զարգացման հարթակ: Մենք կկարգավորենք ապահովիչի բի
Ինչպես վերբեռնել բեռնիչը ցանկացած Arduino- ում: 5 քայլ

Ինչպես վերբեռնել Bootloader- ը ցանկացած Arduino- ում. Այսպիսով, այսօր ես ձեզ ցույց կտամ, թե ինչպես վերբեռնել Bootloader
Այսպիսով, դուք ցանկանում եք կառուցել հսկա ռոբոտ: 19 քայլ (նկարներով)

Այսպիսով, դուք ցանկանում եք կառուցել հսկա ռոբոտ. Ասում եք, որ ցանկանում եք հսկա ռոբոտ կառուցել: Ո՞րն է ձեր նպատակը: Համաշխարհային տիրապետությու՞ն: Ձեր ընկերուհին չի՞ գնի այդ գարեջուրը ձեզ համար: Ինչ էլ որ լինի, ահա թե ինչպես կարելի է սկսել ինքներդ ռոբոտ կառուցել: Այս ռոբոտի նպատակը բեմի հենարանն էր
ԿՈՄՊԱԿՏ ԼՈIGHՅՍ ԿԱՏԱՐԵԼՈ E ՀԵՆ ՀԵՌՈ ՀԱՐAYԸ !! 3 ՀԻՄԱ ՔԱՅԼ !! 3 քայլ

ԿՈՄՊԱԿՏ ԼՈIGHՅՍ ԿԱՏԱՐԵԼՈ E ՀԵՆ ՀԵՌՈ ՀԱՐAYԸ !! 3 ՀԻՇՈ ՔԱՅԼ !!. Այն, ինչ ձեզ հարկավոր կլինի - թիթեղյա փայլաթիթեղ 1 AA մարտկոց (որոշ AAA մարտկոցներ կաշխատեն) 1 մինի լամպ (լամպեր, որոնք օգտագործվում են լապտերների մեծ մասի համար. Հղում նկարին) Կառավարիչ (անհրաժեշտության դեպքում)