середа, 12 жовтня 2016 р.

Таймери STM32 -- remapping/CMSIS

Мультиплексор. Зображення взято тут.
STM32 надають певну гнучкість у тому, які піни прив'язані до яких функцій -- так-званий remapping (перепризначення). STM32CubeMX автоматично користується цією можливістю під час візуального редагування конфігурації. Для кращого розуміння, спробуємо зробити це ж вручну, на рівні CMSIS.

Що це за можливість і де шукати інформацію про неї, вже описувалася в попередньому пості: "Таймери STM32 -- огляд", то я просто зацитую:

четвер, 29 вересня 2016 р.

GPIO мікроконтролерів STM32F303 з використанням HAL

STM32F3Discovery
Виникла чисто практична потреба написати коротке введення в GPIO контролера STM32F303 плати STM32F3Discovery. Подумав, що є сенс зробити його в блозі. 
Серія про таймери, далекомір і продовження -- написана ще весною, але, на жаль, катастрофічно бракує часу довести її до ладу і опублікувати. Вірю, що скоро мені нарешті вдасться це зробити. Done. Див. відповідні теги: таймери, далекомір.
Працюватимемо із використанням візуального генератора конфігурації STM32CubeMX, бібліотеки роботи із периферією HAL та середовища System Workbench for STM32 (SW4STM32). 

Update 20-11-2016: виправлено прикру помилку -- додано заборону переривань при звертанні до змінних, що можуть бути модифіковані в їх обробниках. Прикру -- бо в таких простих прикладах вона себе проявляє рідко, але є дуже "фундаментальною", якщо можна так сказати про помилку.

Update 17-09-2017:  додано вирішення кількох типових проблем, що виникають при роботі із SW4STM32, оновлено пару посилань, дрібні стилістичні зміни.

субота, 4 червня 2016 р.

Розповіді про операційні системи від Таненбаума

Про книги варто писати зразу після прочитання -- потім багато що забувається, тьмяніє. Якщо хочеться спершу глибше осмислити -- тоді після пере-прочитання. Через зовнішні обставини я частково сумістив -- написав зразу, але редагував і публікую більше ніж через півроку після.

Отож, Ендрю Таненбаум, "Сучасні операційні системи" ("Modern Operating Systems"). 

В принципі, автор окремого представлення не потребує -- живий класик комп'ютерних наук. Згадаю лише, що крім авторства ряду класичних підручників (операційні системи, комп'ютерні мережі, тощо) та якісно нового способу викладати теорію ОС, для реалізації якого було написано POSIX-сумісну ОС MINIX, він має відношення і до виникнення ядра GNU/Linux (*) -- Лінус приступив до роботи якраз під впливом книги та самої MINIX, якою скористатися не міг із ліцензійних міркувань -- тоді такої халяви із безліччю хороших та доступних інструментів, як зараз, не було. Детальніше про нього див, наприклад, вікі: "Ендрю Стюарт Таненбаум".
(*) Правильна назва саме така. "Linux" стосується ядра, розробленого Лінусом Торвальдом, а решта інструментів, що "утворюють" повноцінну операційну систему, походять із проекту GNU.
На жаль, українського перекладу поки не існує, мова йтиме про російський переклад та оригінальне англійське видання.

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

Таймери STM32 -- одноімпульсний режим/HAL

Черговий пост в серії -- одноімпульсний режим, OPM, із використанням STM32CubeMX/HAL. Вирішимо тих же дві задачі -- реакція на кнопку, із затримкою та реакція на внутрішній тригер, яким служить подія переповнення іншого таймера. 

Запуск OPM кнопкою 

Почнемо із візуальної конфігурації:
Клікабельно! Знадобиться, щоб роздивитися конфігурацію таймера.

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

Таймери STM32 -- одноімпульсний режим/CMSIS

Останні теми, перш ніж повернемося до далекоміра -- вже із новими засобами. Взагалі, якщо чесно, вся ця серія з'явилася через те, що я дуже розсердився, витративши, щоб розібратися із One Pulse Mode (одноімпульсний режим, OPM) кілька повних днів. Тому текст нижче -- спроба розказати про нього максимально детально.

Що це за режим оглядово розповідалося в загальному пості про таймери:
На додачу до всього описаного вище, таймер має спеціальний біт, який вказує -- продовжувати відлік чи зупинятися після події оновлення (забороняючи таймер). З допомогою цієї можливості реалізовано спеціальний, одноімпульсний, режим. По зовнішньому чи внутрішньому сигналу (запустити таймер може зовнішня подія або інший таймер) відбувається затримка (визначається вже згаданим TIMx_CCRx), після чого -- імпульс, тривалістю TIMx_ARRx-TIMx_CCRx. Що таке імпульс визначається тими режимами, якими володіє кожен із каналів -- встановити у активний, пасивний, змінити на протилежний, ШІМ1, ШІМ2, не змінювати нічого, примусовий активний чи пасивний, що значить активний/пасивний визначається полярністю.

Режим одного імпульсу.
(c) STMicroelectronics
Розглянемо два види подій, що запускатимуть OPM -- внутрішня, від іншого таймера та зовнішня -- від кнопки.

Почнемо із простішого і більш корисного -- реакція на зовнішню подію із заданою затримкою.

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

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

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

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

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

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

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


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