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