Съдържание:
- Стъпка 1: Игли и щифтове … Защо кодът не работи?
- Стъпка 2: Нека „дефинираме“някои пинове…
- Стъпка 3: PinMode () … Как ще използвате вашите пинове …
- Стъпка 4: AnalogWrite () срещу PwmWrite () … Аналогов изход в 2 вкуса
- Стъпка 5: STM32 серийна комуникация
- Стъпка 6: Предаване на стойност на микроконтролера
- Стъпка 7: И ако искам да напиша три цифри … или още повече ??
Видео: И така, зареждате STM32duino Bootloader във вашето "синьо хапче" И какво сега ?: 7 стъпки
2024 Автор: John Day | [email protected]. Последно модифициран: 2024-01-30 07:50
Ако вече сте прочели инструкциите ми, обясняващи как се зарежда STM32duino буутлоудъра или друга подобна документация, опитайте пример за зареждане на код и … може да не се случи нищо.
Проблемът е, че много, ако не всички примери за "Generic" STM32 няма да работят нестандартно. Ще бъдат необходими незначителни промени, за да започнете да работите на вашата дъска STM32 "Blue Pill".
Ще избера 4 примера за код, за да обясня какво трябва да се промени и защо. Кодовете са: "BlinkWithoutDelay", "Fading", "Dimmer" и "AnalogInSerial".
Обърнете внимание, че НЕ кодирах нищо. Просто издавам малки промени в кодовете, създадени от:
Дейвид А. Мелис и късно модифициран от Том Иго, Марти Боливар и някои случаи от Скот Фицджералд
Том Иго и късно модифициран от Брайън Нюболд
Така че предпочитам да запазя имената на авторите дори в кодовете, които променям, запазвайки заслугата за създаване.
Стъпка 1: Игли и щифтове … Защо кодът не работи?
Нека да разгледаме извода на STM32 "Blue Pill". Забележете щифтовете се идентифицират като PA1 или PC2 …, нещо подобно.
Ако погледнете например в примера на кода "BlinkWithoutDelay", щифтът се декларира като "33" …. Защо?
Подозирам, че това е така, защото г -н Марти Боливар е пренесъл този код за MAPLE борда.
Мисля, че не е имал намерение да остави код съвместим с дъските "Blue Pill".
Щифтовете за мини дъска Maple и Maple са цифрово декларирани, като Arduino, въпреки че използват числа като 33, 24 и някои като това.
Казах, че кодът не работи? Моя грешка. Кодиране без грешка и правилно качване в "Blue Pill", така че според мен наистина работи, но не очакваме използването на GPIO изход. Може дори да не е наличен.
Така че са необходими малки промени в кода, за да работи според очакванията.
Стъпка 2: Нека „дефинираме“някои пинове…
Добра практика в кода е да декларирате ресурси като лесни за идентифициране или значение променливи или константи. Това ще ви позволи да кодирате по -лесно за разбиране и отстраняване на проблеми.
Използвах деклариране на Arduino щифтове по следния начин:
…
const int ledPin = 13;
…"
Ако ме харесвате, може би се питате: "Как мога да декларирам пинове с имена като PC13 ???"
Отговорът е: Използвайте "#define" C израз.
Така че, според извличането на пина, PC13 е щифтът, който имаме на борда на LED в "BluePill". За да го използвам, бих декларирал така, точно след определението на библиотеките (#include …) и преди всичко друго:
…
#дефинирайте LedPin PC13
…"
Обърнете внимание, че НЯМА ";" прекъсване на линия, NOR "=" присвояване.
Сравнете двата кода. Единият е оригиналният пример, зареден от IDE. Второто е това, което направих, за да работя с "BluePill".
Силно препоръчвам да декларирате всички пинове, които възнамерявате да използвате в кода. Дори тези възнамеряват да използват като ADC вход (повече за това по -късно).
Това ще направи живота ви лесен.
Стъпка 3: PinMode () … Как ще използвате вашите пинове …
Преди да продължим, нека разберем функцията PinMode ().
Подобно на Arduino, STM32 щифтовете имат множество функции. Най -простият начин да изберете един или друг е използването на оператора pinMode ().
Arduino разполагат само с 3 режима, INPUT, OUTPUT или INPUT_PULLUP.
STM32, от друга страна, има много вкусове на pinMode (). Те са:
ИЗХОД -Основен цифров изход: когато щифтът е ВИСОК, напрежението се поддържа на +3.3v (Vcc) и когато е НИСКО, то се дърпа надолу към земята
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 щифтове "Blue Pill" е необходимо да декларирате неговото поведение, т.е. как ще работи. Точно това прави функцията pinMode ().
Така че, нека сега да се съсредоточим колко правилно е зададен аналогов изход. Може да се декларира или като OUTPUT режим или PWM режим.
По същия начин, аналоговите стойности могат да бъдат приписани на GPIO по 2 начина: 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 серийна комуникация
Нека да видим как са подредени интерфейсите USART в STM32. Да, интерфейси в множествено число ….
"Blue Pill" има 3 USART (RX/ TX 1 ~ 3) и ако използвате буутлоудър, който ви позволява да използвате USB, той не е свързан с никой от тях.
В зависимост от това дали използвате или не използвате USB, трябва да декларирате сериен порт по един или друг начин във вашия код.
Случай 1: Използване на USB:
По този начин скиците се изтеглят директно чрез USB. Няма нужда да премествате джъмпера BOOT0 в 1 позиция и обратно в 0.
В този случай всеки път, когато декларирате „Serial“без индекс, означава комуникация чрез USB.
И така, Serial1 означава TX/ RX 1 (щифтове PA9 и PA10); Serial2, означава TX/ RX 2 (щифтове PA2 и PA3) и Serial 3 означава TX/ RX 3 (Pins PA10 и PA11).
Това е начинът, по който работим. Ще представя промени в примери за този начин на кодиране.
Друго нещо: „Сериен USB“не се нуждае от инициализация. С други думи, "… Serial.begin (15200);" не е необходимо.
Възможно е извикване на всяка серийна функция (Serial.read (), Serial.write () и т.н.) без никаква инициализация.
Ако по някаква причина той присъства в кода, компилаторът ще го игнорира.
Случай 2: Използване на TTL серия към USB адаптер:
По този начин буутлоудърът не поддържа естествена STM32 USB комуникация, така че имате нужда от USB към сериен адаптер, свързан към TX/ RX 1 (щифт PA9 и PA10), за да качите скици.
В този случай всеки път, когато "Serial" без индекс е код, означава TX/ RX1 (порт, използван за качване на кода). И така, Serial1 се отнася до TX/ RX 2 (щифтове PA2 и PA3), а Serial2 се отнася до TX/ RX 3 (Pins PA10 и PA11). Няма наличен Serial3.
Стъпка 6: Предаване на стойност на микроконтролера
Примерът с димер е лесен начин да покажете как да предадете стойност на микроконтролера.
Предполага се, че трябва да се предаде стойност от 0 до 255 за контрол на яркостта на LED.
НЕ ще работи според очакванията в Blue Pill поради:
- За да използвате функцията pwmWrite (), pinMode () ТРЯБВА да бъде деклариран като PWM режим.
- Никога няма да получите цяло 3 -цифрено число. Функцията Serial.read () улавя само съдържанието на буфер, което е "BYTE". ако въведете "100" и натиснете "enter", само последното "0" ще бъде заснето от буфера. И стойността му ще бъде "48" (десетична ASCII стойност за "0"). Ако възнамерявате да издадете стойност "100", е необходимо да въведете "d". Така че, правилно е да се каже, че ще преобразува десетична стойност на ASCII символ в LED яркост, нали ?? …, Е, нещо като …
- Проблем, картите стойности директно от функцията Serial.read () са трикове. Почти сигурно е да получите неочаквани стойности. По -добрият подход е съдържанието на буфер за съхранение във временна променлива и след това я картографирайте.
Както обясних по -рано в точка 2, кодът, който въвеждам, ще позволи да се въведе ASCII символ и това ще контролира яркостта на светодиода въз основа на неговата десетична стойност ASCII … например "интервалът" е стойност 32 (всъщност е най -ниският печатлив символ, който можете да въведете) и "}" е възможно най -високата (стойност 126). Другите символи не могат да се отпечатват, така че терминалът няма да разбере или е възможно сложна комбинация (като "~" е мъртъв клавиш в клавиатурата ми и няма да работи правилно). Това означава, че този сложен знак, когато влезе в терминала, ще изпрати самия символ и нещо друго. Обикновено не се печата. И дали този последен код ще бъде уловен. Също така, имайте предвид, че вашият терминал, в този случай, НЕ трябва да изпраща нито „Carriage Return“, нито „Line Feed“. Трябва да обърнете внимание на това, за да работи кодът правилно.
Ако сте паднали, това е малко объркващо, става най -лошото ….
Стъпка 7: И ако искам да напиша три цифри … или още повече ??
Получаването на множество знаци от серийна комуникация не е проста задача.
Серийният буфер е FIFO байтова купчина символи. Всеки път, когато функцията Serial.read () се обажда, първият изпратен знак се премахва от купчината и се съхранява на друго място. Обикновено char променлива в кода. Забележете, в зависимост от хардуера, обикновено има изчакване за това как буферът за регистрация може да съхранява информация.
Ако възнамерявате да въведете повече от една цифра чрез сериен код, ще трябва да "съставите" низ по символ, докато те влизат в UART буфера.
Това означава циклично четене на всеки буферен символ, съхраняване в временна променлива, зареждане на първа позиция на низов масив, преместване на следваща позиция и започване отначало, докато … добре, зависи от приложението. Има 2 начина за прекратяване на цикъла:
- Използване на някакъв знак „краен знак“, като „връщане на каретка“или „Линейно подаване“. Веднага след като char "end Mark" бъде намерен, цикълът завършва.
- Алтернативно, броят на знаците в низовата верига може да бъде ограничен, както и броят на интерактивните цикли. Когато достигне границата, да речем, 4, придобийте рутинни завършвания от себе си.
Нека да разгледаме в прост пример как се прави това:
- Задайте знак „край“, като например „\ n“(това означава символ за емисия на линии ASCII).
- цикъл междувременно Serial.available () е вярно
- съхраняването на Serial.read () води до временна променлива char. Запомнете: веднага щом Serial.read () действително "прочете" буфера, той е чист и следващият знак се зарежда в него.
- увеличете низова променлива с този char
- Ако последният знак е "край", излезте от цикъла.
Обикновено рутината за получаване на сериен масив изглежда като картина.
Той се основава на обширна адаптация на оригиналния код на г -н Дейвид А. Мелис.
Не се колебайте да го използвате и тествате. Запомнете: стойностите ТРЯБВА да бъдат въведени в трицифрен формат.
Това е засега. Няма да се разширявам в допълнителни подробности за серийната комуникация. Тук е твърде сложно, за да се покрие и заслужава собствените си „Ненарушими“.
Надявам се да ви помогне да използвате примери в Blue Pill и да ви даде малко просветление колко правилен е кодът за тази малка дъска.
Ще се видим в други инструкции.
Препоръчано:
Няма пикаене сега, устройство за регулиране на поведението на домашни любимци, което спира котките да пикаят наоколо във вашия дом: 4 стъпки
Няма пикаене сега, устройство за регулиране на поведението на домашните любимци, което спира котките да пикаят наоколо във вашия дом: Бях толкова притеснен от котето си, че тя обича да пикае в леглото ми, проверих всичко, от което се нуждае, и също я заведох на ветеринар. След като отстраних всичко, което мога да мисля и слушам думата на лекаря, осъзнавам, че тя просто има някакво лошо поведение. Така че
Ремонт на безжични слушалки Creative Tactic3D Rage (синьо мига, без сдвояване, смяна на батерията): 11 стъпки
Ремонт на безжични слушалки Creative Tactic3D Rage (синьо мига, без сдвояване, смяна на батерията): Това ръководство в снимки е за тези, които притежават Creative слушалки, които са загубили сдвояването с USB предавателя и повторното сдвояване не работи, тъй като слушалките бавно мигат синьо и не реагира повече на бутоните. В това състояние не можете да
Какво е процесор, какво прави и как да го отстраним: 5 стъпки
Какво е процесор, какво прави и как да го отстранявате: Всеки ден тук посочвате термините " процесор " или " Процесор " ще бъда хвърлен наоколо, но наистина ли знаете какво означава? Ще разгледам какво е процесор и какво прави, след това ще разгледам често срещаните проблеми с процесора и как евентуално да ги поправя
128x64 жълто/синьо OLED за Arduino Nano, с TSL2591: 3 стъпки
128x64 жълто/синьо OLED за Arduino Nano, с TSL2591: Можете да изградите OLED дисплей върху Arduino Nano със спектроскопичен сензор TSL2591 (добре, два канала - визуален и NIR …) чрез комбиниране на примери за скици онлайн. Това, което получавате, е 4-редов дисплей на общия поток, визуалния поток, NIR и индекс на кал
Носене на барабани: Барабани във вашето облекло!: 7 стъпки
Носене на барабани: Барабани във вашето облекло !: Погледнете ездачите на всеки градски автобус. Много от тях са включени в своите музикални плейъри, подслушвайки ритъма, преструвайки се, че имат на разположение барабани. Сега няма нужда да се преструвате! Носенето на барабани дава на амбициозните барабанисти напълно преносим и