Avislab

сайт для палких паяльників

Эта статья на русском языке

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

Читати далі

Эта статья на русском языке

Робота із Flash пам’яттю

STM32 не має енергонезалежної EEPROM. EEPROM мають тільки STM32L. Так сталося, що у STMicroelectronics вирішили, ніби EEPROM потрібна тільки для Ultra Low Power серії мікроконтролерів. А що ж нам робити? Нам потрібна енергонезалежна пам’ять. Де нам зберігати наші дані, налаштування, тощо? У Flash! Так, у тій самій пам’яті, де лежить програма мікроконтролера. STM32 може писати у Flash пам’ять.

Для того, щоб безпечно щось записати у Flash пам’ять, треба спочатку з’ясувати її структуру. Нас цікавить Main memory. Саме в ній зберігається програма і в цю пам’ять ми будемо писати. Звісно, у не зайняту програмою ділянку пам’яті. Flash пам’ять розбита на сторінки. Кількість і розмір сторінок у різних контролерах різна. Про структуру пам’яті Вашого мікроконтролера читайте у Programming manual.

Читати далі

Эта статья на русском языке

Backup registers (BKP)

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

Читати далі

Эта статья на русском языке

Годинник реального часу (RTC)

STM32 мають вбудований годинник реального часу. Він може працювати незалежно від основного живлення мікроконтролера. Для роботи вбудованого годинника до спеціального виводу треба підключити живлення напругою 3В. Наприклад, батарейку CR2032. Такі батарейки використовують у годинниках, у комп’ютерах на материнських платах, та в інших приладах. Годинник споживає дуже мало енергії, тому батарейки вистачає на тривалий час. Також годинник може працювати як будильник – формувати сигнал на одному з виходів або виводити мікроконтролер з режиму енергозбереження. Спочатку ми запустимо годинник і налаштуємо таким чином, щоб він рахував секунди і продовжував працювати після відключення основного живлення мікроконтролера. Будильник розглянемо пізніше.

Читати далі

Эта статья на русском языке

Зовнішні переривання

Зовнішні переривання викликаються при зміні стану логічного сигналу на вході мікроконтролера. Зовнішні переривання використовують, коли треба слідкувати за зміною вхідного сигналу і оперативно реагувати. Коли нам потрібен такий функціонал, ми налаштовуємо потрібний пін, налаштовуємо зовнішнє переривання (по спаду, по фронту або по обом фронтам) і, як тільки відбудеться зміна стану сигналу, буде викликано обробник переривання.

У STM32 зі зовнішніми перериваннями можуть працювати будь-які лінії вводу-виводу. Тобто, будь-який пін можна налаштувати на роботу з перериванням. У STM32F103 всього 19 ліній зовнішніх переривань:

  • EXTI0…EXTI15 – для роботи з пінами портів
  • EXTI16 – підключений до PVD
  • EXTI17 – RTC Alert event (будильник)
  • EXTI18 – USB Wakeup event
  • EXTI19 – Ethernet Wakeup event

Читати далі

Эта статья на русском языке

Ці приклади можна розглядати тільки як демонстрацію алгоритмів керування безколекторними двигунами. Для доведення їх до кінцевої технічної реалізації потрібно, як мінімум, додати схеми захисту. Ці приклади розраховані на керування двигунами з напругою живлення від 12 до 24 Вольт. При вищій напрузі живлення доведеться вносити зміни у схеми. У схемах передбачена можливість подачі PWM сигналу (за допомогою перемичок) на верхні та/або нижні ключі. Для керування бездатчиковими двигунами це може відіграти важливу роль.

Sensored BLDC

Приклад керування безколекторним двигуном з датчиками Холла

Приклад, написаний на GCC 3.4.6
для мікроконтролера Atmega168

Містить: схему, приклад коду на С.

brushless_sensored 

 

Скачати

Читати далі

Эта статья на русском языке

У попередніх статтях ми познайомились з тим, як таймери можуть захоплювати вхідний сигнал. Таймери мікроконтролера STM32 також можуть формувати вихідні сигнали. Сьогодні ми познайомимося з PWM або ШІМ сигналом на прикладах.

Ініціалізація PWM виконується наступним чином:

  • налаштовується вихід порту відповідного каналу таймера, який буде задіяний для формування PWM сигналу
  • виконуються базові налаштування таймера
  • виконується налаштування OC каналу таймера (налаштування параметрів PWM)
  • вмикається таймер

Читати далі

Эта статья на русском языке

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

Читати далі

Эта статья на русском языке

Однією з типових задач для мікроконтролера є обробка вхідних сигналів. У STM32 з цією задачею досить вправно справляються таймери загального призначення. Але, перш ніж перейти до розглядання теми захоплення сигналу таймером, спочатку розглянемо ще один приклад, який є продовженням попередньої статті.

Читати далі

Эта статья на русском языке

Таймери загального призначення

Таймери у мікроконтролерах STM32 поділяються за функціоналом на:

  1. basic timers (базові таймери)
  2. general-purpose timers (загального призначення: TIM2, TIM3, TIM4)
  3. advanced-control timers (продвинуті таймери: TIM1)

У різних мікроконтролерах кількість таймерів різна. Згідно документації до контролера STM32F103C8 маємо 3 таймера general-purpose, і один advanced-control.

Читати далі

Эта статья на русском языке

DMA (Direct Memory Access) контролер прямого доступу до пам’яті. Його головна задача: передача даних на апаратному рівні між пам’ятю і периферією без участі процесора. Мається на увазі, що при цьому наша програма може виконувати інші операції, не відволікаючись на передачу даних. В попередній статті ми задіяли DMA для роботи з АЦП. І це було круто. Тепер розглянемо роботу DMA докладніше і ще раз впевнимось у потужній користі DMA на прикладі ще однієї типової задачі: відправки даних через USART.

Ми вже використовували USART. Відправка даних через USART – досить тривалий процес, під час якого (у попередніх прикладах) процесор чекає, поки буде відправлений весь буфер. Дивись функцію USARTSend. Поки ця функція не закінчить відправку всього буфера, далі обробка у головному циклі програми не йде. Усі чекають. У нас були досить прості приклади і нам було байдуже. Але, рано чи пізно, нам знадобиться вся потужність контролера і треба буде оптимізувати цю операцію. Один з методів – використання DMA. Ми підготовимо дані на відправку, дамо завдання DMA, він буде собі відправляти байт за байтом, а процесор займеться чимось більш важливим.

Читати далі

Эта статья на русском языке

Скачати приклади до STM32F103 для CooCox CoIDE

Усі приклади розташовані на сайті github.com:
https://github.com/avislab/STM32F103

Посилання на GIT-файл:
https://github.com/avislab/STM32F103.git

Скачати усі приклади одним ZIP-архівом:
https://github.com/avislab/STM32F103/archive/master.zip

Приклади постійно доповнюються і корегуються. Інколи не синхронно з виходом нових статей про STM32.
Остання редакція: 07.11.2016

Читати далі

Translate

Архіви

© 2011-2017 Андрій Корягін, Кременчук, Україна