STM32F103实现激光测距传感器测距WT-VL53L0 L1

news/2024/11/24 10:28:28/

目录

本博客将采用标准库和HAL库实现

所用设备选择

引脚说明

与单片机的接线表

标准库实现

 HAL库实现


本博客将采用标准库HAL库实现

所用设备选择

单片机型号:STM32F103C8T6

 激光测距传感器型号:WT-VL53L0 L1

 

采用串口TTL电平输出,可以接USB-TTL串口到电脑,或者直接接MCU的串口,实时输出距离数据(ASCII码)。

该模块可以直接接收串口数据

本博文任务是将数据提取出来,以便其它模块使用。

引脚说明

模块的引脚说明:

序号激光测距模块引脚颜色
1VCC红色
2RXD绿色
3TXD黄色
4SCL-
5SDA-
6GND黑色

与单片机的接线表

序号激光测距模块引脚颜色单片机STM32
1VCC红色VCC/5V
2RXD绿色PA2(USART2_TX)
3TXD黄色PA3(USART2_RX)
4SCL-
5SDA-
6GND黑色GND
7--PA9(USART1_TX)
8--PA10(USART1_RX)

这里选用了两个串口

串口1的作用是将数据测得数据显示在电脑端(串口助手显示)

串口2采集测得的数据,并进行处理。

标准库实现

 usart.c

void uart1_init(u32 bound){//GPIO端口设置GPIO_InitTypeDef GPIO_InitStructure;USART_InitTypeDef USART_InitStructure;NVIC_InitTypeDef NVIC_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA, ENABLE);	//使能USART1,GPIOA时钟//USART1_TX   GPIOA.9GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //PA.9GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;	//复用推挽输出GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA.9//USART1_RX	  GPIOA.10初始化GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;//PA10GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA.10  //Usart1 NVIC 配置NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3 ;//抢占优先级3NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;		//子优先级3NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;			//IRQ通道使能NVIC_Init(&NVIC_InitStructure);	//根据指定的参数初始化VIC寄存器//USART 初始化设置USART_InitStructure.USART_BaudRate = bound;//串口波特率USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字长为8位数据格式USART_InitStructure.USART_StopBits = USART_StopBits_1;//一个停止位USART_InitStructure.USART_Parity = USART_Parity_No;//无奇偶校验位USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//无硬件数据流控制USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;	//收发模式USART_Init(USART1, &USART_InitStructure); //初始化串口1USART_ITConfig(USART1, USART_IT_RXNE, DISABLE);//开启串口接受中断  串口1暂时不需要接收数据,只需要发送数据即可USART_Cmd(USART1, ENABLE);                    //使能串口1 
}void uart2_init(u32 bound){//GPIO端口设置GPIO_InitTypeDef GPIO_InitStructure;USART_InitTypeDef USART_InitStructure;NVIC_InitTypeDef NVIC_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);	//使能GPIOA时钟 RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);	//使能USART2时钟 //USART1_TX   GPIOA.2GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; //PA.2GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;	//复用推挽输出GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA.2//USART1_RX	  GPIOA.3初始化GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;//PA3GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA.3  //Usart1 NVIC 配置NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3 ;//抢占优先级3NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;		//子优先级3NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;			//IRQ通道使能NVIC_Init(&NVIC_InitStructure);	//根据指定的参数初始化VIC寄存器//USART 初始化设置USART_InitStructure.USART_BaudRate = bound;//串口波特率USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字长为8位数据格式USART_InitStructure.USART_StopBits = USART_StopBits_1;//一个停止位USART_InitStructure.USART_Parity = USART_Parity_No;//无奇偶校验位USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//无硬件数据流控制USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;	//收发模式USART_Init(USART2, &USART_InitStructure); //初始化串口1USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);//开启串口接受中断USART_Cmd(USART2, ENABLE);                    //使能串口1 
}void USART2_IRQHandler(void)                	//串口2中断服务程序
{int i = 0;	//	循环变量int n = 0;	//	循环变量int Dis = 0;		//	距离char InStr[20]="";     //	存放整数字符串if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET)  //接收中断(接收到的数据必须是0x0d 0x0a结尾){USART_ClearITPendingBit(USART2, USART_IT_RXNE);//清除标志位aRxBuffer =USART_ReceiveData(USART2);//(USART1->DR);	//读取接收到的数据RxBuffer[Uart1_Rx_Cnt++] = aRxBuffer;			//	接收数据if( 'm' == RxBuffer[Uart1_Rx_Cnt-1] && 'm' == RxBuffer[Uart1_Rx_Cnt-2] ){USART_ITConfig(USART2, USART_IT_RXNE, DISABLE);//关闭串口接受中断  为了处理数据if(NULL != strstr(RxBuffer, "Valid"))			//	判断是否是有效数据{	
//				for(i=0;i<strlen(RxBuffer);i++)				///	调试代码 可删除
//				{
//					USART_SendData(USART1, RxBuffer[i]);	
//					delay_ms(1);
//				}		for(i = 15;i<strlen(RxBuffer);i++){TxBuffer[i-15] = RxBuffer[i];}for(i = 0;i<strlen(TxBuffer);i++){if(TxBuffer[i]<='9' && TxBuffer[i]>='0'){InStr[n++] = TxBuffer[i];}}Dis = atoi(InStr);					//	距离 一个整数 可以直接使用///****调试 串口1 输出**开始**********sprintf(TxBuffer,"%d\r\n",Dis); for(i=0;i<strlen(TxBuffer);i++){USART_SendData(USART1, TxBuffer[i]);	delay_ms(1);}///****调试 串口1 输出**结束**********	}memset(RxBuffer,0x00,sizeof(RxBuffer)); //清空数组memset(TxBuffer,0x00,sizeof(TxBuffer)); //清空数组memset(InStr,0x00,sizeof(InStr)); //清空数组Uart1_Rx_Cnt = 0;n = 0;USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);//开启串口接受中断  为了处理数据}}
}

实现效果:

 HAL库实现

 核心代码就在回调函数这个地方:


void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{int i = 0;	//	循环变量int n = 0;	//	循环变量int Dis = 0;		//	距离char InStr[20]="";     //	存放整数字符串/* Prevent unused argument(s) compilation warning */UNUSED(huart);/* NOTE: This function Should not be modified, when the callback is needed,the HAL_UART_TxCpltCallback could be implemented in the user file*/if(aRxBuffer != 0){RxBuffer[Uart1_Rx_Cnt++] = aRxBuffer;			//	接收数据}if( 'm' == RxBuffer[Uart1_Rx_Cnt-1] && 'm' == RxBuffer[Uart1_Rx_Cnt-2] ){if(NULL != strstr(RxBuffer, "Valid"))			//	判断是否是有效数据{	
//			HAL_UART_Transmit(&huart1, (uint8_t *)RxBuffer, strlen(RxBuffer),0xFFFF); 	//将收到的信息发送出去
//			while(HAL_UART_GetState(&huart1) == HAL_UART_STATE_BUSY_TX);								//检测UART发送结束
//			HAL_UART_Transmit(&huart1, (uint8_t *)"\r\n", strlen("\r\n"),0xFFFF); 			//将收到的信息发送出去
//			while(HAL_UART_GetState(&huart1) == HAL_UART_STATE_BUSY_TX);								//检测UART发送结束		for(i = 15;i<strlen(RxBuffer);i++){TxBuffer[i-15] = RxBuffer[i];}for(i = 0;i<strlen(TxBuffer);i++){if(TxBuffer[i]<='9' && TxBuffer[i]>='0'){InStr[n++] = TxBuffer[i];}}Dis = atoi(InStr);					//	距离 一个整数 可以直接使用sprintf(TxBuffer,"%d\r\n",Dis); HAL_UART_Transmit(&huart1, (uint8_t *)TxBuffer, strlen(TxBuffer),0xFFFF); //将收到的信息发送出去while(HAL_UART_GetState(&huart1) == HAL_UART_STATE_BUSY_TX);//检测UART发送结束}memset(RxBuffer,0x00,sizeof(RxBuffer)); //清空数组memset(TxBuffer,0x00,sizeof(TxBuffer)); //清空数组memset(InStr,0x00,sizeof(InStr)); //清空数组Uart1_Rx_Cnt = 0;n = 0;}while(HAL_OK != HAL_UART_Receive_IT(&huart2, (uint8_t *)&aRxBuffer, 1));   //开启接收中断,并保证开启成功}

实现效果如下:

如有问题或需求可私信交流

源码链接(标准库与HAL库):

(1条消息) STM32F103实现激光测距传感器测距WT-VL53L0L1-C文档类资源-CSDN文库
吾芯电子工作室


http://www.ppmy.cn/news/872393.html

相关文章

App逆向案例 X嘟牛 - Frida监听 WT-JS工具还原(一)

App逆向案例 X嘟牛 - Frida监听 & WT-JS工具还原&#xff08;一&#xff09; 提示&#xff1a;文章仅供参考&#xff0c;禁止用于非法途径&#xff1b; 文章目录 App逆向案例 X嘟牛 - Frida监听 & WT-JS工具还原&#xff08;一&#xff09;前言一、资源推荐二、App抓包…

Windows找不到文件wt.exe怎么办?

最近有不少小伙伴在使用电脑的时候&#xff0c;需要通过一些命令来调整电脑的相关内容&#xff0c;但是在打开Windows终端的时候却提示&#xff1a;Windows找不到文件wt.exe&#xff0c;请确定文件名是否正确后&#xff0c;再试一次&#xff0c;那么我们应该怎么解决这个问题呢…

【lesson 03】TiKV-持久化与读取

目录 一 TiKV架构和作用 二 数据持久化 1 RocksDB&#xff1a;写入 写入过程 第一步 &#xff1a;WAL 写日志 &#xff08;磁盘日志&#xff09; 第二步&#xff1a;写MemTable (内存中) 第三步 &#xff1a; 转存为immutable MemTable&#xff08;内存中&#xff09; …

WT语音芯片在智能语音感应洗手液机设计方案——WT588F02B-8S

基于WT588F02B语音芯片的智能语音感应洗手液器设计方案 随着人类文明的进步&#xff0c;人们对健康卫生越来越重视&#xff0c;特别是在当前新冠疫情的情景下&#xff0c;出门戴口罩&#xff0c;回家消毒洗手尤为重要&#xff0c;其中洗手已经成为人们日常生活中必不可少的一个…

oracle ohs是什么,OHS简单安装与系统配置

前言 OHS完整安装过程包括安装weblogic(用于展示OHS图形配置界面)、OHS、WebCache组件,安装完成后启动weblogic能够在em管理控制台中可视化的配置和控制OHS相关参数和操作,更加便于管理。 为了保障OHS服务器稳定、不受其他因素干扰,并且不需要上述weblog 前言 OHS完整安装过…

在计算机网中速率自动协商是什么意思,计算机网络_第3章习题解答

《计算机网络_第3章习题解答》由会员分享,可在线阅读,更多相关《计算机网络_第3章习题解答(7页珍藏版)》请在人人文库网上搜索。 1、第三章习题解答3.1 简述数据链路层的功能。答:数据链路层是在物理层提供的比特流传送服务的基础上,通过一系列的控制和管理,构成透明的、相…

WT588D使用记录

这里写目录标题 写在前面正文设备语音烧录嵌入式设备上的使用 写在最后 写在前面 WT588D在3年以前的一个比赛里曾经用过&#xff0c;但是当时自己并不是负责这一部分的人&#xff0c;所以也没有接触。但一直感觉应该挺简单的。 直到最近突然有一个项目需要用到&#xff0c;才买…

HUAWEI华为笔记本电脑Matebook X 2017款i5集显WT-W09原装出厂Windows10系统恢复原厂OEM系统

HUAWEI华为笔记本电脑Matebook X 2017款i5集显WT-W09原装出厂Windows10系统恢复原厂OEM系统 链接&#xff1a;https://pan.baidu.com/s/1h3TY-yiatNi0L1y3Vt_yEQ?pwd7igi 提取码&#xff1a;7igi