函数概览
函数名 | 传入参数1 | 传入参数2 | 返回值 | 功能 |
---|---|---|---|---|
Hcsr04Init() | TIM_HandleTypeDef *htim | uint32_t Channel | void | 初始化超声波模块 |
Hcsr04Start() | None | None | void | 超声波触发 |
Hcsr04TimOverflowIsr() | TIM_HandleTypeDef *htim | None | void | 定时器计数溢出处理 |
Hcsr04TimIcIsr() | TIM_HandleTypeDef* htim | None | void | 计算距离 |
Hcsr04Read() | None | None | float | 读取距离 |
HAL_TIM_IC_CaptureCallback() | TIM_HandleTypeDef *htim | None | void | 输入捕获处理函数 |
HAL_TIM_PeriodElapsedCallback() | TIM_HandleTypeDef *htim | None | void | 定时器溢出中断处理函数 |
调用样例
Hcsr04Init()
int main()
{
Hcsr04Init(&htim2,TIM_CHANNEL_1); //初始化TIM2定时器通道1作为超声波传输数据通道
}
Hcsr04Start()
int main()
{
while(1)
{
Hcsr04Start(); //触发超声波模块,发出信号
}
}
HAL_TIM_PeriodElapsedCallback() Hcsr04TimOverflowIsr()
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) //重定向中断处理函数
{
Hcsr04TimOverflowIsr(htim); //定时器溢出计数器计数
}
//以上两个函数均封装在hc-sr04.c文件中,无需手动调用
HAL_TIM_IC_CaptureCallback() Hcsr04TimIcIsr()
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim) //输入捕获中断函数
{
Hcsr04TimIcIsr(htim); //输入捕获计算高电平时间->距离
}
//以上两个函数均封装在hc-sr04.c文件中,无需手动调用
超声波整体实现函数(用串口发送):
/* USER CODE BEGIN StartDefaultTask */
char buf[64];
Hcsr04Init(&htim2,TIM_CHANNEL_1);
/* Infinite loop */
for(;;)
{
Hcsr04Start();
sprintf(buf,"distance:%.1f cm\r\n", Hcsr04Read());
HAL_UART_Transmit_IT (&huart1 ,(uint8_t *)buf,strlen(buf));
osDelay(300); // ????300ms
}
/* USER CODE END StartDefaultTask */
样例采用串口1(usart1)发送,实际应用不需发送。
使用操作系统FreeRTOS需要把所有HAL_Delay替换成osDelay
ECHO初始配置为TIM2 CHANNEL_1 PA0引脚。 打开中断NVIC!!!
TIRG初始配置为PA4引脚,普通GPIO输出
TRIG与ECHO需要在此处进行宏定义,在封装函数中有使用
hc-sr04.c和hc-sr04.h文件下载链接: