/***********************************************************************************************************************
------------------------------------------------------------------------------------------------------------------------
|| 使用须知:对于单类接口的说明,如果一般情况来说,仅能存在一个设备的,作者会将其定义为单类方式。值得注意的是,C语言并没
|| 有类的说法,使用结构体类比于C++/Java等其他语言的类操作。
||
|| 编码风格:所有接口均以函数指针进行传递,数据类型不作重定义,大多采用8bit数据类型进行数据传输,逻辑变量均以类型开头命
|| 名,一般符合驼峰命名.(eg:unsigned char ucValue;signed int siValue;float fValue;struct sValue;enum eValue;)
||
|| 文件说明:本驱动文件基于STM32F103系列实现,内部使用MCU的一个串口及其IO资源,用户可以根据laser_ranging.h中的宏进行修
|| 改,默认使用了USART2作为收发总线,PA2为Tx,PA3为Rx。本驱动文件为用户提供了4个接口以供使用:释放资源(close),获
|| 取距离(getDistance),检查状态(checkState),发送命令(sendCommand)。值得注意的是当您配置为连续或者快速连续模式
|| 时,您获取的距离信息不一定您认为时刻的,尽管我保证他是最新的。建议在获取前checkState,getDistance将会复位状态。
||
|| 使用说明:LaserRanging * laserRanging = getLaserRangingHandle();//获取控制句柄,内部将完成所有初始化操作,您无需担心
|| if(laserRanging == NULL){错误处理代码} //检测句柄是否有效
|| laserRanging->sendCommand(LRC_SINGLE); //单次采集触发
|| while(laserRanging->checkState() == LRS_WITHOUT);//等待采集完成,建议做超时处理,否则当器件异常会阻塞程序
|| float fDistance = laserRanging->getDistance(); //获取距离数据(单位:M)
|| laserRanging->close(); //释放相关资源
||
|| 作者:蒋才有
||
|| 版本:V1.0
||
|| 开发时间:2021.10.25 - xxxx.xx.xx
||
|| 注意事项:本激光测距基于L1MBV2.0实现,STM32F1系列测试有效,如需移植其他平台或使用请自行完成并注明出处!
|| Tips:When you encounter an exception, you can define "LASER_RANGING_DEBUG" to help you find the error.
||
|| 联系方式:1932857334@qq.com By Email
________________________________________________________________________________________________________________________
************************************************************************************************************************/
#ifndef __LASER_RANGING_H__
#define __LASER_RANGING_H__
#include "stm32f10x.h"
/* 调试配置宏,正常使用请注释该宏,在调试模式下将输出更多日志信息,影响系统运行效率 */
//#define LASER_RANGING_DEBUG
/* 串口通讯硬件资源宏 */
#define LASER_RANGING_USART_TX_PORT GPIOA
#define LASER_RANGING_USART_RX_PORT GPIOA
#define LASER_RANGING_USART_TX_PIN GPIO_Pin_2
#define LASER_RANGING_USART_RX_PIN GPIO_Pin_3
#define LASER_RANGING_USART USART2
#define LASER_RANGING_BAUD_RATE 115200
#define LASER_RANGING_USART_IRQ USART2_IRQn
#define LASER_RANGING_USART_IRQHandler USART2_IRQHandler
#define LASER_RANGING_USART_CLOCK RCC_APB1Periph_USART2
#define LASER_RANGING_USART_CLOCK_CMD RCC_APB1PeriphClockCmd
/* 激光测距模块命令 */
typedef enum {
LRC_SINGLE = 0x02, //单次触发
LRC_CONTINUOUS = 0x03, //连续模式(10Hz)
LRC_RAPID_SUCCESSION= 0x04, //快速连续模式(20Hz)
LRC_STOP = 0x05, //停止采集
}LaserRangingCmd;
/* 激光测距状态 */
typedef enum {
LRS_ERROR = 0, //错误
LRS_SUCCEED = 1, //成功
LRS_NEW_DATA= 2, //新的数据
LRS_WITHOUT = 3, //无改变
LRS_RECV_ERROR = 4, //接收异常
LRS_FAULT = 5, //故障
}LaserRangingState;
typedef struct{
void (*close)(void);
float (*getDistance)(void);
LaserRangingState (*checkState)(void);
LaserRangingState (*sendCommand)(LaserRangingCmd eCmd);
}LaserRanging;
/* 对外接口 */
LaserRanging* getLaserRangingHandle(void);
/* 测试接口 */
#ifdef LASER_RANGING_DEBUG
void* laserRangingTestApi(unsigned int event,void *obj);
#endif /* LASER_RANGING */
#endif /* __LASER_RANGING_H__ */
激光测距模块驱动代码
最新推荐文章于 2022-10-28 17:35:15 发布