Съдържание:

И така, зареждате STM32duino Bootloader във вашето "синьо хапче" И какво сега ?: 7 стъпки
И така, зареждате STM32duino Bootloader във вашето "синьо хапче" И какво сега ?: 7 стъпки

Видео: И така, зареждате STM32duino Bootloader във вашето "синьо хапче" И какво сега ?: 7 стъпки

Видео: И така, зареждате STM32duino Bootloader във вашето
Видео: Zigbee двусторонний энергомонитор постоянного тока MSH - интеграция DC UPS в Home Assistant 2024, Ноември
Anonim
Така че, зареждате STM32duino Bootloader във вашия
Така че, зареждате STM32duino Bootloader във вашия
Така че, зареждате STM32duino Bootloader във вашия
Така че, зареждате STM32duino Bootloader във вашия

Ако вече сте прочели инструкциите ми, обясняващи как се зарежда 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 вкуса

AnalogWrite () срещу PwmWrite () … Аналогов изход в 2 вкуса
AnalogWrite () срещу PwmWrite () … Аналогов изход в 2 вкуса
AnalogWrite () срещу PwmWrite () … Аналогов изход в 2 вкуса
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 серийна комуникация

STM32 серийна комуникация
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 поради:

  1. За да използвате функцията pwmWrite (), pinMode () ТРЯБВА да бъде деклариран като PWM режим.
  2. Никога няма да получите цяло 3 -цифрено число. Функцията Serial.read () улавя само съдържанието на буфер, което е "BYTE". ако въведете "100" и натиснете "enter", само последното "0" ще бъде заснето от буфера. И стойността му ще бъде "48" (десетична ASCII стойност за "0"). Ако възнамерявате да издадете стойност "100", е необходимо да въведете "d". Така че, правилно е да се каже, че ще преобразува десетична стойност на ASCII символ в LED яркост, нали ?? …, Е, нещо като …
  3. Проблем, картите стойности директно от функцията Serial.read () са трикове. Почти сигурно е да получите неочаквани стойности. По -добрият подход е съдържанието на буфер за съхранение във временна променлива и след това я картографирайте.

Както обясних по -рано в точка 2, кодът, който въвеждам, ще позволи да се въведе ASCII символ и това ще контролира яркостта на светодиода въз основа на неговата десетична стойност ASCII … например "интервалът" е стойност 32 (всъщност е най -ниският печатлив символ, който можете да въведете) и "}" е възможно най -високата (стойност 126). Другите символи не могат да се отпечатват, така че терминалът няма да разбере или е възможно сложна комбинация (като "~" е мъртъв клавиш в клавиатурата ми и няма да работи правилно). Това означава, че този сложен знак, когато влезе в терминала, ще изпрати самия символ и нещо друго. Обикновено не се печата. И дали този последен код ще бъде уловен. Също така, имайте предвид, че вашият терминал, в този случай, НЕ трябва да изпраща нито „Carriage Return“, нито „Line Feed“. Трябва да обърнете внимание на това, за да работи кодът правилно.

Ако сте паднали, това е малко объркващо, става най -лошото ….

Стъпка 7: И ако искам да напиша три цифри … или още повече ??

И ако искам да напиша три цифри … или още повече ??
И ако искам да напиша три цифри … или още повече ??

Получаването на множество знаци от серийна комуникация не е проста задача.

Серийният буфер е FIFO байтова купчина символи. Всеки път, когато функцията Serial.read () се обажда, първият изпратен знак се премахва от купчината и се съхранява на друго място. Обикновено char променлива в кода. Забележете, в зависимост от хардуера, обикновено има изчакване за това как буферът за регистрация може да съхранява информация.

Ако възнамерявате да въведете повече от една цифра чрез сериен код, ще трябва да "съставите" низ по символ, докато те влизат в UART буфера.

Това означава циклично четене на всеки буферен символ, съхраняване в временна променлива, зареждане на първа позиция на низов масив, преместване на следваща позиция и започване отначало, докато … добре, зависи от приложението. Има 2 начина за прекратяване на цикъла:

  1. Използване на някакъв знак „краен знак“, като „връщане на каретка“или „Линейно подаване“. Веднага след като char "end Mark" бъде намерен, цикълът завършва.
  2. Алтернативно, броят на знаците в низовата верига може да бъде ограничен, както и броят на интерактивните цикли. Когато достигне границата, да речем, 4, придобийте рутинни завършвания от себе си.

Нека да разгледаме в прост пример как се прави това:

  • Задайте знак „край“, като например „\ n“(това означава символ за емисия на линии ASCII).
  • цикъл междувременно Serial.available () е вярно
  • съхраняването на Serial.read () води до временна променлива char. Запомнете: веднага щом Serial.read () действително "прочете" буфера, той е чист и следващият знак се зарежда в него.
  • увеличете низова променлива с този char
  • Ако последният знак е "край", излезте от цикъла.

Обикновено рутината за получаване на сериен масив изглежда като картина.

Той се основава на обширна адаптация на оригиналния код на г -н Дейвид А. Мелис.

Не се колебайте да го използвате и тествате. Запомнете: стойностите ТРЯБВА да бъдат въведени в трицифрен формат.

Това е засега. Няма да се разширявам в допълнителни подробности за серийната комуникация. Тук е твърде сложно, за да се покрие и заслужава собствените си „Ненарушими“.

Надявам се да ви помогне да използвате примери в Blue Pill и да ви даде малко просветление колко правилен е кодът за тази малка дъска.

Ще се видим в други инструкции.

Препоръчано: