Загрузка данных


/* 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 */