четвер, 10 березня 2016 р.

Таймери STM32 -- зовнішнє тактування/HAL

Ще один зовнішній годинник.
(c) Wiki
Повторимо зроблене в пості про зовнішнє тактування таймерів з використанням CMSIS за допомогою HAL та STM32CubeMX. Як завжди із графічними утилітами конфігурації і на відміну CMSIS-постів, тут буде багато картинок і мало власного коду. 

Проект, використаний тут, спільний для трьох постів -- цього і двох наступних, (про внутрішні тригери та біт OPM, засобами HAL) тому на елементи конфігурації, яка стосується інших таймерів, просто не звертайте уваги. 

Звичайно, краще було б зробити окремі проекти для кожного, але це чисто механічна робота, на яку мені бракує сил та часу, а ця серія постів їх і так забагато забрала.

середа, 9 березня 2016 р.

Таймери STM32 -- зовнішнє тактування/CMSIS

Зовнішній годинник, а що? :-)
(c) Wiki
Як вже говорилося раніше, таймери можуть тактуватися не тільки від RCC, але і від інших зовнішніх чи внутрішніх джерел:
  • External clock mode1 -- тактування від входів TI1 або TI2,
  • External clock mode2 -- від піна ETR,
  • Internal trigger clock (ITRx) -- від внутрішніх джерел.
Про внутрішні джерела тактування таймерів поговоримо окремо, а зараз познайомимося із зовнішнім тактуванням на простому прикладі -- підрахунку кількості натискання кнопки. 

вівторок, 8 березня 2016 р.

Таймери STM32 -- ШІМ/HAL

Беремо STM32CubeMX проект із попереднього прикладу (із відліком) та додаємо до нього TIM3, який генеруватиме на своєму каналі CH2, під'єднаному до PA7, PWM (ШІМ), змінюючи яскравість світлодіода, як і в попередньому пості, але засобами HAL.

"Малюємо" проект


Конфігуруємо TIM3

неділя, 6 березня 2016 р.

Таймери STM32 -- ШІМ/CMSIS

Здатність відраховувати час ([1], [2], [3]), звичайно, критична для таймерів, однак, всі, крім базових (та спеціалізованих, типу SysTick та watchdog-ів), вміють більше -- безпосередньо керувати виводами, пінами, мікроконтролера. Один із найпростіших, але дуже потужних, способів такого керування --- генерація ШІМ, широтно-імпульсна модуляції, (англійською -- PWM).

PWM -- штука складна, див. вікі, наприклад. Це спосіб модулювати високочастотний сигнал низькочастотним, змінюючи ширину імпульсів, за постійної їх частоти. Тут ми розглядатимемо його варіант, що широко використовується у вбудованій техніці, такий собі спосіб отримувати аналоговий сигнал з цифрового, без ЦАП. 

субота, 5 березня 2016 р.

Таймери STM32 -- відлік часу/HAL

Раніше ми розглянули як здійснювати найпростіші операції із таймерами, безпосередньо маніпулюючи їх регістрами. Звичайно, користуючись константами та функціями із CMSIS, але нічим більш високорівневим. Тепер подивимося, як це ж зробити за допомогою HAL. Важливо, що HAL -- лише бібліотека, якою користуватися можна по різному, сама по собі вона особливих переваг не надає. (IMHO, звичайно). Однак, STM32CubeMX вміє генерувати ініціалізацію периферії з візуальних налаштувань, користуючись цією бібліотекою. Це дуже спрощує розробку -- все ж, принаймні для мене, найбільша проблема роботи із такими контролерами -- сотні бітів конфігурації периферії, які слід вмикати і вимикати в правильній послідовності. Cube дозволяє, як мінімум, побачити правильну таку послідовність -- спрощуючи й "ручну" роботу з ними в майбутньому. Як максимум -- просто про це не турбуватися. Додаткова абстракція вносить свої труднощі, але серйозною проблемою це не є -- весь код доступний, навіть без додаткової документації можна розібратися, що-куди-як, а, як буде показано в подальшому, за ввімкненої оптимізації, при всій громіздкості (в порівнянні із ручною маніпуляцією регістрами) коду HAL/STM32CubeMX, зростання розмірів пам'яті обох видів -- цілком скромне. 

Отож, повторимо зроблене в попередньому прикладі, користуючись HAL. 

четвер, 3 березня 2016 р.

Таймери STM32 -- відлік часу/CMSIS

Почнемо вивчення роботи таймерів із найпростіших операцій. Найелементарніша така операція, яку вміє навіть SysTick -- відлік часу, який досягається генерацією переривань по проходженню певної кількості тіків таймера. 

Нагадаю, працюватимемо на прикладі STM32F100RB, яким обладнана STM32VLDiscovery. Для інших мікроконтролерів сімейства, скажімо, STM32F303, зміни будуть мінімальними, якщо взагалі будуть, навіть якщо користуватися виключно CMSIS.

Переривання таймерів


Генерація переривань, у просунутих (advanced control) і всіх решта (базовими та загального використання) таймерів дещо відрізняється. Просунуті таймери мають чотири різних лінії переривань, для кожного виду подій -- окреме, а решта таймерів -- користуються однією і тією ж лінією переривання для всіх подій. При тому, частина ліній також використовується іншою периферією, тому, перш ніж реагувати, варто перевіряти, від кого переривання прилетіло. 

Природу події можна вияснити, подивившись на біти регістра статусу, TIMx_SR. Подія оновлення (тобто, таймер дорахував до TIMx_ARR чи нуля, в залежності від напрямку рахунку -- вверх чи вниз), встановлюється біт UIF цього регістра. 

Список таких "комунальних" квартир переривань таймерів для STM32F100RB:
  • TIM1_BRK_TIM15_IRQn, TIM1_UP_TIM16_IRQn, TIM1_TRG_COM_TIM17_IRQn,  TIM1_CC_IRQn -- як бачимо, три із чотирьох переривань єдиного просунутого таймера цього контролера, TIM1, використовуються спільно із іншими таймерами (TIM15/16/17).
  • TIM2_IRQn
  • TIM3_IRQn
  • TIM4_IRQn
  • TIM6_DAC_IRQn -- разом із перериванням від ЦАП (DAC)
  • TIM7_IRQn
Зауважте, що таймери TIM12/13/14 у варіанта мікроконтролера STM32F100RB (у всіх Low i Medium density, якщо точніше) -- відсутні, є лише в High-density STM32F100.

середа, 2 березня 2016 р.

Таймер SysTick

Тактування SysTick. Клікабельно.
Про цей таймер не раз писав раніше, та й інші автори про нього не забували. Однак в цьому блозі про нього завжди говорилося в глибині великих простирадл тексту, вирішив винести в окремий пост.

SysTick timer 

SysTick timer -- простий 24-бітний таймер, частина ядра Cortex M, тому присутній у відповідних мікроконтролерах всіх виробників. Належить до підсистеми контролера переривань, NVIC.