Агуулгын хүснэгт:

Тиймээс та STM32duino Bootloader -ийг "Цэнхэр эм" дээрээ ачаалж байна Тэгвэл одоо яах вэ?: 7 алхам
Тиймээс та STM32duino Bootloader -ийг "Цэнхэр эм" дээрээ ачаалж байна Тэгвэл одоо яах вэ?: 7 алхам

Видео: Тиймээс та STM32duino Bootloader -ийг "Цэнхэр эм" дээрээ ачаалж байна Тэгвэл одоо яах вэ?: 7 алхам

Видео: Тиймээс та STM32duino Bootloader -ийг
Видео: BIOS, CMOS, UEFI - What's the difference? 2024, Арваннэгдүгээр
Anonim
Тиймээс, та STM32duino Bootloader -ийг өөрийн компьютерт ачаалж байна
Тиймээс, та STM32duino Bootloader -ийг өөрийн компьютерт ачаалж байна
Тиймээс, та STM32duino Bootloader -ийг өөрийн компьютерт ачаалж байна
Тиймээс, та STM32duino Bootloader -ийг өөрийн компьютерт ачаалж байна

Хэрэв та STM32duino bootloader эсвэл үүнтэй төстэй бусад баримт бичгийг хэрхэн ачаалж байгааг тайлбарласан миний зааварчилгааг уншсан бол та кодын жишээг ачаалж үзээд юу ч болоогүй байж магадгүй юм.

Асуулт бол "Generic" STM32 -ийн бүх жишээ биш бол ихэнх нь ажиллахгүй болно. STM32 "Blue Pill" самбар дээр ажиллахын тулд бага зэрэг өөрчлөлт оруулах шаардлагатай болно.

Юу, яагаад өөрчлөх шаардлагатайг тайлбарлахын тулд би 4 кодын жишээг сонгох болно. Кодууд нь: "BlinkWithoutDelay", "Fading", "Dimmer", "AnalogInSerial".

Би юу ч кодлоогүй гэдгийг анхаарна уу. Би зүгээр л үүсгэсэн кодуудад бага зэрэг өөрчлөлт оруулдаг.

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

Том Игоог сүүлд өөрчилсөн Брайан Ньюболд

Тиймээс, би зохиогчийн нэрийг өөрчилсөн код дээрээ хадгалж үлдэхийг илүүд үздэг.

Алхам 1: Зүү ба зүү …. Код яагаад ажиллахгүй байна вэ?

Pins and Pins…. Код яагаад ажиллахгүй байна вэ?
Pins and Pins…. Код яагаад ажиллахгүй байна вэ?

STM32 "Цэнхэр эм" зүүг авч үзье. Тэмдэглэлийн зүү нь PA1 эсвэл PC2 гэж тодорхойлогддог.

Хэрэв та жишээ нь "BlinkWithoutDelay" кодын жишээг харвал зүүг "33" гэж зарласан болно. Яагаад?

Ноён Марти Боливар энэ кодыг MAPLE самбар дээр зөөсөн болохоор тэр гэж би бодож байна.

Миний бодлоор кодыг "Цэнхэр эм" самбартай нийцүүлэхийг зөвшөөрсөнгүй.

Maple болон Maple мини хавтангийн зүү нь Arduino шиг тоон хэлбэрээр зарлагддаг боловч 33, 24 гэх мэт тоог ашигладаг.

Би код ажиллахгүй байна гэж хэлсэн үү? Миний буруу. Кодыг ямар ч алдаагүйгээр эмхэтгэн "Blue Pill" руу зөв байршуулаарай, тиймээс энэ нь үнэхээр ажиллаж байгаа гэж би бодож байна, гэхдээ 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 нь INPUT, OUTPUT, INPUT_PULLUP гэсэн 3 л горимтой.

Нөгөө талаас STM32 нь pinMode () -ийн олон амттай байдаг. Тэд:

OUTPUT -Үндсэн дижитал гаралт: зүү нь өндөр байх үед хүчдэлийг +3.3v (Vcc) дээр байлгаж, бага байхад түүнийг газарт буулгадаг

OUTPUT_OPEN_DRAIN -Нээлттэй ус зайлуулах горимд тээглүүр нь одоогийн урсгалыг хүлээн авснаар "бага", харин эсэргүүцлийг нэмэгдүүлснээр "өндөр" байгааг илтгэнэ

INPUT_ANALOG -Энэ нь зүүг аналог (дижитал биш) уншихад ашиглах тусгай горим юм. Зүү дээрх хүчдэл дээр ADC хувиргалтыг хийх боломжийг олгодог

INPUT_PULLUP -Энэ горим дахь зүүний байдлыг INPUT -тэй ижил байдлаар мэдээлдэг боловч зүүний хүчдэлийг +3.3v руу зөөлөн "татаж" авдаг

INPUT_PULLDOWN -Энэ горим дахь зүүний байдлыг INPUT -тэй адил мэдээлдэг боловч зүүний хүчдэлийг 0v рүү зөөлөн "татаж" өгдөг

INPUT_FLOATING -INPUT -ийн синоним

ХОУХ -Энэ бол зүүг ХОУХ -ны гаралтанд ашиглах тусгай горим юм (дижитал гаралтын онцгой тохиолдол)

PWM_OPEN_DRAIN -ХОУХ -ны нэгэн адил, 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 (): үүнийг ингэж зарлаж байна.

….

#ledPin PA0 -ийг тодорхойлох

pinMode (ledPin, OUTPUT);

analogWrite (ledPin, <тоо>);

……"

Энд тоо нь Arduino шиг 0 -ээс 255 хооронд байх ёстой. Үнэндээ энэ нь Arduino -тэй нийцдэг.

pwmWrite (): ингэж мэдэгдээрэй:

#ledPin PA0 -ийг тодорхойлох

pinMode (ledPin, PWM);

pwmWrite (ledPin, <тоо.>);

…."

Тоо нь 0 ~ 65535 хооронд байх ёстой бөгөөд энэ нь Arduino -ээс хамаагүй өндөр нарийвчлалтай байх ёстой.

Зураг дээр 2 кодыг хооронд нь харьцуулах боломжтой. Та мөн анхны кодыг харах боломжтой.

Алхам 5: STM32 цуваа холбоо

STM32 цуваа холбоо
STM32 цуваа холбоо

START32 дээр USART интерфэйсүүд хэрхэн зохион байгуулагдаж байгааг харцгаая. Тийм ээ, олон тооны интерфэйсүүд ….

"Цэнхэр эм" нь 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.read (), Serial.write (), гэх мэт) эхлүүлэхгүйгээр дуудах боломжтой.

Хэрэв ямар нэгэн шалтгаанаар кодонд байгаа бол хөрвүүлэгч үүнийг үл тоомсорлох болно.

Тохиолдол 2: USB адаптер руу TTL seria ашиглах:

Ийм байдлаар bootloader нь эх STM32 USB холболтыг дэмждэггүй тул ноорог байршуулахын тулд TX/ RX 1 (зүү PA9 ба PA10) -д холбогдсон USB -ээс цуваа адаптер хэрэгтэй болно.

Энэ тохиолдолд ямар ч индексгүй "Цуваа" нь код бөгөөд энэ нь TX/ RX1 (кодыг байршуулахад ашигладаг порт) гэсэн үг юм. Тиймээс Serial1 нь TX/ RX 2 (PA2 ба PA3 зүү), Serial2 нь TX/ RX 3 (PA10 ба PA11 зүү) гэсэн утгатай. Цуврал3 байхгүй байна.

Алхам 6: Үнэ цэнийг микроконтроллерт дамжуулах

Микроконтроллерт үнэ цэнийг дамжуулах
Микроконтроллерт үнэ цэнийг дамжуулах

Диммерийн жишээ бол утгыг микроконтроллерт хэрхэн дамжуулахыг харуулах энгийн арга юм.

LED -ийн тод байдлыг хянахын тулд 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 тэмдгийг оруулах боломжийг олгодог бөгөөд энэ нь LED гэрлийг ASCII аравтын бутархай утга дээр үндэслэн хянах болно … жишээлбэл, "зай" бол 32 утга (үнэндээ таны оруулж болох хамгийн бага хэвлэгдэх тэмдэгт юм) ба "}" нь хамгийн өндөр нь байж болно (утга 126). Бусад тэмдэгтүүдийг хэвлэх боломжгүй тул терминал нь ойлгохгүй эсвэл тэмдэгтүүдийн нэгдэл байж болно ("~" гэх мэт бол миний гарны унтраасан түлхүүр бөгөөд зөв ажиллахгүй болно). Энэ нь нийлмэл тэмдэгт терминалд ороход тэмдэгт өөрөө болон өөр зүйл илгээх болно гэсэн үг юм. Ихэвчлэн хэвлэх боломжгүй. Мөн энэ нь таны авах ёстой хамгийн сүүлийн код юм. Түүнээс гадна терминалаа бүү мартаарай, энэ тохиолдолд "Тээвэр буцах" болон "Шугам тэжээл" -ийг илгээх ёсгүй. Код зөв ажиллахын тулд та үүнийг анхаарч үзэх хэрэгтэй.

Хэрэв та унасан бол энэ нь бага зэрэг ойлгомжгүй байх болно, энэ нь хамгийн муу зүйл болно. …

Алхам 7: Тэгээд хэрэв би гурван оронтой тоог оруулахыг хүсч байвал. эсвэл бүр илүү ??

Тэгээд хэрэв би гурван оронтой тоо бичихийг хүсч байвал …. эсвэл бүр илүү ??
Тэгээд хэрэв би гурван оронтой тоо бичихийг хүсч байвал …. эсвэл бүр илүү ??

Цуваа холболтоос олон тэмдэгт хүлээн авах нь энгийн ажил биш юм.

Цуваа буфер нь FIFO байт тэмдэгтүүд юм. Serial.read () функц дуудаж байх үед анхны илгээсэн char нь овооноос хасагдаж өөр газар хадгалагддаг. Ихэвчлэн код дахь char хувьсагч байдаг. Тоног төхөөрөмжөөс хамаарч, бүртгэлийн буфер нь мэдээллийг хэрхэн хадгалах талаар ихэвчлэн завсарлага гардаг гэдгийг анхаарна уу.

Хэрэв та нэгээс олон оронтой тоог цувралаар оруулах гэж байгаа бол UART -ийн буферт орохдоо тэмдэгт мөрийг тэмдэгтээр нь "бичих" шаардлагатай болно.

Энэ нь дугуй унах нь буфер тэмдэгт бүрийг уншиж, түр зуурын хувьсагчид хадгалж, мөрийн массивын эхний байрлалд ачаалж, дараагийн байрлал руу шилжиж, програмаас хамаарах хүртэл дахин эхлүүлнэ гэсэн үг юм. Циклийг дуусгах 2 арга бий:

  1. "Тэргэнцэр буцах" эсвэл "Шугамын тэжээл" гэх мэт "төгсгөлийн тэмдэг" тэмдэгтийг ашиглана уу. "Төгсгөлийн тэмдэг" гэсэн тэмдэгт олдсон даруйд хүрд дуусна.
  2. Эсвэл хэлхээний хэлхээний тэмдэгтүүдийн тоог хязгаарлаж болох тул интерактив мөчлөгийн тоог хязгаарлаж болно. Энэ нь хязгаарт хүрмэгц 4 -ийг ердийн аргаар олж аваарай.

Үүнийг хэрхэн яаж хийх талаар энгийн жишээг авч үзье.

  • '\ N' шиг "төгсгөл" тэмдэгт тохируулна уу (энэ нь шугамын тэжээл ASCII char гэсэн үг).
  • Энэ хооронд Serial.available () нь үнэн юм
  • Serial.read () -ийг хадгалснаар char түр зуурын хувьсагч гарч ирдэг. Санаж байгаарай: Serial.read () нь буферийг "уншдаг" болмогц энэ нь цэвэр бөгөөд дараагийн тэмдэгт үүнд ачаалагдах болно.
  • энэ тэмдэгт ашиглан string хувьсагчийг нэмэгдүүлэх
  • Хэрэв сүүлчийн тэмдэгт "төгсгөл" бол давталтаас гарна уу.

Ихэвчлэн цуваа тэмдэгтийн массив авах ердийн зураг шиг харагддаг.

Энэ нь ноён Дэвид А. Меллисын анхны кодын өргөн дасан зохицоход үндэслэсэн болно.

Үүнийг үнэгүй туршиж үзээрэй. Санаж байна уу: утгыг 3 оронтой форматаар оруулах ёстой.

Одоохондоо би цуврал харилцааны талаар дэлгэрэнгүй мэдээлэл өгөхгүй. Энд хамруулах нь хэтэрхий төвөгтэй бөгөөд үүнийг Intructables эзэмших ёстой.

Энэ нь Blue Pill -ийн жишээг ашиглахад тусалж, энэхүү бяцхан самбарын код хэр зөв болохыг олж мэдэхэд тусална гэж найдаж байна.

Бусад зааварчилгаа өгөхөөр эргэн уулзацгаая.

Зөвлөмж болгож буй: