В настоящее время я портирую свой DCF77 library (вы можете найти source code at GitHub) от Arduino (на базе AVR) до Arduino Due (ARM Cortex M3).SysTick-> LOAD vs SysTick-> CALIB
Для библиотеки требуется точное время в 1 мс. Очевидным кандидатом является использование систолов. Приблизительно Arduino Due уже настроен для систем с частотой 1 кГц.
Однако моя библиотека (DCR) библиотеки AVR способна настраивать синхронизацию после ее блокировки до DCF77. Это делается путем манипулирования значениями перезагрузки таймера, например
void isr_handler() {
cumulated_phase_deviation += adjust_pp16m;
// 1/250/64000 = 1/16 000 000
if (cumulated_phase_deviation >= 64000) {
cumulated_phase_deviation -= 64000;
// cumulated drift exceeds 1 timer step (4 microseconds)
// drop one timer step to realign
OCR2A = 248;
} else if (cumulated_phase_deviation <= -64000) {
// cumulated drift exceeds 1 timer step (4 microseconds)
// insert one timer step to realign
cumulated_phase_deviation += 64000;
OCR2A = 250;
} else {
// 249 + 1 == 250 == 250 000/1000 = (16 000 000/64)/1000
OCR2A = 249;
}
DCF77_Clock_Controller::process_1_kHz_tick_data(the_input_provider());
}
Я хочу передать это на процессор ARM. В информационном центре ARM я нашел следующее documentation.
Настройка SysTick
...
Для настройки SysTick необходимо загрузить SysTick Reload Value регистр с интервалом требуемого между событиями SysTick , Таймер бит прерывания или бит COUNTFLAG (в регистре управления SysTick и статусом ) активируется при переходе от 1 до 0, поэтому он активирует каждые n + 1 тактов. Если требуется период в 100, 99 должен быть записан в регистр значения SysTick Reload Value. Регистр обновления SysTick поддерживает значения от 1 до 0x00FFFFFF.
Если вы хотите использовать SysTick для генерации события в таймерном интервале, например, 1мс, вы можете использовать SysTick Calibration Value Register для масштабирования значения для регистра Reload. Регистр калибровочного значения SysTick является регистром только для чтения, который содержит число импульсов в течение периода 10 мс в поле TENMS (бит 0 до 23). Этот регистр также имеет бит SKEW (30), который используется для указания , что калибровка в течение 10 мс в секции TENMS не является точно 10 мс из-за небольших изменений в тактовой частоте. Бит 31 используется для указания , если имеется опорный тактовый сигнал.
...
К сожалению, я не нашел ничего о том, как SysTick-> НАГРУЗКИ и SysTick-> CALIB связаны. То есть: если я хочу дросселировать или ускорять систолы, мне нужно управлять значением LOAD или CALIB? И какие значения мне нужно внести в эти регистры?
Поиск в Интернете не вызвал никаких улучшенных намеков. Возможно, я искал неправильные места. Есть ли где-нибудь более подробная ссылка на эти вопросы? Или, может быть, даже хорошие примеры?
Arduino устанавливает систолы таким образом, чтобы они работали на частоте 1 кГц. Однако моя библиотека нуждается в лучшей точности. Поэтому мне нужно настроить его лучше. Следовательно, мне нужно соответствующим образом изменить значения. Задержка не является проблемой. То, что меня затачивает, - это значение «Значение, доступное только для чтения в SYST_CALIB (если оно действительно существует, будучи реалистичным и необязательным), это просто для привязки тиков SYSTICK к фактическому времени настенного закрытия -« Как именно работает этот механизм ? Или я должен просто игнорировать значение калибровки и напрямую корректировать значение перезагрузки? Но какова же ценность калибровки? –
Таким образом, в принципе SYST_CALIB не относится к RELOAD. Это относится только к другим частям программного обеспечения -> я могу игнорировать его. Отлично. Ваш комментарий также объясняет, почему я этого не понял. Я заметил ту же проблему (10 мс против 1 мс) в таблицах данных, но я подумал, что это мое отсутствие понимания. –
Согласно тому, что я узнал сейчас (см. Мой ответ ниже), SysTicks, похоже, имеет тактовую частоту 84 МГц. Соответственно, я ожидал бы, что SYST_CALIB (который я игнорирую в любом случае) должен быть заполнен 84000 или 8400 в зависимости от того, как вы интерпретируете документацию - правильно? –