WatchDog ― устраиваем собаке допрос (с пристрастием)

1. Водная часть
Во всех микроконтроллерах (мк) есть такая полезная штука, как сторожевая псина (watchdog). Работает от внутреннего низкочастотного генератора (LSI), то есть за редким исключением можно сказать, что LSI ― «личный» таймер вотчдога, который будет работать даже если главный генератор подохнет (например, отвалится нога кварца). В угоду пуристам можно отметить, что при желании можно тактовать от LSI всю программу, но сейчас речь не об этом.

Итак, сторожевая псина призвана для одной цели ― ребутать мк в случае его зависания. Если основная программа в каком-то месте не успела сбросить таймер watchdog, то ее ждет аварийный ребут. И если в любительских устройствах поговорка «семь бед ― один резет» еще допустима, то в случае более серьезного использования желательно узнать причину перезагрузки. Но ведь после перезагрузки все данные потеряны, искать больше нечего. Или нет?

Читать дальше

MCUCapture - утилита для захвата данных из массива в памяти микроконтроллера

Иногда хочется посмотреть, как выглядят в виде графика данные, хранящиеся в каком-либо массиве в памяти микроконтроллера. Специально для этой цели я написал программу MCUCapture: github.com/iliasam/MCUCapture




Читать дальше

STM8L Компараторы: часть2 COMP2 и оконный режим

В первой части мы рассмотрели COMP1. Теперь займёмся вторым компаратором COMP2 и задействуем оконный режим. Работать будем с микроконтроллером STM8L152C6T6, который установлен на плате STM8L-DISCOVERY. STM8L152C6T6 относится к классу medium. Для работы с компараторами возьмём делитель напряжения из первой части, только переделаем его так, чтобы он давал напряжение от 0 до 1,5V.


Выход делителя теперь подключим к ножке PE5 микроконтроллера:

Читать дальше

USB HID для микроконтроллеров STM32F103 без использования библиотек

Однажды озадачившись подключением микроконтроллера к ПК через USB, я обнаружил, что это непростая задача. По сравнению с USART, SPI и.т.п., программирование USB оказалось на порядок сложнее. Поиск примеров в интернете практически не дал никаких результатов. Имеющиеся примеры, как правило, основаны на использовании больших и сложных библиотек, которые очень трудно применить, а тем более модифицировать под свои нужды. Также эти примеры обычно состоят из множества файлов, так что даже понять структуру проекта, а не то что принцип работы, USB из них не представляется возможным. Есть неплохие статьи по USB, однако ответа на вопрос, как реализовать обмен данными на конкретном контроллере они не дают. В итоге пришлось самостоятельно, путем длительных экспериментов пытаться запустить USB.
Используемый контроллер STM32F103C8T6. Это наверное самый распространенный и дешевый контроллер с модулем USB. Конкретно использовалась вот такая плата:
ru.aliexpress.com/item/STM32F103C8T6-ARM-STM32-DIY-KIT/32839140960.html?spm=a2g0v.search0104.3.14.1a477b81mKd6hC&ws_ab_test=searchweb0_0%2Csearchweb201602_9_10065_10068_319_317_10696_453_10084_454_10083_10618_10307_10301_537_536_10902_10059_10884_10889_10887_321_322_10915_10103_10914_10911_10910%2Csearchweb201603_58%2CppcSwitch_0&algo_pvid=551618bd-fcbf-49a9-9147-692e88feb8ce&algo_expid=551618bd-fcbf-49a9-9147-692e88feb8ce-5
Цена такой платы практически равна цене микросхемы отдельно. Реализуемый класс устройств HID. Преимущества HID известны. Это отсутствие необходимости использования драйверов на ПК и относительная простота реализации. К недостаткам можно отнести низкую скорость передачи данных. В качестве среды программирования использован CooCox. Программа со стороны ПК компилировалась в Borland C++ 5.5.
Программа для CooCox состоит из одного файла и не использует никаких библиотек (кроме RCC, которая нужна лишь ради функции SystemInit(); в начале программы). Также не используются прерывания, поскольку, на мой взгляд, их использование, затрудняло бы понимание кода и отладку. VID и PID взяты от какого-то STM-овского устройства. При их смене, нужно так-же сменить их и в программе на ПК, поскольку поиск устройства происходит по VID и PID.
Работа рассматриваемой пары программ состоит в следующем. Программа со стороны ПК посылает целое число в контроллер. Контроллер делает инкремент полученного числа и отправляет его назад в ПК. Затем этот цикл повторяется снова и снова. В окне программы выводится полученное число. Дополнительно реализовано управление светодиодом на плате (PC13).
Данная программа не претендует на полное соответствие протоколу USB. В ней реализована обработка ограниченного набора запросов (только тех, что реально попадались при отладке). Как показала практика, набор запросов может различаться на разных компьютерах. Кроме того несмотря на то что удалось добиться работоспособности данной программы, многие вопросы касающиеся USB для меня так и остались непонятными. Этот пример, скорее полуфабрикат, требующий дальнейшей доработки.
Файлы проекта:
drive.google.com/drive/folders/1b3E0YwgRlacK2K2Qykc7OxS11ocNuWig?usp=sharing
  • +8
  • 27 марта 2019, 17:29
  • VVK
  • 1

STM8L Компараторы: часть1 COMP1

Компараторы в микроконтроллерах серии STM8L рассмотрим на примере STM8L152C6T6, который установлен на плате STM8L-DISCOVERY.

Наш STM8L152C6T6 относится к классу medium. Для начала разберёмся с подключением первого компаратора COMP1. Для иллюстрации подключения компаратора из RM0031 возьмём рисунок из раздела Routing interface (RI) для medium:


Входной сигнал мы будем подавать

Читать дальше

CP2102 - еще один переходник USB-COM

Универсальный переходник CP2102 USB-COM.


Особенности моего донгла:
  1. «Универсальный» режим питания CP2102-модуля, а также подключаемого MCU модуля:
    USB/Внешнее питание/Сдвоенное питание.
  2. Дополнительные линии DTR/RTS для бутлоадера (проверено на бутявках Arduino/AVR, STM32)
  3. USB-супрессор
  4. Авто-Толерантность RX/TX к уровням сигнала MCU 3.3-5V (ну это заслуга создателей CP2102, привет FT232!)



Читать дальше
  • +5
  • 20 марта 2019, 23:51
  • maxxir
  • 3

LM5176 регулируем входной и выходной ток

В статье LM5176 Силовой блок я обещал рассказать, как можно регулировать выходной/входной ток. Итак: В разрыв выходной цепи установлен шунт R5. Сигнал с него поступает на входы ISNS- и ISNS+ контроллера LM5176. Когда ток меньше порога 50mV на R5 — ограничения тока нет. Когда напряжение на шунте R5 подходит к 50mV, контроллер начинает ограничивать ток.


Изменяем схему, как показано на рисунке:

Читать дальше
  • +5
  • 18 марта 2019, 14:37
  • CreLis
  • 1

STM8L Мониторинг питающего напряжения без использования АЦП

Микроконтроллеры STM8L предназначены, прежде всего, для устройств с батарейным питанием. Поэтому часто бывает нужно следить за степенью разряда батарей. Это можно делать при помощи АЦП. Если АЦП полностью занят выполнением основной задачи, то мониторинг питания можно поручить системе Programmable voltage detector (PVD).

Обычно PVD используют для определения порога малого заряда батареи, после чего предпринимают определённые действия, пока питание не пропало совсем.
Мы же будем использовать PVD для отображения текущего заряда батареи на светодиодной шкале в диапазоне 1,7 …. 3,05 V.

Для работы мы возьмём плату STM8L-Discovery с микроконтроллером STM8L152C6T6.
LCD индикатор аккуратно вынимаем и откладываем в сторону.

Для подключения светодиодной шкалы нам понадобится весь порт B. Вместо светодиодной шкалы можно просто взять 8 светодиодов. Катодами мы подключим их к общему проводу, а анодами к выходам PB0 … PB7 порта B через резисторы по 2КОм.


Читать дальше
  • +6
  • 13 марта 2019, 00:09
  • CreLis
  • 1

Программатор SPI и I2C микросхем памяти CH341A Mini Programmer

  Микросхемы памяти серий 24хх (EEPROM), 25хх (Serial Flash) широко используются в электронике. Такие чипы присутствуют в составе практически любой конструкции современной бытовой и промышленной аппаратуры, где есть процессоры и/или микроконтроллеры. Данный программатор имеет возможность работы с обоими типами памяти.


Читать дальше

Таймеры и задержки: сборник рецептов

AVR
Увидел в статье DI HALT "Простой программный таймер для конечных автоматов" некий кусок кода и решил накатать статью…

bool MainTimerIsExpired(const uint32_t Timer)                      // ???
{                                                                  // ???
   if ((TimeMs - Timer) < (1UL << 31)) return (Timer <= TimeMs);   // ???
   return false;                                                   // ???
}                                                                  // ???

Сначала писал длинно, с приколами и разжевыванием, но мне не понравилось и в итоге убрал в черновики. Решил переоформить как краткий сборник рецептов.


Читать дальше