66 lines
1.6 KiB
C
66 lines
1.6 KiB
C
#include "hcsr04.h"
|
||
#include "tim.h"
|
||
|
||
// time 的单位是 10μs
|
||
static volatile uint64_t time; // 声明变量,用来计时
|
||
static uint64_t time_end; // 声明变量,存储回波信号时间
|
||
static uint8_t state;
|
||
static int16_t delay_time = -1; // 用于延时
|
||
|
||
// HACK 临时的 delay 解决方法
|
||
void delay_us(uint16_t us);
|
||
|
||
uint16_t sonar(void) // 测距并返回单位为毫米的距离结果
|
||
{
|
||
// 超时则返回5m距离
|
||
uint32_t distance = 5000;
|
||
HAL_GPIO_WritePin(SCL_C_GPIO_Port, SCL_C_Pin, GPIO_PIN_SET); // 输出高电平
|
||
delay_us(15); // 延时15微秒
|
||
HAL_GPIO_WritePin(SCL_C_GPIO_Port, SCL_C_Pin, GPIO_PIN_RESET); // 输出低电平
|
||
|
||
// HACK 考虑RTOS优化
|
||
HAL_Delay(15);
|
||
|
||
if (state)
|
||
distance = time_end * 346 / 200; // 计算距离,25°C空气中的音速为346m/s
|
||
return distance;
|
||
}
|
||
|
||
void delay_us(uint16_t us)
|
||
{
|
||
delay_time = us;
|
||
time = 0;
|
||
HAL_TIM_Base_Start_IT(&htim2);
|
||
while (time < us)
|
||
;
|
||
delay_time = -1;
|
||
}
|
||
|
||
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
|
||
{
|
||
if (htim == &htim2)
|
||
{
|
||
++time;
|
||
if (delay_us > 0 && time == delay_time)
|
||
HAL_TIM_Base_Stop_IT(&htim2);
|
||
}
|
||
}
|
||
|
||
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
|
||
{
|
||
if (GPIO_Pin == SDA_C_EXTI12_Pin)
|
||
{
|
||
if (HAL_GPIO_ReadPin(SDA_C_EXTI12_GPIO_Port, SDA_C_EXTI12_Pin))
|
||
{
|
||
time = 0;
|
||
HAL_TIM_Base_Start_IT(&htim2);
|
||
}
|
||
else
|
||
{
|
||
time_end = time;
|
||
HAL_TIM_Base_Stop_IT(&htim2);
|
||
state = 1;
|
||
}
|
||
}
|
||
}
|