TFmini(TOF)在stm32上的应用

2020年10月5日更新

看大家都需要头文件,其实关于TOF的应用,你只需要通过串口助手将TFmini的参数配置好,具体的配置请参阅相关的参考手册。然后在单片机这边设置串口接收并处理即可。

头文件就是一些参数的定义

#ifndef _TFmini_h_
#define _TFmini_h_

#include "sys.h"	
#include "stdlib.h"
#include "delay.h"
#include "usart.h"

void uart3_init(u32 bound);

#define USART3_REC_LEN  	200  	//定义最大接收字节数 200
#define EN_USART3_RX 			1		//使能(1)/禁止(0)串口3接收

#define Data_Head         0X59   
#define Data_Length       9  

extern u8 USART3_RX_BUF[USART3_REC_LEN];
extern u16 USART3_RX_STA;

#endif






我只是一条分割线


使用TFmini是采用串口通信,与STM32F103ZET6通信,同时在LCD上显示。

通信协议使用出厂预设

TFmini数据输出使用标准数据输出格式

设置TFmini串口发送速率为20Hz(注意可使用串口工具修改TFmini参数,具体请参见对应操作手册)

在LCD上显示距离、强度、接收到的9bit数据以及接收速率。

注意:在本程序中使用标准库以及正点原子的LCD驱动程序

main.c

#include "delay.h"
#include "sys.h"
#include "lcd.h"
#include "led.h"
#include "usart.h"
#include "timer.h"
#include "TFmini.h"

u8 flag_REC = 0;
u8 text = 0;
u16 Distance = 0, Strength = 0;
u8 flag_1s = 0;
u8 count_REC = 0;

int main(void)
{	 
	u8 lcd_id[12];				//存放LCD ID字符串
	u8 i;
	delay_init();	    		//延时函数初始化	  
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);	 //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
	uart_init(115200);	 	//串口初始化为115200
	uart3_init(115200);		//串口3初始化为115200Baud
	TIM3_Int_Init(999, 71);		//定时器3定时1ms
	LCD_Init();
	LED_Init();
	POINT_COLOR=RED;
	sprintf((char*)lcd_id,"LCD ID:%04X",lcddev.id);//将LCD ID打印到lcd_id数组。 
	while(1) 
	{			
		POINT_COLOR=RED;	 	//设置显示文字颜色 
		LCD_ShowString( 30,  40, 210, 24, 24, "Xiaomo_haa"); 
		LCD_ShowString( 30,  70, 200, 16, 16, "TFmini TEST");
		LCD_ShowString( 30,  90, 200, 16, 16, lcd_id);				//显示LCD ID	 
		LCD_ShowString( 30, 110, 200, 16, 16, "2020.01.05 21:45:23");	  
		
		if(flag_REC == 1)
		{
			flag_REC = 0;
			LCD_ShowString( 30, 150, 200, 16, 16, "Distance:     cm");			//显示距离
			LCD_ShowNum(110, 150, Distance, 4, 16);
			LCD_ShowString( 30, 170, 200, 16, 16, "Strength:");						//显示强度
			LCD_ShowNum(110, 170, Strength, 4, 16);
			
			for(i = 0; i < 9; i++)
			{
				LCD_ShowNum(30 + i * 20, 200, (USART3_RX_BUF[i] >> 4), 1, 16);
				LCD_ShowNum(38 + i * 20, 200, (USART3_RX_BUF[i] & 0x0f), 1, 16);
			}
			LCD_ShowString( 30, 260, 200, 16, 16, "TFmini Test Successful !");
		}
		
		if(flag_1s == 1)
		{
			flag_1s = 0;
			LCD_ShowString( 30, 230, 200, 16, 16, "REC frequency:    Hz");						//显示接收频率
			LCD_ShowNum(140, 230, count_REC, 3, 16);
			count_REC = 0;
		}
	} 
}

使用串口3与TFmini通信。

注意:在串口3初始化时注意串口3时钟配置,串口3是挂载在 RCC_APB1 时钟树上

#include "TFmini.h"
#include "led.h"

#define USART3_REC_LEN  	200  	//定义最大接收字节数 200
#define EN_USART3_RX 		1		//使能(1)/禁止(0)串口3接收

#define Data_Head         0X59   
#define Data_Length       9  


#if EN_USART3_RX   //如果使能了接收 	
u8 USART3_RX_BUF[USART3_REC_LEN];     //接收缓冲,最大USART_REC_LEN个字节.
u16 USART3_RX_STA = 0;       //接收状态标记	 
  
//串口3初始化
void uart3_init(u32 bound)
{
  //GPIO端口设置
  GPIO_InitTypeDef GPIO_InitStructure;
	USART_InitTypeDef USART_InitStructure;
	NVIC_InitTypeDef NVIC_InitStructure;
	 
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3,ENABLE);

	//USART3_TX   GPIOB.10
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; //PB.10
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;	//复用推挽输出
  GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化GPIOB.10
   
  //USART3_RX	  GPIOB.11初始化
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;//PB.11
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入
  GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化GPIOB.11  

  //Usart1 NVIC 配置
  NVIC_InitStructure.NVIC_IRQChannel = USART3_IRQn;
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1 ;//抢占优先级1
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;		//子优先级3
	NVIC_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(USART3, &USART_InitStructure); 			//初始化串口3
  USART_ITConfig(USART3, USART_IT_RXNE, ENABLE);	//开启串口接收中断
  USART_Cmd(USART3, ENABLE);                    	//使能串口3
}

//串口3中断服务程序
void USART3_IRQHandler(void)
{
	static u8 flag_data = 0;
	static u8 index = 0;
	u16 CheckSum = 0;
	u8 i;
	
	LED0 = ~LED0;
	
	if(USART_GetITStatus(USART3, USART_IT_RXNE))//接收中断
	{				
		if(USART_ReceiveData(USART3) == Data_Head)
			flag_data = 1;
		
		if(flag_data)
		{
			USART3_RX_BUF[index ++] = USART_ReceiveData(USART3);
			
			//接收完毕进行数据校验
			if(index == Data_Length)
			{
				//如果第一位和第二位是0x59
				if((USART3_RX_BUF[0] == Data_Head) && (USART3_RX_BUF[1] == Data_Head))
				{
					//将接收到的数据累加
					for(i = 0; i < (Data_Length - 1); i ++)
					{
						CheckSum += USART3_RX_BUF[i];
					}
					//进行CheckSum校验
					if((CheckSum & 0x00ff) == USART3_RX_BUF[8])
					{
						//计算距离
						Distance = USART3_RX_BUF[2] + USART3_RX_BUF[3] * 256;
						//计算信号强度
						Strength = USART3_RX_BUF[4] + USART3_RX_BUF[5] * 256;
						//接收完成标志
						flag_REC = 1;
						count_REC ++;
					}
					index = 0;
					flag_data = 0;
				}
			}
		}
		USART_ClearITPendingBit(USART3, USART_IT_RXNE);
	}
}


#endif

 

 

 

 

 

 

 

 

 

 

  • 9
    点赞
  • 51
    收藏
    觉得还不错? 一键收藏
  • 16
    评论
评论 16
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值