Բովանդակություն:

Այսպիսով, դուք բեռնում եք STM32duino բեռնիչը ձեր «Կապույտ դեղահատում» Ուրեմն հիմա: 7 քայլ
Այսպիսով, դուք բեռնում եք STM32duino բեռնիչը ձեր «Կապույտ դեղահատում» Ուրեմն հիմա: 7 քայլ

Video: Այսպիսով, դուք բեռնում եք STM32duino բեռնիչը ձեր «Կապույտ դեղահատում» Ուրեմն հիմա: 7 քայլ

Video: Այսպիսով, դուք բեռնում եք STM32duino բեռնիչը ձեր «Կապույտ դեղահատում» Ուրեմն հիմա: 7 քայլ
Video: Синдром беспокойных ног? Болят и тянут ноги? Помощь за 1 минуту 2024, Հուլիսի
Anonim
Այսպիսով, դուք բեռնում եք STM32duino բեռնիչը ձեր մեջ
Այսպիսով, դուք բեռնում եք STM32duino բեռնիչը ձեր մեջ
Այսպիսով, դուք բեռնում եք STM32duino բեռնիչը ձեր մեջ
Այսպիսով, դուք բեռնում եք STM32duino բեռնիչը ձեր մեջ

Եթե դուք արդեն կարդացել եք իմ հրահանգները, որոնք բացատրում են, թե ինչպես է բեռնում 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 համով

AnalogWrite () ընդդեմ PwmWrite ()… Անալոգային ելք 2 համով
AnalogWrite () ընդդեմ PwmWrite ()… Անալոգային ելք 2 համով
AnalogWrite () ընդդեմ PwmWrite ()… Անալոգային ելք 2 համով
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 սերիական հաղորդակցություն

STM32 սերիական հաղորդակցություն
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- ում, քանի որ.

  1. PwmWrite () գործառույթը օգտագործելու համար pinMode () - ը ՊԵՏՔ է հայտարարվի որպես PWM ռեժիմ:
  2. Դուք երբեք չեք ստանա ամբողջական 3 նիշանոց համար: Serial.read () գործառույթը գրավում է միայն բուֆերային բովանդակությունը, որը «BYTE» է: եթե մուտքագրեք «100» և սեղմեք «enter», ապա միայն վերջին «0» –ը կբռնվի բուֆերից: Եվ դրա արժեքը կլինի «48» (տասնորդական ASCII արժեքը «0» -ի համար): Եթե մտադիր եք թողարկել «100» արժեքը, ապա անհրաժեշտ է մուտքագրել «դ»: Այսպիսով, ճիշտ է ասել, որ այն կփոխի ASCII խորհրդանիշի տասնորդական արժեքը LED պայծառության մեջ, այնպես չէ՞…… Դե, մի տեսակ…
  3. Խնդիր, քարտեզի արժեքները անմիջապես Serial.read () գործառույթից հնարք է: Գրեթե վստահ է, որ կստանաք անսպասելի արժեքներ: Ավելի լավ մոտեցում է պահեստային բուֆերի բովանդակության պահպանումը ժամանակավոր փոփոխականում և ՔԱՆԻ քարտեզագրումը:

Ինչպես նախկինում բացատրում էի 2 -րդ կետում, փոփոխություններ մտցնելու կոդը թույլ կտա մուտքագրել ASCII խորհրդանիշ, և դա կվերահսկի LED պայծառությունը ՝ հիմնված նրա ASCII տասնորդական արժեքի վրա … օրինակ ՝ «տարածությունը» 32 արժեքն է (իրականում ամենափոքր տպելի նիշն է, որը կարող ես մուտքագրել) իսկ «}» - ը հնարավոր է ամենաբարձրը (արժեքը 126): Մյուս նիշերը տպելի չեն, այնպես որ տերմինալը չի հասկանա կամ հնարավոր է դրանք բնույթի բարդություն լինի (ինչպես «~» - ն իմ ստեղնաշարի մեռած բանալին է և ճիշտ չի աշխատի): Սա նշանակում է, որ այս բարդ նիշը, տերմինալ մուտքագրելիս, կուղարկի բնույթն ինքը և այլ բան: Սովորաբար ոչ տպագրելի: Եվ արդյո՞ք այս վերջին ծածկագիրը կգրավի: Բացի այդ, հիշեք, որ ձեր Տերմինալը, այս դեպքում, ՉԻ ուղարկի ո՛չ «Վագոնի վերադարձ», ո՛չ էլ «Գծային հոսք»: Դուք պետք է ուշադրություն դարձնեք դրան ՝ կոդերի ճիշտ աշխատանքի համար:

Եթե ընկել ես, դա փոքր -ինչ շփոթեցնող է, ամենավատն է դառնում…..

Քայլ 7: Եվ եթե ես կցանկանայի մուտքագրել երեք թվանշան…. կամ նույնիսկ ավելին ??

Եվ եթե ես կցանկանայի մուտքագրել երեք թվանշան…. կամ նույնիսկ ավելին ??
Եվ եթե ես կցանկանայի մուտքագրել երեք թվանշան…. կամ նույնիսկ ավելին ??

Սերիական հաղորդակցությունից բազմակի կերպար ստանալը պարզ խնդիր չէ:

Սերիական բուֆերը ՖԻՖՈ -ի բայթերի նիշերն են: Ամեն անգամ, երբ Serial.read () գործառույթը կանչում է, առաջին ուղարկված նշանը հանվում է կույտից և պահվում այլուր: Սովորաբար կոդի մեջ char փոփոխական է: Ուշադրություն դարձրեք ՝ ապարատից կախված:

Եթե մտադիր եք սերիայի միջոցով մուտքագրել մեկից ավելի թվանշաններ, դուք պետք է «կազմեք» տող ՝ ըստ բնույթի, քանի որ դրանք մտնում են UART բուֆեր:

Սա նշանակում է, որ հեծանիվ վարելը կարդում է յուրաքանչյուր բուֆերային նշան, պահում է ժամանակավոր փոփոխականում, բեռնում այն տողերի զանգվածի առաջին դիրքում, տեղափոխում հաջորդ դիրքը և սկսում նորից, մինչև… Cycleիկլը ավարտելու 2 եղանակ կա.

  1. Օգտագործելով «վերջնական նշանի» ինչ -որ կերպար, օրինակ ՝ «կառքի վերադարձ» կամ «Գծային հոսք»: Հենց որ գտնվի «end Mark» նշանը, հանգույցն ավարտվում է:
  2. Այլապես, լարային շղթայի նիշերի թիվը կարող է սահմանափակ լինել, այնպես էլ ՝ ինտերակտիվ ցիկլերի քանակը: Երբ այն հասնում է սահմանին, ասենք 4 -ին, ինքնուրույն ձեռք բերեք սովորական ավարտներ:

Եկեք պարզ օրինակով նայենք, թե ինչպես դա անել.

  • Սահմանեք «վերջ» նշան, օրինակ '\ n' (սա նշանակում է տող ASCII նշան):
  • looping Մինչդեռ Serial.available () ճիշտ է
  • Serial.read () պահելը հանգեցնում է ժամանակավոր char փոփոխականի: Հիշեք. Հենց որ Serial.read () - ը իրականում «կարդա» բուֆերը, այն մաքուր է, և հաջորդ նիշը բեռնվում է դրանում:
  • այս նշանով ավելացրեք լարային փոփոխական
  • Եթե վերջին նշանը «վերջ» է, դուրս եկեք օղակից:

Սովորաբար, սերիական կերպարների զանգված ստանալու ռեժիմը պատկերի տեսք ունի:

Այն հիմնված էր պարոն Դեյվիդ Ա. Մելլիսի սկզբնական ծածկագրի ընդարձակ հարմարեցման վրա:

Ազատ արձակվեց օգտագործել և փորձարկել այն: Հիշեք. Արժեքները ՊԵՏՔ է մուտքագրվեն եռանիշ ձևաչափով:

Սա առայժմ: Ես չեմ երկարաձգվի լրացուցիչ սերիական հաղորդակցության մանրամասներով: Այն չափազանց բարդ է այստեղ լուսաբանելու համար և արժանի է իր սեփական Intructables- ին:

Հուսով եմ, որ դա կօգնի ձեզ օգտագործել օրինակներ Blue Pill- ում և ձեզ որոշակի լուսավորություն կտա, թե որքանով է ճիշտ այս փոքրիկ տախտակի ծածկագիրը:

Կտեսնվենք այլ ուսանելի դասերում:

Խորհուրդ ենք տալիս: