STM32 - сторінка 2
‹ 1
21. STM32. Програмування STM32F103. USB

На тестовій платі STM32F103 маємо microUSB роз’єм. І він служить не тільки для подачі живлення. STM32F103 може працювати з USB у якості різних USB - пристроїв. Як USB HID пристрій, у тому числі - як клавіатура чи мишка, як віртуальний послідовний порт, USB Mass Storage, тощо. Ми розглянемо лише пару прикладів. У першому - комп`ютер буде сприймати STM32F103 як віртуальний послідовний порт. У другому прикладі STM32F103 емулюватиме клавіатуру і мишку. STM32F103 буде рухати мишкою, (звісно на екрані :), та емулювати натискання кнопок на клавіатурі.
20. STM32. Програмування STM32F103. I2C Slave

У попередній статті ми розглянули роботу STM32 з шиною I2C у якості Майстра. Тобто, він був ведучий і опитував сенсор. Тепер зробимо так, щоб STM32 був Slave-ом і відповідав на запити, тобто сам працював як сенсор. Ми виділимо 255 байт пам`яті під регістри з адресами від 0 до 0xFF, і дозволимо Майстру в них писати/читати. А щоб приклад був не таким примітивним, зробимо з нашого STM32, ще і аналого-цифровий перетворювач з інтерфейсом I2C. ADC буде обробляти 8 каналів. Результати перетворень контролер буде віддавати Майстру при читанні з регістрів. Оскільки результат перетворення ADC займає 12 біт, нам потрібно буде 2 регістра (2 байта) на кожний канал ADC.
19. STM32. Програмування STM32F103. I2C Master

Шина I2C досить популярна і дуже багато сенсорів та інших пристроїв використовують саме I2C. Я не буду писати хто, коли і для чого винайшов цю шину та як по ній бігають байти. Цієї інформації повно у Інтернеті, для цього існує Вікіпедія. Коли Ви тримаєте в руках сенсор і бажаєте якнайшвидше отримати з нього дані, та вирішити поставлену задачу, Вам вистачить наступного мінімуму знань:
- Шина I2C - це двопровідна шина з лініями SCL, SDA. Теоретично, на одну шину I2C можна паралельно підключити до 112 пристроїв.
- Обидві лінії шини мають бути через резистори підключеними до живлення. Рекомендований номінал резисторів залежить від швидкості та інших параметрів шини. Зазвичай мало хто з цим морочиться і ставлять резистори у межах від 4.7кОм до 10кОм. Резисторів має бути по одному на кожну лінію. Якщо Ви підключаєте декілька модулів, а на кожному модулі вже впаяні підтягуючі резистори, то виходить, що резистори вмикаються паралельно і їх сумарний опір стає меншим. Це не дуже добре. Та, якщо ви вмикаєте лише два таких модуля і на кожному впаяні резистори по 10 кОм, тоді сумарний опір буде 5КОм, що попадає у межі допустимої норми і шина I2C, скоріш за все, буде працювати. Але повторюю: чіпляти на кожну лінію більше одного резистора - не дуже гарна ідея.
- Кожен пристрій на шині I2C має окрему адресу.
- На шині I2C може бути лише один Master і один, або декілька Slave.
- Швидкість шини може бути різною. Зазвичай використовують два стандарти 100 і 400 КГц. Швидкість лінії має визначатися по самому повільному пристрою на шині. Якщо Slave не встигає, він може "притримати" шину і всі його будуть чекати. Та такий підхід, хоч і є стандартом, але на практиці працює не завжди. У випадку, коли Master не вміє чекати (цим, наприклад страждають мікрокомп`ютери), на шині починається безлад. Тобто, некоректна робота одного з пристроїв на шині I2C (не важливо, у якій ролі - Master або Slave) може викликати проблеми у роботі усіх приладів.
- Якщо напруга живлення контролера відрізняється від напруги живлення датчика, вони мають вмикатися через двонаправлену схему узгодження логічних рівнів.
18. STM32. Програмування STM32F103. Remap

Чому не можна зробити такий контролер, який би мав мінімум стандартних ніг: ну, там - живлення, виводи для програматора, тощо, а решту виводів щоб можна було налаштувати як заманеться? Хочу на ногу №1, скажімо, PA6, - програмно налаштував і готово. А захочу RX порта UART1, - сказав мікроконтролеру, щоб RX порту UART1 підключив до ноги №1 і все. І так само будь-який функціонал на будь-які виводи. Це було б дуже зручно! Але це технічно досить складно. Хоча, може так статися, що у недалекому майбутньому з`явиться щось схоже. Розробники мікроконтролерів до цього потихеньку, але впевнено, йдуть. Звісно, коли з`являться такі контролери, зміняться і підходи до проектування схем і програм. Але повернімося до реалій.
Ми вже звикли до того, що до певних виводів мікроконтролера прив`язаний певний функціонал. І ми можемо вибирати, які з доступних функцій ми можемо використати. Наприклад, у нашому мікроконтролері STM32F103 ногу, яка називається PA9 можна використати як лінію порту A9 (вхід або вихід). Або використати альтернативний функціонал, такий як TX вихід послідовного порту USART1 (USART1_TX), або як другий канал першого таймеру TIM1_CH2. Та що нам робити якщо A9 вже використовується, а нам вкрай потрібний USART1_TX? У STM32 є функція REMAP.
17. STM32. Програмування STM32F103. Watchdog

Сторожові таймери (Watchdog) існують для того, щоб у разі зависання програми мікроконтролера його (мікроконтролер) можна було перезавантажити. STM32 мають два watchdog. Їх звати IWDG і WWDG. IWDG - незалежний ("I" - Independent), доступний повсякчас. WWDG - більш обмежений ("W" - Window). Робота watchdog проста - якщо Ви його завели у своєму господарстві (налаштували і запустили), тоді треба його періодично годувати (скидати лічильник). Якщо лічильник не обновляти певний час, watchdog вважає, що з мікроконтролером щось не так і перезавантажує його. Це головна ідея watchdog. Тепер розглянемо їх детальніше і розберемо, у чому різниця між IWDG і WWDG.
16. STM32. Програмування STM32F103. Flash

Робота із Flash пам`яттю
STM32 не має енергонезалежної EEPROM. EEPROM мають тільки STM32L. Так сталося, що у STMicroelectronics вирішили, ніби EEPROM потрібна тільки для Ultra Low Power серії мікроконтролерів. А що ж нам робити? Нам потрібна енергонезалежна пам`ять. Де нам зберігати наші дані, налаштування, тощо? У Flash! Так, у тій самій пам`яті, де лежить програма мікроконтролера. STM32 може писати у Flash пам`ять.Для того, щоб безпечно щось записати у Flash пам`ять, треба спочатку з`ясувати її структуру. Нас цікавить Main memory. Саме в ній зберігається програма і в цю пам`ять ми будемо писати. Звісно, у не зайняту програмою ділянку пам`яті. Flash пам`ять розбита на сторінки. Кількість і розмір сторінок у різних контролерах різна. Про структуру пам`яті Вашого мікроконтролера читайте у Programming manual.
15. STM32. Програмування STM32F103. BKP

Backup registers (BKP)
У попередній статті ми познайомились з годинником реального часу RTC. Там я згадав про Backup Domain - частину мікроконтролера, що живиться від додаткової батарейки. Окрім годинника, Backup Domain містить Backup registers (BKP). У кожного мікроконтролера їх кількість може бути різною. У STM32F103C8 їх 42 (BKP_DR1 ... BKP_DR42). Це 16-бітні регістри пам`яті, які зберігають своє значення після відключення основного живлення мікроконтролера. Це не Flash і не EEPROM, це звичайна пам`ять, яка живиться від батарейки. Якщо розцінювати батарейку годинника, як резервне живлення, стане зрозуміло, чому ці регістри мають назву Backup registers. Якщо вимкнути живлення мікроконтролера і резервне живлення (батарейку), дані регістрів будуть втрачені. Тому ці регістри не можна вважати енергонезалежною пам’яттю.
14. STM32. Програмування STM32F103. RTC

Годинник реального часу (RTC)
STM32 мають вбудований годинник реального часу. Він може працювати незалежно від основного живлення мікроконтролера. Для роботи вбудованого годинника до спеціального виводу треба підключити живлення напругою 3В. Наприклад, батарейку CR2032. Такі батарейки використовують у годинниках, у комп`ютерах на материнських платах, та в інших приладах. Годинник споживає дуже мало енергії, тому батарейки вистачає на тривалий час. Також годинник може працювати як будильник - формувати сигнал на одному з виходів або виводити мікроконтролер з режиму енергозбереження. Спочатку ми запустимо годинник і налаштуємо таким чином, щоб він рахував секунди і продовжував працювати після відключення основного живлення мікроконтролера. Будильник розглянемо пізніше.
11. STM32. Програмування STM32F103. TIMER. Encoder

Ще одна корисна функція таймера - робота з інкрементними (квадратурними) енкодерами. Ми налаштуємо таймер таким чином, щоб він обробляв сигнали з двох своїх вхідних каналів і змінював свій лічильник у зазначених межах. Тобто, коли ми будемо обертати енкодер в одному напрямку, лічильник таймера буде збільшуватися, в зворотньому - зменшуватися. У прикладі ми встановимо TIM_Period = 100. Це значить, що лічильник таймера буде зменшуватися або збільшуватися в залежності від напрямку обертів енкодера у цих межах. При прямому обертанні енкодера, коли лічильник дорахує до 100, він перестрибне на 0. При зворотньому напрямку, коли лічильник зменшиться до нуля, автоматично перестрибне на 100. Нам більше нічого не доведеться контролювати, лише зчитувати лічильник таймера. У наступному прикладі програма періодично опитує лічильник таймера і відправляє його значення у послідовний порт USART.
13. STM32. Програмування STM32F103. EXTI

Зовнішні переривання
Зовнішні переривання викликаються при зміні стану логічного сигналу на вході мікроконтролера. Зовнішні переривання використовують, коли треба слідкувати за зміною вхідного сигналу і оперативно реагувати. Коли нам потрібен такий функціонал, ми налаштовуємо потрібний пін, налаштовуємо зовнішнє переривання (по спаду, по фронту або по обом фронтам) і, як тільки відбудеться зміна стану сигналу, буде викликано обробник переривання.У STM32 зі зовнішніми перериваннями можуть працювати будь-які лінії вводу-виводу. Тобто, будь-який пін можна налаштувати на роботу з перериванням. У STM32F103 всього 19 ліній зовнішніх переривань:
- EXTI0...EXTI15 - для роботи з пінами портів
- EXTI16 - підключений до PVD
- EXTI17 - RTC Alert event (будильник)
- EXTI18 - USB Wakeup event
- EXTI19 - Ethernet Wakeup event
12. STM32. Програмування STM32F103. TIMER. PWM

У попередніх статтях ми познайомились з тим, як таймери можуть захоплювати вхідний сигнал. Таймери мікроконтролера STM32 також можуть формувати вихідні сигнали. Сьогодні ми познайомимося з PWM або ШІМ сигналом на прикладах.
Ініціалізація PWM виконується наступним чином:
- налаштовується вихід порту відповідного каналу таймера, який буде задіяний для формування PWM сигналу
- виконуються базові налаштування таймера
- виконується налаштування OC каналу таймера (налаштування параметрів PWM)
- вмикається таймер
10. STM32. Програмування STM32F103. TIMER. Захоплення сигналу

Однією з типових задач для мікроконтролера є обробка вхідних сигналів. У STM32 з цією задачею досить вправно справляються таймери загального призначення. Але, перш ніж перейти до розглядання теми захоплення сигналу таймером, спочатку розглянемо ще один приклад, який є продовженням попередньої статті.
‹ 1
Недавні записи
- FOC - своя реалізація векторного керування. Підбиваю підсумки 2022 року
- Конструктор регуляторів моторів. Підбиваю підсумки 2022 року.
- Чому трифазні мотори стали такими популярними?
- FOC & Polar coordinates
- Конструктор регуляторів PMSM, BLDC двигунів
- Своя бібліотека для векторного керування безколекторними моторами
- Not Allowed
- Адаптивний ПІД регулятор
- Конструктор регуляторів моторів. Структура.
- Конструктор регуляторів моторів. Анонс.
Tags
st-link 3d-printer encoder servo solar java-script git wifi uart mpu-9250 sensors capture motor esp8266 nodemcu usb usart piezo rfid css atmega bmp280 bkp avr displays brushless watchdog battery sms rs-232 tim mpu-6050 barometer examples nvic pmsm dc-dc eb-500 soldering meteo rtc gpio books websocket docker dht11 led smd stm32 web timer dma lcd mpx4115a hih-4000 bldc ssd1306 adc mongodb python options eeprom raspberry-pi remap max1674 programmator ethernet foc ngnix ssd1331 gps flash exti bluetooth html bme280 i2c pwm flask
Архіви