Как написать функцию разницы во времени в STM32F4 - PullRequest
0 голосов
/ 26 июня 2019

Я работаю над STM32F4 и довольно новичок в этом.Я знаю основы C, но с более чем 1-дневным исследованием я все еще не нашел решения этой проблемы.

Я просто хочу сделать функцию задержки самостоятельно, процессор работает на 168 МГц (HCLK).Итак, моя интуиция говорит, что она производит 168x10 ^ 6 тактов в каждую секунду.Таким образом, метод должен быть примерно таким:

1-Сохранить текущий счетчик часов в переменной

2-Time diff = (значение часов в любое время - сохраненное начальное значение часов) / 168000000

Этот поток должен дать мне разницу во времени в секундах, и тогда я смогу использовать ее для преобразования всего, что захочу.

Но, к сожалению, несмотря на то, что это кажется таким простым, я просто не могу реализовать любые методыв MCU.

Я пробовал time.h, но он не работал должным образом.Например, часы () давали один и тот же результат снова и снова, а время (возвращающее секунды с 1970 года) давало шестнадцатеричный 0xFFFFFFFF (-1, я думаю, означает ошибку).

Спасибо.

Редактировать: во время записи я предполагал, что некоторые функции, такие как clock (), будут возвращать общее количество часов с начала выполнения программы, но теперь я думаю, что через 4Billion / 168Million ss он превысит размер uint32_t.Я действительно смущен.

1 Ответ

0 голосов
/ 26 июня 2019

Ответ зависит от требуемой точности и интервалов.

Для более коротких интервалов с точностью до микросекунды имеется счетчик циклов . Ваше подозрение верно, оно переполнится через 2 32 / 168 * 10 6 ~ 25,5 секунд.

Для более длинных интервалов есть таймеры, которые могут быть предварительно масштабированы для поддержки любого возможного подразделения тактовой частоты 168 МГц. Наиболее часто используемая настройка - это таймер SysTick, настроенный для генерации прерывания на частоте 1 кГц, который увеличивает счетчик программного обеспечения. Чтение этого счетчика дало бы количество миллисекунд, прошедших с момента запуска. Так как обычно это 32-битный счетчик, он переполняется через 49,7 дней. Библиотека HAL устанавливает SysTick таким образом, счетчик может быть запрошен с помощью функции HAL_GetTick().

Для более длительных или более специализированных требований к синхронизации вы можете использовать периферийное устройство RTC, которое хранит календарное время, или периферийные устройства TIM (базовые, общие и расширенные таймеры), у них есть свои собственные предварительные шкалы, и их можно расположить в настройке ведущий-ведомый, чтобы дать почти произвольную точность и интервалы.

...