[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;
}