Я использую плату B-L072Z-LRWAN1 (с микроконтроллером STM32L072) и хочу получать данные с датчика DHT11. Для этого мне нужна задержка в микросекундах, которую я не могу получить.
Библиотеки, предоставляемые ST, имеют функцию задержки миллисекунд, но не функцию микросекунд.
Мне нужна помощь. Заранее спасибо!
Вам не нужна задержка в микросекундах, а счетчик таймера с точностью до микросекунд.
Глядя на таблицу данных, связанную с @JRE, это асинхронный протокол. Хост передает длинный низкий импульс (не менее 18 миллисекунд ), и это единственный момент, когда MCU должен что-либо задерживать. Но у вас уже есть функция задержки в миллисекундах (и в любом случае это было бы лучше сделать в прерывании в миллисекундах , которое, вероятно, уже запущено).
Затем устройство отвечает начальным циклом и 40 циклами данных, где длина старшей фазы кодирует значение бита. Вы должны измерить время, прошедшее между нарастающим и спадающим фронтом.
Если запущено прерывание миллисекунд, то уже есть что-то подсчитывающее циклы. Обычно это SysTick
таймер. Дождитесь переднего фронта на выводе, получите метку времени от SysTick->VAL
, дождитесь заднего фронта, снова прочитайте показания счетчика и вычтите предыдущую метку времени. Следите за переполнением, добавляйте SysTick->LOAD+1
к результату, если он отрицательный. Разделите результат на тактовую частоту (в МГц), чтобы получить значение в микросекундах.
Однако вы можете предпочесть, чтобы микроконтроллер делал что-то полезное или позволил ему спать, чтобы экономить энергию, пока поступают данные.
Таймер и DMA могут выполнять большую часть работы самостоятельно.
Прочтите описание функций TIM2/TIM3/ раздел «Режим захвата ввода» в Справочном руководстве.
Поскольку нижняя фаза сигнала всегда должна иметь длину 50 мкс, вы также можете измерить время между двумя последовательными спадающими фронтами. Пример в руководстве предназначен для нарастающих фронтов, но, конечно, его можно изменить для захвата спадающих фронтов, изменив биты CC1P
и CC1NP
на шаге 3.
CCR
канала таймера в массив подходящего размера в памяти.PSC
, и не забудьте установить UG
в EGR
), чтобы удобно было получить метку времени в миллисекундах.DIER
.ARR
.
пользователь197178
JRE
Крис Стрэттон
пользователь197178