Перейти к содержанию

CRS (clock recovery system)

USB требует точной частоты 48 МГц, а внутренний RC-генератор сам по себе так не может. В STM32 с генератором HSI48 эту задачу решает блок CRS: он сравнивает частоту с пакетами начала кадра от хоста и подстраивает генератор на лету.

Обновлено Редакция GAW

CRS (clock recovery system) — цифровой блок STM32, который подстраивает внутренний RC-генератор HSI48 по внешнему эталону. По RM0433 (разд. 9.1) CRS измеряет частоту генератора, сравнивая её с сигналом синхронизации, и автоматически корректирует подстройку по измеренной ошибке без участия процессора. Главное применение — такт 48 МГц для USB без кварца.

Как работает

Эталоном обычно служат пакеты начала кадра (SOF), которые хост USB шлёт раз в 1 мс. Между двумя SOF генератор должен сделать ровно 48 000 периодов (наш расчёт: 48 МГц × 1 мс). 16-битный счётчик ошибки считает отклонение, и CRS сдвигает подстройку HSI48 (поле TRIM, 6 бит у STM32H743, табл. 85) в нужную сторону. Источник синхронизации можно сменить на внешний вывод или программный импульс, задать предделитель и полярность.

Флаги и прерывания

ФлагСмысл
SYNCOKошибка частоты в пределах нормы
SYNCWARNошибка больше, подстройка продолжается
ERRошибка синхронизации или подстройки
ESYNCожидаемый момент синхронизации

Пределы ошибки программируются; для быстрого старта RM0433 предусматривает ручную подстройку до включения автоматики.

Где встречается

Блок CRS и генератор HSI48 есть у STM32H743 и STM32L073 (CMSIS), а на страницах семейств упомянуты STM32L0x2/x3, STM32F0 с USB и STM32G0B1. В общей схеме тактирования HSI48 — ещё один внутренний генератор рядом с HSE и HSI, а выбор такта USB делается в блоке RCC. О требованиях к частоте разных скоростей USB — в термине скорость USB.

Частые вопросы

Можно ли сделать USB на STM32 без кварца?

Да, если в микроконтроллере есть генератор HSI48 и блок CRS. CRS подстраивает HSI48 по пакетам начала кадра SOF, которые хост шлёт раз в миллисекунду, и частота 48 МГц для USB держится точно, пока устройство подключено. Так, по документам ST, работают STM32L0x2/x3, STM32F0 с USB, STM32G0B1 и STM32H7.

Что делает CRS, пока USB не подключено?

Пока нет пакетов SOF, нет и эталона для автоматической подстройки по USB. RM0433 предусматривает и другие источники синхронизации — внешний вывод или программные импульсы, — а также ручную подстройку для быстрого начального схождения.

Что означают флаги SYNCOK и SYNCWARN?

Это результат сравнения частоты на очередном импульсе синхронизации. SYNCOK — ошибка в допустимых пределах, SYNCWARN — ошибка больше и подстройка продолжается, ERR — синхронизация или подстройка не удалась, ESYNC — ожидаемый момент синхронизации. Пределы задают программно, и по каждому флагу можно разрешить прерывание.

Источники

  1. STMicroelectronics. RM0433: STM32H742, STM32H743/753 and STM32H750 Value line advanced Arm-based 32-bit MCUs. Reference manual, Rev 9 — разд. 9.1: CRS — цифровой контроллер, управляющий внутренним RC-генератором HSI48 с мелким шагом подстройки; оценивает частоту генератора сравнением с выбираемым сигналом синхронизации и автоматически подстраивает по измеренной ошибке, ручная подстройка тоже возможна; идеально подходит для точного такта USB: сигнал синхронизации — пакеты начала кадра (SOF), которые хост шлёт раз в 1 мс; возможны и другие источники синхронизации или программные импульсы; разд. 9.2: выбираемый источник с предделителем и полярностью, автоматическая подстройка без процессора, ручной режим для быстрого начального схождения, 16-битный счётчик ошибки частоты с автоматическим захватом и перезагрузкой, программируемый предел оценки, прерывания ESYNC, SYNCOK, SYNCWARN, ERR; табл. 85 — ширина TRIM 6 бит
  2. STMicroelectronics. CMSIS device headers stm32h743xx.h (cmsis-device-h7 v1.10.7) и stm32l073xx.h (cmsis-device-l0 v1.9.4), GitHub, Apache-2.0 — у STM32H743 и STM32L073 есть блок CRS и бит CRS_CR_AUTOTRIMEN; генератор HSI48 включается битом RCC_CR_HSI48ON (H7) и RCC_CRRCR_HSI48ON (L0)

Нашли ошибку?