======Блок ClockChecker в 1986ВЕ8Т====== Для мониторинга отклонения текущей тактовой частоты от допустимого значения в 1986ВЕ8Т реализован блок сравнения этой частоты с частотой HSI. Вот аналог схемы из спецификации: {{1986be8t:clk_checker_scheme.png}} Как видно из схемы, блок считает количество импульсов одной частоты между периодами сброса, сформированными от второй частоты. Счетчик может считать только до 15-ти, поэтому входные сигналы должны иметь сопоставимые частоты, чтобы уложиться в это значение. Для этого входные частоты делятся с помощью делителей. Таким образом блок отслеживает соотношение входных частот. Блок контроля частот состоит из схемы контроля снижения частоты и схемы контроля повышения частоты, для каждой схемы считается свой коэффициент соотношения частот: * SHIFT_REG0 - для схемы детектирования снижения частоты CLK. * SHIFT_REG1 - для схемы детектирования повышения частоты CLK. Это внутренние значения, которые постоянно обновляются. Их максимальные значения выводятся в регистр STAT поля MAX_CHK_SHIFT_REG0 и MAX_CHK_SHIFT_REG1 соответственно. Это позволяет понять, отклонялась ли частота и насколько далеко. Кроме этого, для отклонений есть два порога, по которым вырабатываются события. Эти события позволяют получить прерывание при выходе частоты из заданного диапазона. Регистры и их поля, используемые для настройки схем, представлены на картинках ниже: //(На момент написания статьи формулы в спецификации такие, но вероятно скоро будут уточнены. см. ниже)// ===Контроль снижения частоты=== {{1986be8t:clockchkslow.png}} ===Контроль повышения частоты=== {{1986be8t:clockchkfast.png}} Значения 10, 12, 15 параметров SHIFT_REG0 и SHIFT_REG1 на осях абсцисс взяты для примера из спецификации. Где * CLK = 80 МГц, PRES_REG1 = 100, PRES_REG3 = 1 * HSI = 8 МГц, PRES_REG0 = 1, PRES_REG2 = 1 Подставляя значения в формулы с картинок, получаем коэффициенты SHIFT_REG0 и SHIFT_REG1 для правильного отношения частот. В спецификации они обозначены К0 и К1: * HSI/1 = SHIFT_REG0 * CLK/100, SHIFT_REG0 = 10 * CLK/1 = SHIFT_REG1 * HSI/1, SHIFT_REG1 = 10 Теперь, задав значения BASE_REGx больше значений Кх, настраиваются пороги, при которых будут возникать события при отклонении отслеживаемой частоты. Максимальное значение регистров BASE_REGx указано как 15, но на практике при уходе частоты из регистров считывается значение 16 (0х10). Это, видимо, уже переполнение счетчика. =====Уточнение формулы===== Счетчик не считает при активном сигнале Reset, а это длительность "1"-цы исходного сигнала, за которую приходит несколько тактов отслеживаемой частоты. Формулы, приведенные ранее, учитывают этот момент, т.е. количество пропущенных за время ресета импульсов уже учтено в способе задания делителей: {{1986be8t:clkchk_clkgehsi.png}} Но, если период отслеживаемой частоты окажется больше, чем длительность "1"-цы, формирующей сброс, то формулы становятся не точны. Необходимо исключить количество импульсов за ресет, поскольку их там не будет, они "не влезут": {{1986be8t:clkchk_clklthsi.png}} //(Данные картинки представлены в разном масштабе, а вся разница состоит в отношении длительности полупериода "1" HSI к импульсам CLK. **Делители только прореживают сигнал, но не сохраняют скважность в 50%!**)// В итоге, более точные формулы получаются такие: * При HSI < CLK: * K0 = HSI / (PRES_REG2 + 1) * (PRES_REG1 + 1) / CLK * K1 = CLK / (PRES_REG3 + 1) * PRES_REG0 / HSI * При CLK < HSI: * K0 = HSI / (PRES_REG2 + 1) * PRES_REG1 / CLK * K1 = CLK / (PRES_REG3 + 1) * (PRES_REG0 + 1) / HSI Как видно, тут просто исключены +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: {{1986be8t:clkchk_hsi_def.png}}{{1986be8t:clkchk_hsi_minmax.png}} Как видно из картинок, параметры 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-ом на [[https://github.com/StartMilandr/MDR_Pack_v6/tree/master/PACK_Gen/Files/Examples/All_Boards/ClockChecker|GitHub]] помимо случая с HSE0, представлен также вариант аварийного перехода на частоту HSI с тактирования от HSE0 через PLL0. Для эмуляции "аварии" в примере просто выключается PLL. При инициализации блока необходимо сбросить теневые регистры MAX_SHIFT раньше разрешения аварийных переключений на HSI!