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

Таймери STM32 -- захоплення ШІМ/HAL

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

Черговий такий приклад -- вирішена раніше, засобами CMSIS, задача визначення тривалості натискання кнопки із використанням режиму захоплення ШІМ. Задача, насправді, зовсім трішки відрізняється від "канонічної", із документації -- один таймер генерує ШІМ, інший його ловить, але дає можливість "помацати" таймер руками -- натискаючи кнопку.

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

Таймери STM32 -- захоплення ШІМ/CMSIS

За допомогою захоплення вводу, розглянутого недавно, можна організувати потрібні для роботи із далекоміром вимірювання тривалості імпульсів. Реалізувати це можна як програмно (налаштувавши захоплення по спаду і по зростанню сигналу та програмно відстежувати поточний стан) так і апаратно (з'єднавши фізично два канали таймера і на одному захоплювати фронт, на іншому -- спад). Думка, що такі задачі постають, прийшла й розробникам STM32, тому у таймерів є спеціальний режим -- захоплення ШІМ. Зацитую описане в огляді таймерів:
Хитра конфігурація режиму захоплення сигналу -- коли два канали "слухають" той самий вхід, один ловить фронт, другий спад. При тому, початок відліку каналу по фронту очищає лічильник таймера. Тоді подія по спаданню збереже у TIMx_CCRx відповідного каналу тривалість імпульсу, а наступний фронт дасть у TIMx_CCRx каналу, що їх ловить, період. Значно краще все це зрозуміти можна на рисунку із даташіту:


Режим захоплення ШІМ.
(c) STMicroelectronics
Насправді, це всього лиш комбінація вже розглянутого режиму захоплення, різних видів тригерів і реакції на них та під'єднання двох каналів до одного піну.

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

Таймери STM32 -- захоплення вводу/HAL

Попрацюємо тепер із захопленням вводу засобами HAL. Як і в попередньому пості, фіксуватимемо час натискання кнопки. Вся логіка роботи -- та ж, що у згаданому пості -- по натисканню клавіші, під'єднаної до PA0, пін притягується до одинички, таймер у відповідь повинен зберегти момент натискання. В головному циклі програма виводить отримані значення, користуючись Semihosting. 

Традиційно, створюємо проект STM32CubeMX, вибираємо мікроконтролер і т.д. Далі, налаштовуємо таймер та пін кнопки:

понеділок, 21 березня 2016 р.

Таймери STM32 -- захоплення вводу/CMSIS

Для роботи із далекоміром нам треба не тільки подавати імпульс заданої довжини, але і заміряти тривалість імпульсу на Echo, яка визначає час польоту звуку. Хоча це можна зробити і вручну, опитуванням, як раніше, або скориставшись зовнішнім перериванням EXTI, як буде розглянуто в подальшому, цікавіше зробити все автоматично -- за допомогою таймерів, які мають спеціальний режим -- Input capture mode.

Кожен канал має регістр TIMx_CCRx, в який, у режимі захоплення, зберігається значення лічильника в момент приходу сигналу. При тому встановлюється відповідний біт CCXIF у регістрі TIMx_SR та може бути згенеровано переривання чи запит DMA. Якщо під час захоплення біт CCXIF, який автоматично очищається при читанні з TIMx_CCRx чи може бути очищений програмно, все ще рівний 1 -- значить попереднє значення не було прочитано, встановлюється прапорець CCxOF в тому ж регістрі статусу, та може генеруватися відповідне переривання чи запит -- over-capture.
Захоплення може відбуватися по зростанню, (фронту), спаданню сигналу чи і по тому і по тому. Можна встановити фільтр -- кількість вибірок, після якої можна вважати, що сигнал встановився (такий собі захист від дрижання контактів). Можна ділити вхідну частоту на 2, 4 або 8 --- реєструвати кожну другу-четверту-восьму подію.
Почнемо із найпростішого -- запускаємо таймер та зберігаємо значення лічильника у момент натискання кнопки.

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

Таймери STM32 -- автоматична зупинка/HAL

Аналогічно до відповідного CMSIS-поста, беремо проект, котрий генерує ШІМ, збільшуємо період до видимого оком значення -- нам потрібен один імпульс заданої тривалості, а не власне ШІМ та кажемо зупинятися після переповнення.

Для цього на вкладці pinout слід поставити одну "пташку" -- One Pulse Mode:


Потім, в Configure, налаштовуємо період і тривалість імпульсу:

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

Таймери STM32 -- автоматична зупинка/CMSIS

Цього разу -- зовсім коротка нотатка. Таймери володіють цікавою особливістю -- якщо встановити біт OPM в CR1, таймер автоматично зупинятиметься після події оновлення.

Важливе зауваження -- цей біт, OPM -- One-Pulse Mode, використовується для реалізації однойменного режиму One-pulse mode, який призначений керувати формою імпульсу -- генерувати його у відповідь на подію, із заданою затримкою після події та заданою довжиною. Про цей режим говоритимемо окремо. Цей пост -- своєрідна прелюдія до відповідної розмови -- ми просто навчимо таймер зупинятися. Така можливість теж корисна -- наприклад, для нашого далекоміра немає потреби робити якісь затримки, генерувати хитрі хвилі, абощо, але хотілося б, щоб таймер генерував один імпульс заданої довжини, і хотілося б, щоб він робив це повністю автоматично -- не використовуючи переривання та ручне вмикання-вимикання логічної одинички на піні.

понеділок, 14 березня 2016 р.

Таймери STM32 -- внутрішні тригери/HAL

(c) Wiki
Повторимо "подвиг" CMSIS, розглянутий раніше, зробивши із двох 16-бітних таймерів один 32-бітний, засобами HAL.

Почнемо із візуального конфігурування:


Для головного (master) таймера просто вмикаємо тактування. Підлеглому, slave, вказуємо працювати в режимі External Clock Mode 1 та отримувати тактування від внутрішнього джерела ITR3, котре, як ми знаємо з попереднього поста, під'єднане до TRGO TIM4.