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

Таймер SysTick

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

SysTick timer 

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

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

Відлік часу без таймерів

Альтернативний спосіб відліку часу
Кам'яна сокира. (c) Wiki

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

Наведений нижче приклад реалізації базується на коді з Leaflab Maple IDE, аналогу оболонки Ардуїно для STM32. Увага: Приклад може бути неточним -- особливо ретельно я не тестував.

Update: Див. також розвиток теми в "Мікросекундні затримки та відлік мікросекунд для STM32".

понеділок, 29 лютого 2016 р.

Таймери STM32 -- огляд

Працюючи із далекоміром, ми використовували те, що називають GPIO -- General Purpose Input-Output. В принципі, сяк-так воно задачу вирішує. Однак, повністю займає процесор, і взагалі -- неестетичне. Мікроконтролери, зазвичай, обладнані значно більш зручними засобами для вирішення таких задач -- таймерами та перериваннями. 

Переривання дозволяють програмі не очікувати на якусь подію, постійно перевіряючи щось типу "а що там на піні зараз? а тепер? а тепер?", а отримати нотифікацію про неї -- виклик певного коду у відповідь на появу події. Вони, безперечно, заслуговують окремої розмови (можливо, найближчим часом), але Cortex-M все організовує так, що обробники переривання  -- звичні С-ні функції, що викликаються у відповідь на подію. А ось таймери -- пристрої складні та різноманітні. Тому поговоримо поки про них. 

субота, 27 лютого 2016 р.

Далекомір HC-SR04 -- GPIO/висновки

Взято тут.
Як було показано в попередніх постах [1, 2, 3, 4, 5], працювати з HC-SR04 просто. Однак, описаний там спосіб -- з використанням GPIO, зовсім вульгарний. Контролери мають значно вишуканіші засоби вимірювати та керувати тривалістю імпульсів, ніж просто неперервно пильнувати за станом "ніжки": переривання, різноманітні потужні та гнучкі таймерів на додачу до SysTick. Про них і напишемо наступного разу. А тут підведемо підсумки GPIO-підходу. 

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

Розглянемо те, що залишилося. Порівняємо особливості програмування різними способами та відповідні розміри прошивок i RAM. 

Щоб не дублювати весь код, розглянемо дві прості але важливі операції:
  • ініціалізацію піну PB1 на виведення,
  • виведення одиниці, 
 зроблені в рамках різних підходів.

пʼятниця, 26 лютого 2016 р.

Далекомір HC-SR04 -- GPIO/C++

Раз вже цей приклад представлено в стількох варіантах, продемонструю, як C++ може бути корисним під час роботи з контролерами. Людина із ніком fede.tft запропонувала цікавий підхід спрощення роботи з STM32 і подібними пристроями, з використанням шаблонів та інших сучасних фішок С++: "STM32 GPIOs and Template Metaprogramming". Замість або плутаного, або багатослівного, підходів, описаних в попередніх постах, без втрати продуктивності (!), можна робити так:

typedef Gpio<GPIOB_BASE,1>  trig;
trig::mode(Mode::OUTPUT);
trig::high();
trig::low();

typedef Gpio<GPIOB_BASE,2>  echo;
echo::mode(Mode::INPUT);
if( echo::value() )
{
...
}

середа, 24 лютого 2016 р.

Далекомір HC-SR04 -- використовуючи GPIO/HAL/STM32CubeMX

Як вже говорилося, CMSIS -- занадто низькорівнева, SPL від неї не далеко втекла. Після років роздумів та роботи, інженери STMicroelecronics випустили чергову спробу --- пакет STM32Cube. Він складається із двох частин: 
  • Коду для мікроконтролерів: бібліотеки, призначеної замінити SPL -- HAL, (Hardware Abstraction Layer) та всіляких middleware ("проміжних")  компонент -- бібліотеку підтримки FAT, бібліотеку для роботи із USB, TCP/IP  стек, RTOS, тощо.
  • STM32CubeMX -- програми для комп'ютера, яка дозволяє графічно конфігурувати периферію, генеруючи код мовою С, який реалізує "намальоване". 
Після  кількох років дозрівання проект став дуже потужним. Особисті враження: як мало треба для щастя -- лише не виставляти ті сотні бітиків вручну, медитуючи над даташітами і аппнотами (appnotes). 

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

Інсталяція 


вівторок, 23 лютого 2016 р.

Далекомір HC-SR04 -- використовуючи GPIO/CoX

Структура CoX
Мушу зізнатися, написано цю серію постів було ще в 2012-му році. На фоні тодішньої ситуації, бібліотека периферії від CooCox - розробників CoIDE, виглядала перспективною. Зараз я в цьому вже дуже сумніваюся -- вона, на жаль, практично закинута. Однак, викидати тодішній приклад шкода, тому ось.

COX


CooCox, автори CoIDE, розробили також свою бібліотеку роботи із периферією, аналог SPL -- COX. Її перевага -- вона платформонезалежна (кросплатформова), працює і з контролерами ARM Cortex від інших виробників -- підтримуються пристрої від Nuvoton, NXP, ST, TI, Holtek, FreeScale, тоді як код із попередніх постів ([1], [2]), працюватиме лише на STM32 від STMicroelectronics.

Апаратна конфігурація та ж, що й в інших GPIO-прикладах:
  • PB1 -- Trig
  • PB2 -- Echo
  • PC8 -- синій світлодіод
  • PC9 -- зелений світлодіод