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