Мазмұны:

Сонымен, сіз STM32duino жүктеушісін «көк таблеткаға» жүктейсіз Енді не болады ?: 7 қадам
Сонымен, сіз STM32duino жүктеушісін «көк таблеткаға» жүктейсіз Енді не болады ?: 7 қадам

Бейне: Сонымен, сіз STM32duino жүктеушісін «көк таблеткаға» жүктейсіз Енді не болады ?: 7 қадам

Бейне: Сонымен, сіз STM32duino жүктеушісін «көк таблеткаға» жүктейсіз Енді не болады ?: 7 қадам
Бейне: феникс ос установка с флешки, андроид на пк 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;

…"

Егер сіз маған ұнайтын болсаңыз, мүмкін сіз өзіңізден: «Мен PC13 сияқты атаулары бар түйреуіштерді қалай жариялай аламын?»

Жауап: «#define» C операторын қолданыңыз.

Осылайша, түйреуіш бойынша PC13 - бұл «BluePill» ішіндегі жарық диоды бар түйреуіш. Оны пайдалану үшін мен кітапханалар анықтамасынан кейін (#қосу…) және басқа нәрселердің алдында осылай жариялайтын едім:

#LedPin PC13 анықтаңыз

…"

ЖОҚ «;» жоқ екенін ескеріңіз. жолды тоқтату, NOR «=» тағайындау.

Екі кодты салыстырыңыз. Біреуі - IDE -ден жүктелген түпнұсқа мысал. Екіншіден, мен «BluePill» -мен жұмыс жасау үшін біраз түзетулер енгіздім.

Мен кодта қолданғыңыз келетін барлық түйреуіштерді жариялауды ұсынамын. Тіпті олар ADC кірісі ретінде қолданғысы келеді (бұл туралы кейінірек).

Бұл сіздің өміріңізді жеңілдетеді.

3 -қадам: PinMode ()… Сіз түйреуіштерді қалай қолданасыз…

Жалғастырмас бұрын PinMode () функциясын түсінейік.

Arduino сияқты, STM32 түйреуіштерінің де бірнеше функциялары бар. Біреуін немесе басқасын таңдаудың қарапайым әдісі - pinMode () операторын қолдану.

Arduino -да тек 3 режим бар: INPUT, OUTPUT немесе INPUT_PULLUP.

STM32, керісінше, pinMode () көптеген дәміне ие. Олар:

OUTPUT -Негізгі цифрлық шығыс: түйреуіш жоғары болғанда, кернеу +3.3v (Vcc) деңгейінде ұсталады, ал LOW төмен болғанда оны жерге түсіреді

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 және өзгермелі (ажыратылған) ауыспалы циклдардан тұрады

(ескерту: https://docs.leaflabs.com/static.leaflabs.com/pub/leaflabs/maple-docs/latest/lang/api/pinmode.html#lang-pinmode сайтынан алынды)

Мен бұл жақшаны ашамын, себебі сіз өзіңіздің жеке кодыңызды жасай бастағанда, қажеттілік үшін дұрыс pinMode () қолданыңыз.

4 -қадам: AnalogWrite () Versus PwmWrite ()… 2 түрдегі аналогтық шығыс

AnalogWrite () Versus PwmWrite ()… 2 дәмдегі аналогтық шығыс
AnalogWrite () Versus PwmWrite ()… 2 дәмдегі аналогтық шығыс
AnalogWrite () Versus PwmWrite ()… 2 түрдегі аналогтық шығыс
AnalogWrite () Versus PwmWrite ()… 2 түрдегі аналогтық шығыс

«Blue Pill» GPIO түйреуіштерін қолданар алдында оның мінез -құлқын, яғни оның қалай жұмыс істейтінін мәлімдеу қажет. PinMode () функциясы дәл осылай жасайды.

Енді аналогтық шығыс қаншалықты дұрыс орнатылғанына назар аударайық. Оны OUTPUT режимі немесе PWM режимі ретінде жариялауға болады.

Дәл осылай, аналогтық мәндерді GPIO -ға екі жолмен жатқызуға болады: analogWrite () немесе pwmWrite (), БІРАҚ, analogWrite () 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 түйреуіштері) және 3 -серия TX/ RX 3 (PA10 және PA11 түйреуіштері) дегенді білдіреді.

Біз осылай жұмыс жасаймыз. Мен кодтаудың осы әдісіне мысалдардағы өзгерістерді ұсынамын.

Тағы бір нәрсе: «Сериялық USB» инициализацияны қажет етпейді. Басқаша айтқанда, «… Serial.begin (15200);» қажет емес.

Кез келген Serial функциясын (Serial.read (), Serial.write () және т.б.) кез келген инициализациясыз шақыруға болады.

Егер қандай да бір себептермен ол кодта болса, компилятор оны елемейді.

2 -жағдай: TTL сериясын USB адаптеріне қолдану:

Осылайша, жүктеуші STM32 USB байланысын қолдамайды, сондықтан эскиздерді жүктеу үшін сізге TX/ RX 1 (PIN9 PA9 және PA10) қосылған сериялық адаптер қажет.

Бұл жағдайда кез келген уақытта индексі жоқ «сериялық» код болып табылады, бұл TX/ RX1 (кодты жүктеу үшін пайдаланылатын порт) дегенді білдіреді. Сонымен, Serial1 TX/ RX 2 -ге (PA2 және PA3 түйреуіштері), ал Serial2 TX/ RX 3 -ке (PA10 және PA11 түйреуіштеріне) сілтеме жасайды. 3 сериясы жоқ.

6 -қадам: Микроконтроллерге мән беру

Микроконтроллерге мән беру
Микроконтроллерге мән беру

Диммердің мысалы - бұл микроконтроллерге мәнді беруді көрсетудің қарапайым әдісі.

Жарықдиодты жарықтылықты басқару үшін 0 -ден 255 -ке дейінгі мәнді беру керек.

Ол Blue Pill -де күткендей жұмыс істемейді:

  1. PwmWrite () функциясын пайдалану үшін pinMode () PWM режимі ретінде жариялануы қажет.
  2. Сіз ешқашан 3 таңбалы санды ала алмайсыз. Serial.read () функциясы «BYTE» болып табылатын буферлік мазмұнды ғана алады. егер сіз «100» деп теріп, «enter» пернесін бассаңыз, буферден тек соңғы «0» жазылады. Ал оның мәні «48» болады («0» үшін ASCII ондық мәні). Егер «100» мәнін шығарғыңыз келсе, «d» теру қажет. Сонымен, ол жарық диодты жарықтылықта ASCII таңбасының ондық мәнін түрлендіреді деп айту дұрыс па? … Жақсы,…
  3. Мәселе, мәндерді Serial.read () функциясымен тікелей салыстыру - бұл алдау әрекеті. Бұл күтпеген мәндерді алатыны сөзсіз. Уақытша айнымалы буферлік мазмұнды сақтау және оны салыстырудан гөрі жақсы әдіс.

Мен 2 -тармақта бұрын түсіндіргенімдей, мен енгізетін өзгертулер код ASCII таңбасын енгізуге мүмкіндік береді және бұл оның ASCII ондық мәніне негізделген жарық диодты жарықтылықты басқарады … мысалы, «бос орын» - 32 мәні (сіз енгізе алатын ең төменгі басып шығарылатын таңба) және «}» ең жоғары болуы мүмкін (мән 126). Басқа таңбалар басып шығарылмайды, сондықтан терминал түсінбейді немесе мүмкін символдардың қосындысы болуы мүмкін (мысалы, «~» - менің пернетақтадағы өшірілген кілт және ол дұрыс жұмыс істемейді). Бұл дегеніміз, бұл күрделі таңба терминалға кіргенде таңбаның өзін және басқа нәрсені жібереді. Әдетте басып шығаруға болмайды. Және бұл соңғы бір код болады. Сонымен қатар, сіздің терминалды есте сақтаңыз, бұл жағдайда «Тасымалдауды қайтару» немесе «Жолды беру» жібермеу керек. Кодтың дұрыс жұмыс істеуі үшін бұған назар аудару қажет.

Егер сіз құлап қалсаңыз, бұл аздап шатастырады, ол нашар болады ….

7 -қадам: Егер мен үш цифрды енгізгім келсе … немесе одан да көп ???

Егер мен үш санды енгізгім келсе … немесе одан да көп ???
Егер мен үш санды енгізгім келсе … немесе одан да көп ???

Сериялық байланыстан бірнеше таңбаны алу оңай емес.

Сериялық буфер - бұл таңбалардың FIFO байты. Кез келген уақытта Serial.read () функциясы шақырылғанда, бірінші жіберілген таңба үймеден шығарылады және басқа жерде сақталады. Әдетте кодтағы char айнымалысы. Назар аударыңыз, аппараттық құралға байланысты, әдетте журнал буферінің ақпаратты қалай сақтай алатыны туралы күту уақыты бар.

Егер сіз бірнеше цифрды сериялы түрде енгізгіңіз келсе, олар UART буферіне кіргенде, символ бойынша жол таңбасын «құрастыру» керек.

Бұл велосипедпен жүру әр буферлік таңбаны оқиды, уақытша айнымалы мәнде сақтайды, оны жолдық массивтің бірінші күйіне жүктейді, келесі орынға өтеді және қолданба тәуелді болғанша қайта бастайды. Циклды аяқтаудың 2 әдісі бар:

  1. Кейбір «соңғы белгі» таңбасын қолданып, мысалы, «арбаның қайтарымы» немесе «жолды беру». «Соңы белгісі» таңбасы табылғаннан кейін цикл аяқталады.
  2. Сонымен қатар, тізбектегі символдар саны шектеулі болуы мүмкін, сондықтан интерактивті циклдар саны шектеулі. Ол шекті деңгейге жеткенде, айталық, 4, әдеттегі аяқталуды өздігінен алады.

Мұны қалай жасауға болатынын қарапайым мысалда қарастырайық:

  • «\ N» сияқты «аяқталатын» таңбаны орнатыңыз (бұл ASCII char жолының берілуін білдіреді).
  • Serial.available () шындық
  • Serial.read () сақтау уақытша char айнымалысына әкеледі. Есіңізде болсын: Serial.read () буферді «оқиды», ол таза болады және келесі таңба оған жүктеледі.
  • осы айнымалы мәнмен жол айнымалысын көбейтіңіз
  • Егер соңғы char «соңы» болса, циклден шығыңыз.

Әдетте, сериялық таңбалар жиынын алу тәртібі суретке ұқсайды.

Ол Дэвид А. Меллис мырзаның бастапқы кодының кең бейімделуіне негізделген.

Қолданбаңыз және оны сынап көріңіз. Есіңізде болсын: мәндерді 3 таңбалы форматта енгізу керек.

Бұл әзірше, мен қосымша сериялық байланыс туралы мәлімет бермеймін. Бұл жерде қамту өте күрделі және оған Intructables лайықты.

Бұл сізге Blue Pill -дегі мысалдарды қолдануға көмектеседі деп үміттенемін және сізге осы кішкене тақта үшін дұрыс кодты түсіндіруге көмектеседі.

Басқа нұсқаулықта кездескенше.

Ұсынылған: