Мазмуну:

Ошентип, сиз STM32duino жүктөгүчтү "Көк таблеткаңызга" жүктөйсүз Эми эмне болот ?: 7 кадам
Ошентип, сиз STM32duino жүктөгүчтү "Көк таблеткаңызга" жүктөйсүз Эми эмне болот ?: 7 кадам

Video: Ошентип, сиз STM32duino жүктөгүчтү "Көк таблеткаңызга" жүктөйсүз Эми эмне болот ?: 7 кадам

Video: Ошентип, сиз STM32duino жүктөгүчтү
Video: Загадка Титаника : Как они могли не заметить айсберг?! Самая подробная история! 2024, Июль
Anonim
Ошентип, сиз STM32duino жүктөгүчтү өзүңүзгө жүктөйсүз
Ошентип, сиз STM32duino жүктөгүчтү өзүңүзгө жүктөйсүз
Ошентип, сиз STM32duino жүктөгүчтү өзүңүзгө жүктөйсүз
Ошентип, сиз STM32duino жүктөгүчтү өзүңүзгө жүктөйсүз

Эгерде сиз STM32duino жүктөгүчтүн же башка ушуга окшош документтердин кантип жүктөлгөнүн түшүндүргөн менин көрсөтмөлөрүмдү окуп чыксаңыз, анда сиз коддун мисалын жүктөп көрүңүз жана … эч нерсе болбошу мүмкүн.

Көйгөй, көптөгөн, эгерде "Generic" STM32 үчүн бардык мисалдар кутудан иштебейт. STM32 "Blue Pill" тактаңызда иштөө үчүн кичине өзгөртүүлөр керек болот.

Мен эмнени өзгөртүү керектигин жана эмне үчүн 4 коддун мисалын тандайм. Коддор: "BlinkWithoutDelay", "Fading", "Dimmer" жана "AnalogInSerial".

Эскертүү, мен эч нерсе кодировка кылган жокмун. Мен жөн гана түзгөн коддорго кичинекей өзгөртүүлөрдү киргизем:

Дэвид А. Меллис жана Том Иго, Марти Боливар жана Скотт Фицджералд тарабынан кээ бир учурларда кеч өзгөртүлгөн

Том Иго жана кеч Брайан Ньюболд тарабынан өзгөртүлгөн

Ошентип, мен авторлордун аттарын мен өзгөрткөн коддордо деле сактоону туура көрөм жана жаратуу кредитин сактайм.

1 -кадам: Pins and Pins …. Эмне үчүн код иштебейт?

Pins and Pins …. Эмне үчүн Код иштебейт?
Pins and Pins …. Эмне үчүн Код иштебейт?

Келгиле, STM32 "Көк таблетка" пин карап көрөлү. Эскертүү казыктары PA1 же PC2 катары аныкталат.

Мисалы, "BlinkWithoutDelay" кодунун мисалын карап көрсөңүз, пин "33" деп жарыяланат … Эмнеге?

Марти Боливар мырза бул кодду MAPLE тактасына өткөрүп бергени үчүн деп шектенип жатам.

Менин оюмча, анын коду "Blue Pill" такталарына шайкеш келсин деп ойлогон эмес.

Maple жана Maple мини тактасынын казыктары Arduino сыяктуу сандык түрдө жарыяланат, бирок алар 33, 24 сыяктуу сандарды колдонушат.

Мен код иштебей турганын айттымбы? Менин катам. Код эч кандай катасыз түзүлөт жана "Көк таблеткага" туура жүктөлөт, менин оюмча, бул чынында эле иштеп жатат, бирок GPIO чыгарылышын колдонуу менен биз күткөн жокпуз. Жада калса жетпей калышы мүмкүн.

Андыктан күтүлгөндөй иштеши үчүн кодго кичине өзгөртүүлөр керек.

2 -кадам: Келгиле, кээ бир пиндерди "аныктайлы"

Келгиле
Келгиле

Бул жакшы код практикасы, ресурстарды оңой аныктоо же өзгөрмөлөрдү же константаларды билдирүү катары жарыялоо. Бул кодду түшүнүүгө жана каталарды оңдоого жеңилдик берет.

Мен Arduino казыктарын мындай деп жарыяладым:

const int ledPin = 13;

…"

Эгер сиз мага жаксаңыз, балким, сиз өзүңүздөн: "Кантип мен PC13 сыяктуу аталыштар менен төөнөгүчтөрдү жарыялайм ???"

Жооп: "#define" C билдирүүсүн колдонуңуз.

Ошентип, pinout чүчүкулагы боюнча, PC13 - бул "BluePill" ичиндеги LED диапазонубуздагы пин. Аны колдонуу үчүн, китепканалардын аныктамасынан кийин (#камтыйт …) жана башка нерселердин алдында мындай деп жарыялайт элем:

#аныктоо LedPin PC13

…"

Эскертүү NO ";" жок сапты токтотуу, NOR "=" дайындоо.

Эки кодду тең салыштырыңыз. Алардын бири IDEден жүктөлгөн баштапкы мисал. Экинчиси, мен "BluePill" менен иштөө үчүн бир аз туураладым.

Мен коддо колдонууну каалаган бардык казыктарды жарыялоону сунуштайм. Ал тургай, алар ADC киргизүү катары колдонууну көздөп жатышат (бул тууралуу кийинчерээк).

Бул сиздин жашооңузду жеңилдетет.

3 -кадам: PinMode () … Пиндериңизди кантип колдоносуз …

Улантуудан мурун PinMode () функциясын түшүнөлү.

Arduino сыяктуу эле, STM32 пиндери бир нече функцияга ээ. Тигил же бул жолду тандоонун эң жөнөкөй жолу - pinMode () билдирүүсүн колдонуу.

Arduino жеткиликтүү 3 гана режимге ээ, INPUT, OUTPUT, же INPUT_PULLUP.

Башка жагынан алганда, STM32де pinMode () көптөгөн даамдары бар. Алар:

ЧЫГУУ -Негизги санариптик чыгуу: пин жогору болгондо, чыңалуу +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го 2 жол менен таандык болушу мүмкүн: analogWrite () же pwmWrite (), БИРОК, analogWrite () pinMode () = OUTPUT болгондо гана иштейт. Башка жагынан алганда, pwmWrite () pinMode () = PWM болгондо гана иштейт.

PA0ду алалы, мисалы: бул аналогдук/pwm чыгуучу талапкер.

analogWrite (): бул мындай деп жарыялайт:

….

#depine ledPin PA0

pinMode (ledPin, OUTPUT);

analogWrite (ledPin, <саны>);

……"

бул жерде сан 0 менен 255 ортосунда болушу керек, Arduino сыяктуу. Чынында, бул Arduino менен артка шайкеш келет.

pwmWrite (): минтип билдириңиз:

#depine ledPin PA0

pinMode (ledPin, PWM);

pwmWrite (ledPin, <саны.>);

…."

Кайсы жерде сан 0 ~ 65535тин ортосунда болушу керек, бул чечим Arduinoдон алда канча жогору.

Сүрөттөрдө 2 кодду салыштырууга болот. Сиз ошондой эле баштапкы кодду көрө аласыз.

5 -кадам: STM32 сериялык байланыш

STM32 Сериялык Байланыш
STM32 Сериялык Байланыш

Келгиле, STM32де USART интерфейстери кандай уюштурулганын карап көрөлү. Ооба, көптүк интерфейстер ….

"Көк таблеткада" 3 USART бар (RX/ TX 1 ~ 3), жана, эгер сиз жүктөгүчтү колдонуп жатсаңыз, USB колдонууга мүмкүнчүлүк берет, ал эч кимге туташкан эмес.

USB колдонгонуңузга же колдонбогонуңузга жараша, кодуңузда сериялык портту тигил же бул жол менен жарыялашыңыз керек.

Case 1: USB колдонуу:

Ошентип, эскиздер USB аркылуу түз жүктөлөт. BOOT0 секирүүчүсүн 1 позицияга жана кайра 0ге жылдыруунун кажети жок.

Бул учурда, индекси жок "Сериялык" деп жарыялаган убактыңыз USB аркылуу байланышты билдирет.

Ошентип, Serial1, TX/ RX 1ди билдирет (Pins PA9 жана PA10); Serial2, TX/ RX 2 (PA2 жана PA3 казыктары) жана 3 Serial TX/ RX 3 (Pins PA10 жана PA11) дегенди билдирет.

Мына ушундай жол менен иштеп жатабыз. Мен коддоонун мындай ыкмасына мисалдардагы өзгөртүүлөрдү берем.

Дагы бир нерсе: "Сериялык USB" инициализациялоонун кажети жок. Башкача айтканда, "… Serial.begin (15200);" маанилүү эмес.

Ар кандай Serial функциясын (Serial.read (), Serial.write () ж.б.) эч кандай инициализациясыз чакырса болот.

Эгерде кандайдыр бир себептерден улам ал коддо болсо, компилятор аны этибарга албайт.

Case 2: USB адаптерине TTL сериясын колдонуу:

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

Бул учурда, индекси жок "Сериал" каалаган убакта TX/ RX1ди билдирет (кодду жүктөө үчүн колдонулган порт). Ошентип, Serial1 TX/ RX 2ге (PA2 жана PA3 төөнөгүчтөрүнө) жана Serial2 TX/ RX 3кө (Pins PA10 жана PA11) тиешелүү. Serial3 жеткиликтүү эмес.

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

Микроконтроллерге баалуулукту берүү
Микроконтроллерге баалуулукту берүү

Dimmer мисалы - микроконтроллерге баалуулукту кантип өткөрүүнүн жөнөкөй жолу.

Жарык диоддун жарыктыгын көзөмөлдөө үчүн 0дон 255ке чейинки мааниге өтүү керек.

Бул Blue Pill күтүлгөндөй иштебейт:

  1. PwmWrite () функциясын колдонуу үчүн, pinMode () PWM режими катары жарыяланууга тийиш.
  2. Сиз 3 цифралуу санды эч качан ала албайсыз. Serial.read () функциясы "BYTE" болгон буфердик мазмунду тартып алат. эгер сиз "100" деп терсеңиз жана "enter" бассаңыз, буферден акыркы "0" гана алынат. Жана анын мааниси "48" болот ("0" үчүн ондук ASCII мааниси). Эгерде "100" маанисин чыгаргыңыз келсе, "d" терүү керек. Ошентип, ал ASCII символун ондук маанини LED жарыктыгына айландырат деп айтуу туура, туурабы? … Мейли,…
  3. Көйгөй, Serial.read () функциясынан түздөн -түз баалуулуктарды картага алуу - бул алдоо аракети. Күтүлбөгөн баалуулуктарга ээ болуу дээрлик анык. Жакшыраак мамиле - буфердик мазмунун убактылуу өзгөрмөлүү жана картага караганда.

Мен 2 -пунктта айтып кеткендей, мен киргизген өзгөртүүлөр ASCII символун киргизүүгө мүмкүндүк берет жана бул анын ASCII ондук маанисине негизделген LED жарыктыгын көзөмөлдөйт … мисалы, "боштук" 32 -мааниге ээ (чындыгында сиз киргизе турган эң кичине басылып чыгарылган символ) жана "}" эң бийик болушу мүмкүн (мааниси 126). Башка тамгалар басылбайт, андыктан терминал түшүнбөйт же символдун кошулмасы болушу мүмкүн ("~" сыяктуу менин клавиатурамдагы өлүк ачкыч жана туура иштебейт). Бул термин, бул татаал символ терминалга киргенде, символдун өзүн жана башка нерсени жөнөтөт дегенди билдирет. Адатта басып чыгарууга болбойт. Жана бул акыркы бир кодду камтыйт. Ошондой эле, Терминалыңызды эстен чыгарбаңыз, бул учурда "Араба кайтаруу" же "Линия түрмөгү" жөнөтүлбөшү керек. Коддун туура иштеши үчүн буга көңүл буруу керек.

Эгерде сиз кулап кетсеңиз, анда бир аз түшүнүксүз, эң жаманы болот ….

7 -кадам: Эгерде мен үч цифраны жазгым келсе … же дагы да ??

Эгерде мен үч цифраны жазгым келсе … же дагы да ??
Эгерде мен үч цифраны жазгым келсе … же дагы да ??

Сериялык байланыштан бир нече белгини алуу оңой иш эмес.

Сериялык буфер - бул символдордун FIFO байт үймөгү. Качан Serial.read () функциясы чакырылганда, биринчи жөнөтүлгөн char үймөдөн алынып, башка жерде сакталат. Көбүнчө коддогу char өзгөрмөсү. Эскертүү, жабдуулардан көз каранды, адатта, журналдын буфери маалыматты кантип сактай алаары боюнча бир аз убакыт бар.

Эгерде сиз бир нече цифраны сериялуу түрдө киргизүүнү кааласаңыз, UART буферине киргенде, сиз саптын символу боюнча "түзүшүңүз" керек.

Бул велосипед тебүү дегенди билдирет, ар бир буфердик чарды окуйт, темп өзгөрмөсүндө сактайт, аны сап массивинин биринчи абалына жүктөйт, кийинки позицияга жылат жана кайра башталат, ошондо… Циклди токтотуунун 2 жолу бар:

  1. "Артка кайтуу" же "Сапты берүү" сыяктуу кээ бир "акыркы белги" белгисин колдонуу. "End Mark" чар табылганда, цикл аяктайт.
  2. Же болбосо, чынжырдагы символдордун саны чектелиши мүмкүн, андыктан интерактивдүү циклдердин саны. Ал чекке жеткенде, айталы, 4, күнүмдүк бүтүмдөрдү өз алдынча алат.

Келгиле, муну кантип жасоо үчүн жөнөкөй мисалды карап көрөлү:

  • "\ N" сыяктуу "аяктоочу" чарды коюңуз (бул ASCII char линиясын билдирет).
  • Serial.available () чын
  • сактоо Serial.read () убактылуу char өзгөрмөсүнө алып келет. Эсиңизде болсун: Serial.read () иш жүзүндө буферди "окуйт", ал таза жана кийинки тамга жүктөлөт.
  • бул чаранын жардамы менен саптын өзгөрмөсүн көбөйтүңүз
  • Эгерде акыркы char "end" болсо, циклден чыгыңыз.

Адатта, сериялык тамгалар массивин алуу адаты сүрөткө окшош.

Бул Дэвид А. Меллис мырзанын оригиналдуу кодунун кеңири адаптациясына негизделген.

Колдонууга жана сынап көрүүгө эркин болуңуз. Эсиңизде болсун: маанилер 3 цифралык форматта киргизилиши КЕРЕК.

Бул азырынча. Мен кошумча сериялык байланыш чоо -жайын узартпайм. Бул жерде жабуу өтө татаал жана ага Intructables таандык.

Бул сизге Blue Pill мисалдарын колдонууга жардам берет деп үмүттөнөм жана сизге кичинекей тактай үчүн канчалык туура код берилгенин түшүнүүгө жардам берет деп үмүттөнөм.

Башка көрсөтмөлөрдө көрүшкөнчө.

Сунушталууда: