Содержание

Блок ClockChecker в 1986ВЕ8Т

Для мониторинга отклонения текущей тактовой частоты от допустимого значения в 1986ВЕ8Т реализован блок сравнения этой частоты с частотой HSI. Вот аналог схемы из спецификации:

Как видно из схемы, блок считает количество импульсов одной частоты между периодами сброса, сформированными от второй частоты. Счетчик может считать только до 15-ти, поэтому входные сигналы должны иметь сопоставимые частоты, чтобы уложиться в это значение. Для этого входные частоты делятся с помощью делителей. Таким образом блок отслеживает соотношение входных частот.

Блок контроля частот состоит из схемы контроля снижения частоты и схемы контроля повышения частоты, для каждой схемы считается свой коэффициент соотношения частот:

Это внутренние значения, которые постоянно обновляются. Их максимальные значения выводятся в регистр STAT поля MAX_CHK_SHIFT_REG0 и MAX_CHK_SHIFT_REG1 соответственно. Это позволяет понять, отклонялась ли частота и насколько далеко. Кроме этого, для отклонений есть два порога, по которым вырабатываются события. Эти события позволяют получить прерывание при выходе частоты из заданного диапазона. Регистры и их поля, используемые для настройки схем, представлены на картинках ниже:

(На момент написания статьи формулы в спецификации такие, но вероятно скоро будут уточнены. см. ниже)

Контроль снижения частоты

Контроль повышения частоты

Значения 10, 12, 15 параметров SHIFT_REG0 и SHIFT_REG1 на осях абсцисс взяты для примера из спецификации. Где

Подставляя значения в формулы с картинок, получаем коэффициенты SHIFT_REG0 и SHIFT_REG1 для правильного отношения частот. В спецификации они обозначены К0 и К1:

Теперь, задав значения BASE_REGx больше значений Кх, настраиваются пороги, при которых будут возникать события при отклонении отслеживаемой частоты. Максимальное значение регистров BASE_REGx указано как 15, но на практике при уходе частоты из регистров считывается значение 16 (0х10). Это, видимо, уже переполнение счетчика.

Уточнение формулы

Счетчик не считает при активном сигнале Reset, а это длительность "1"-цы исходного сигнала, за которую приходит несколько тактов отслеживаемой частоты. Формулы, приведенные ранее, учитывают этот момент, т.е. количество пропущенных за время ресета импульсов уже учтено в способе задания делителей:

Но, если период отслеживаемой частоты окажется больше, чем длительность "1"-цы, формирующей сброс, то формулы становятся не точны. Необходимо исключить количество импульсов за ресет, поскольку их там не будет, они "не влезут":

(Данные картинки представлены в разном масштабе, а вся разница состоит в отношении длительности полупериода "1" HSI к импульсам CLK. Делители только прореживают сигнал, но не сохраняют скважность в 50%!)

В итоге, более точные формулы получаются такие:

Как видно, тут просто исключены +1 в соответствующих коэффициентах. Для расчета необходимо выбирать ту пару формул, куда ожидается уход частоты CLK. Если ожидается уход частоты CLK ниже частоты HSI, то прескеллеры и значения K0,K1 подбираются по формуле для CLK < HSI. В противном случае, используется формула HSI > CLK. Поскольку обычно требуется высокое быстродействие, то чаще всего необходимы формулы для CLK < HSI.

Уровни срабатывания событий считаются по этим же формулам, только вместо CLK необходимо поставить частоту, при которой необходимо получить EVENT. Подобрать уровни порогов событий можно и эмпирически. Для этого надо настроить блок на рабочую частоту и посмотреть, какие значения отклонений вырабатывает блок при тюнинге частоты. Эти значения и следует прописать в регистры SHIFT_REG0 / SHIFT_REG1 как уровни для возникновения событий (EVENTs).

Пример для HSE0

Для проверки работы блока можно использовать подстройку генератора HSI в блоке BKP. Параметра HSI_Trim позволяет подстроить частоту внутреннего RC-генератора HSI. Ниже приведены скриншоты того, как меняются отклонения SHIFT_REG0 и SHIFT_REG1 при среднем значении HSI_Trim, минимальном и максимальном. В качестве CLK используется сигнал от HSE0, на отладочной плате это резонатор на 10МГц. Картинки отражают выработку событий при тюнинге HSI_Trim:

Как видно из картинок, параметры SHIFT_REG0 и SHIFT_REG1 отражают изменение соотношения частот HSE0 и HSI при регулировке HSI_Trim. Изменения не значительны, потому что частота HSI меняется слабо. Расчетные же значения были равны:

  K0 = HSI / (HSI_PrescREG2 + 1) * (CLK_PrescREG1 + 1) / CLK =  8MHz / 2 * 10 / 10MHz = 4
  K1 = CLK / (CLK_PrescREG3 + 1) *  HSI_PrescREG0      / HSI = 10MHz / 2 *  8 /  8MHz = 5

При стартовом значении регистры SHIFT_REG0 и SHIFT_REG1 имеют значения 3 и 5, что близко к расчетным 4 и 5. При отклонении частоты меняются значения этих регистров и вырабатываются события.

В демо-проекте работы с ClockChecker-ом на GitHub помимо случая с HSE0, представлен также вариант аварийного перехода на частоту HSI с тактирования от HSE0 через PLL0. Для эмуляции "аварии" в примере просто выключается PLL.

При инициализации блока необходимо сбросить теневые регистры MAX_SHIFT раньше разрешения аварийных переключений на HSI!