激光测距模块驱动代码

/***********************************************************************************************************************
------------------------------------------------------------------------------------------------------------------------
||	使用须知:对于单类接口的说明,如果一般情况来说,仅能存在一个设备的,作者会将其定义为单类方式。值得注意的是,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__ */
  • 0
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值