/* USER CODE BEGIN 4 */
// 1. Функция, которая вызывается аппаратно каждую 1 миллисекунду (TIM1)
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
if (htim->Instance == TIM1)
{
if (SonarTimeout > 0)
{
// Проверяем, насчитал ли наш счетчик 50 миллисекунд
if (SonarTimeoutCnt >= SonarTimeout)
{
// Если 50 мс прошло:
SonarTimeoutCnt = 0; // 1. Сбрасываем счетчик обратно в ноль
// 2. Стреляем эхолокатором (Дергаем пин Trig - PA3)
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_3, GPIO_PIN_SET);
// 3. Ждем ровно 10 микросекунд нашим невидимым таймером TIM2
__HAL_TIM_SET_COUNTER(&htim2, 0);
while (__HAL_TIM_GET_COUNTER(&htim2) < 10);
// 4. Выключаем пин Trig
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_3, GPIO_PIN_RESET);
}
else
{
// Если 50 мс еще не прошло, просто прибавляем единичку к счетчику
SonarTimeoutCnt++;
}
}
}
}
// 2. Функция, которая вызывается, когда пин Echo (PA2) меняет напряжение
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
if (GPIO_Pin == GPIO_PIN_2)
{
if (HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_2) == GPIO_PIN_SET)
{
// Напряжение поднялось (Звук вылетел) -> Запоминаем время на секундомере TIM2
time_start = __HAL_TIM_GET_COUNTER(&htim2);
}
else
{
// Напряжение упало (Звук вернулся) -> Считаем время в пути
uint32_t echo_time = __HAL_TIM_GET_COUNTER(&htim2) - time_start;
// Переводим микросекунды в сантиметры
distance_cm = echo_time / 58;
}
}
}
/* USER CODE END 4 */