ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Четверг
21 ноября
1371612 Топик полностью
Eddy_Em (14.11.2023 10:41, просмотров: 171) ответил Dingo на Для NTP всегда "ARR" константа, а именно 2^32. Формат uint32_t.uint32_t, то есть в дробной части, которая соответствует числителю подразумевается знаменатель 2^32= 1sec. а у вас он меняться будет. У каждого устройства. А нужен один для всех, единообразный. 48e+6 взять не можете, потому что где-то окажется и больше этой величины из-за разброса кварцев. Я предлагаю взять знаменатель дроби в 1e9, что согласуется с одним из используемых форматов в time.h
МК не может выполнять счетную работу: деления, да еще во флоатах, займут очень много времени. Вот, у меня, например, на F042 идет вычисление температур с датчиков TSYS01 (во флоатах, по полиному) - занимает несколько миллисекунд! 

И кому мешает то, что ARR имеет разные значения? ПК это значение считает - вот и вся унификация интерфейса! Т.е. для ПК нет необходимости знать ни тактовую, ни прочие вещи. Он знает, что за N секунд время МК ушло вперед или назад на M условных мкс. Их произведения (1+PCS)(1+ARR) легко получить значение частоты шины тактирования таймера. Ну и дальше вычисляем с учетом коррекции новую пару ARR и PSC, чтобы это произведение было наиболее близким к заданному. Жаль, конечно, что здесь выходит произведение, а не частное. С делимым/делителем (да еще и если б они были 32-битными) намного точней можно было бы настройку делать.

eddy-em.livejournal.com github.com/eddyem