先写没问题用法,有问题的语法就不示范
void Sr04_Init(void){ GPIO_InitTypeDef GPIO_InitStruct; TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct; //打开GPIO组时钟 RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE); RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB,ENABLE); //1、能定时器时钟 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM6,ENABLE); GPIO_InitStruct.GPIO_Pin=GPIO_Pin_4; //引脚 GPIO_InitStruct.GPIO_Mode=GPIO_Mode_IN; //输入模式 GPIO_InitStruct.GPIO_OType=GPIO_OType_PP; //推挽 GPIO_InitStruct.GPIO_Speed=GPIO_Speed_25MHz; //速度 GPIO_InitStruct.GPIO_PuPd=GPIO_PuPd_UP; //上拉 GPIO_Init(GPIOA,&GPIO_InitStruct); GPIO_InitStruct.GPIO_Pin=GPIO_Pin_7; //引脚 GPIO_InitStruct.GPIO_Mode=GPIO_Mode_OUT; //输出模式 GPIO_InitStruct.GPIO_PuPd=GPIO_PuPd_UP; //上拉 GPIO_Init(GPIOB,&GPIO_InitStruct); TIM_TimeBaseInitStruct.TIM_Prescaler=84-1; // 84分频 84MHZ/84 = 1MHZ TIM_TimeBaseInitStruct.TIM_Period=50000-1; TIM_TimeBaseInitStruct.TIM_CounterMode=TIM_CounterMode_Up; // 向上计数 TIM_TimeBaseInitStruct.TIM_ClockDivision=TIM_CKD_DIV1; // 分频因子 //2、初始化定时器,配置ARR,PSC TIM_TimeBaseInit(TIM6,&TIM_TimeBaseInitStruct); //5,不使能定时器 TIM_Cmd(TIM6,DISABLE); } int Get_Sr04_Value(void){ int temp=0,dis=0,t=0; //PA2输出低电平 PBout(7)=0; delay_us(8); //PA2输出高电平 PBout(7)=1; delay_us(20); //PA2输出低电平 PBout(7)=0; //设置定时器的CNT为0 TIM6->CNT=0; //PA3等待高电平到来,参考按键松开代码 printf("Get_Sr04_Value 68\r\n"); while(PAin(4)==0){ } //使能定时器开始计数 TIM_Cmd(TIM6,ENABLE); printf("Get_Sr04_Value 77\r\n"); t=0; //PA3等待低电平到来, while(PAin(4)==1){ } printf("Get_Sr04_Value 84\r\n"); //获取定时器CNT值,从而得到高电平持续时间 temp=TIM6->CNT; //关闭定时器 TIM_Cmd(TIM6,DISABLE); //通过公式计算出超声波测量距离 dis=temp/58; return dis; }int main(void) { int dis = 0; //超声波测距 u16 static cnt1;if(cnt1++%(2*1000)==0)dis = Get_Sr04_Value();
}
超声波模块卡住在
等待高电平到来
现象1:一开始测距就卡
原因1.脚初始化模式不对
解法:一定要超声波trig脚连接的那个脚设置输出模式,超声波echo叫连的那个叫设置输入模式
现象2:第一次可以,后面才卡的
原因2:运行速度太快了,传输速度跟不上
解法2:循环中增加延时时间
标签:定时器,TIM6,STM32,TIM,TimeBaseInitStruct,模块,InitStruct,GPIO,超声波 From: https://www.cnblogs.com/xuweihui/p/18013313