天天看点

stm32超声波扫频_求解 stm32 超声波测距 没出数据

[C] 纯文本查看 复制代码// USART3_TX PB10 发送

// USART3_RX PB1 接受

#include "usart_csb.h"

u16 msHcCount = 0;

//串口和GPIO初始化

void Hcsr04Init(void)

{

GPIO_InitTypeDef GPIO_Inittest;

TIM_TimeBaseInitTypeDef TIM_TimeBaseInittest;

RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);

RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);

// IO初始化

GPIO_Inittest.GPIO_Pin = GPIO_Pin_10; //发送电平引脚

GPIO_Inittest.GPIO_OType = GPIO_OType_PP; //推挽输出

GPIO_Inittest.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_Init(GPIOB,&GPIO_Inittest);

GPIO_ResetBits(GPIOB,GPIO_Pin_10);

GPIO_Inittest.GPIO_Pin = GPIO_Pin_11; //返回电平引脚

GPIO_Inittest.GPIO_PuPd = GPIO_PuPd_NOPULL; //浮空输入

GPIO_Init(GPIOB,&GPIO_Inittest);

GPIO_ResetBits(GPIOB,GPIO_Pin_11);

//定时器TIM2初始化

TIM_DeInit(TIM2);

TIM_TimeBaseInittest.TIM_Period=999;//定时周期为1000

TIM_TimeBaseInittest.TIM_Prescaler=71; //分频系数72

TIM_TimeBaseInittest.TIM_ClockDivision=TIM_CKD_DIV1;//不分频

TIM_TimeBaseInittest.TIM_CounterMode=TIM_CounterMode_Up;

TIM_TimeBaseInit(TIM2,&TIM_TimeBaseInittest);

TIM_ClearFlag(TIM2,TIM_FLAG_Update);//清除更新中断

TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE); //打开定时器更新中断

hcsr04_NVIC();

TIM_Cmd(TIM2,DISABLE);//关闭定时器使能

}

//设置中断优先级

void hcsr04_NVIC(void)

{

NVIC_InitTypeDef NVIC_Inittest;

NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);

NVIC_Inittest.NVIC_IRQChannelPreemptionPriority=0;

NVIC_Inittest.NVIC_IRQChannelSubPriority=0;

NVIC_Inittest.NVIC_IRQChannel=TIM2_IRQn;

NVIC_Inittest.NVIC_IRQChannelCmd=ENABLE;

NVIC_Init(&NVIC_Inittest);

}

//中断

void TIM2_IRQHandler(void)

//中断,当回响信号很长是,计数值溢出后重复计数,用中断来保存溢出次数

{

if(TIM_GetITStatus(TIM2,TIM_IT_Update)!=RESET)

{

TIM_ClearITPendingBit(TIM2,TIM_IT_Update);//清除中断标志overcount++;

}

}

//获取定时器时间

int GetEchoTimer(void)

{

int t = 0;

t = msHcCount * 1000; //得到MS

t += TIM_GetCounter(TIM2); //得到

TIM2 -> CNT = 0; //将TIM2计数寄存器的计数值清零

delay_ms(50);

return t;

}

//得五次平均值

float Hcsr04GetLength(void)

{

u32 t = 0;

int i = 0;

float lengthTemp = 0;

float sum = 0;

while(i != 5)

{

TRIG_Send = 1; //发送口高电平输出

delay_us(20);

TRIG_Send = 0;

while (ECHO_Reci == 0); //等待接收口高电平输出

TIM_Cmd(TIM2,ENABLE); //打开定时器

i = i + 1;

while (ECHO_Reci == 1);

TIM_Cmd(TIM2,DISABLE); //关闭定时器

t = GetEchoTimer(); //获取时间,分辨率为1US

lengthTemp =((float )t / 58.0); //厘米

sum = lengthTemp + sum;

}

lengthTemp = sum / 5.0;

return lengthTemp;

}