Car/Peripheral/Src/hcsr04.c
2024-07-20 10:48:10 +08:00

73 lines
2.0 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include "hcsr04.h"
#include "syscalls.h"
#include "delay.h"
#include "tim.h"
static uint64_t time_start; // 声明变量,用来计时
static uint64_t time_end; // 声明变量,存储回波信号时间
uint8_t sonor_state; // 测距状态变量0未测量1正在测量2已测量
uint32_t sonor_distance = INT32_MAX; // 测量出的距离单位mm
void HCSR04_HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim);
// 初始化超声波测距
void HC_SR04_Init(void)
{
// 禁用JTAG
__HAL_RCC_AFIO_CLK_ENABLE();
__HAL_AFIO_REMAP_SWJ_NOJTAG();
// 注册定时器中断溢出回调
HAL_TIM_RegisterCallback(&htim2, HAL_TIM_PERIOD_ELAPSED_CB_ID, HCSR04_HAL_TIM_PeriodElapsedCallback);
sonor_distance = INT32_MAX;
}
// 启动测距单位mm
uint32_t sonar_mm(void)
{
sonor_state = 1;
HAL_GPIO_WritePin(TRIG_GPIO_Port, TRIG_Pin, GPIO_PIN_SET); // 输出高电平
delay_us(15); // 延时15微秒
HAL_GPIO_WritePin(TRIG_GPIO_Port, TRIG_Pin, GPIO_PIN_RESET); // 输出低电平
return sonor_distance;
}
void HCSR04_HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
if (htim == &htim2)
{
// 每10us自增一
++time_start;
}
}
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
if (GPIO_Pin == ECHO_Pin)
{
if (HAL_GPIO_ReadPin(ECHO_GPIO_Port, ECHO_Pin))
{
time_start = 0;
HAL_TIM_Base_Start_IT(&htim2);
}
else
{
time_end = time_start;
HAL_TIM_Base_Stop_IT(&htim2);
sonor_state = 2;
sonor_distance = (time_end / 100 < 38) ? (time_end * 346) / 200 : INT32_MAX;
Sonar_CP_Callback();
sonor_state = 0;
}
}
}
// 测距完毕回调执行完自定义任务后会将sonor_state置0
__attribute__((weak)) void Sonar_CP_Callback()
{
my_printf(HUART2, "distance = %d (mm)\n", sonor_distance);
}