STM32上电后,用来测超声波的定时器的值一直卡在170不变,并且蜂鸣器也咯噔咯噔的响。求问朋友该如何解决?
超声波.c
#include "hcsr04.h"
#include "delay.h"
#include "stdio.h"
#include "timer.h"
#include "sys.h"
float distance; //定义非负整数变量。
void Hcsr04_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
EXTI_InitTypeDef EXTI_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP; //推挽输出
GPIO_InitStructure.GPIO_Pin=TRIG_PIN; //引脚PA0
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(TRIG_PORT,&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPD;
GPIO_InitStructure.GPIO_Pin=ECHO_PIN; //开启引脚PA1
GPIO_Init(ECHO_PORT,&GPIO_InitStructure);
EXTI_InitStructure.EXTI_Line=EXTI_Line1; //外部中断
EXTI_InitStructure.EXTI_LineCmd=ENABLE;
EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Rising;
EXTI_Init(&EXTI_InitStructure);
NVIC_InitStructure.NVIC_IRQChannel=EXTI1_IRQn;
NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority=3;
NVIC_Init(&NVIC_InitStructure);
}
void EXTI1_IRQHandler(void) //中断服务函数自己编写,里面写判断中断开启。
{
delay_us(10);
if(EXTI_GetITStatus(EXTI_Line1)!=RESET) //如果中断通道1,PA1-ECHO为高电平时那么开启中断
{
TIM_SetCounter(TIM2,0); //设置计数器从0开始计数
TIM_Cmd(TIM2,ENABLE); // 开启定时器2计数
while(GPIO_ReadInputDataBit(ECHO_PORT,ECHO_PIN)); //等待
TIM_Cmd(TIM2,DISABLE); //关掉计数器
distance=TIM_GetCounter(TIM2)*340/2; //计数器的值与超声波持续时间成比例,计算出距离的值,
EXTI_ClearITPendingBit(EXTI_Line1);
}
}
void Hcsr04_Start(void) //启动超声波
{
GPIO_SetBits(TRIG_PORT,TRIG_PIN);
delay_us(20);
GPIO_ResetBits(TRIG_PORT,TRIG_PIN);
}
定时器.c
#include "timer.h"
#include "sys.h"
void Time2_Init(void)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseInit_hcsr04;
// NVIC_InitTypeDef NVIC_TIM2_InitStrure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);
TIM_TimeBaseInit_hcsr04.TIM_ClockDivision=0;
TIM_TimeBaseInit_hcsr04.TIM_CounterMode=TIM_CounterMode_Up; //配置成向上计数模式
TIM_TimeBaseInit_hcsr04.TIM_Period=4999; //500ms一个周期。
TIM_TimeBaseInit_hcsr04.TIM_Prescaler=7199;
TIM_TimeBaseInit(TIM2,&TIM_TimeBaseInit_hcsr04);
// TIM_ITConfig(TIM2,TIM_IT_Update|TIM_IT_Trigger,ENABLE); //允许更新中断。
//
// NVIC_TIM2_InitStrure.NVIC_IRQChannel=TIM2_IRQn;
// NVIC_TIM2_InitStrure.NVIC_IRQChannelCmd=ENABLE;
// NVIC_TIM2_InitStrure.NVIC_IRQChannelPreemptionPriority=0;
// NVIC_TIM2_InitStrure.NVIC_IRQChannelSubPriority=0;
// NVIC_Init(&NVIC_TIM2_InitStrure);
}
//void TIM2_TRQHandler(void) //定时器中断服务函数
//{
// if(TIM_GetITStatus(TIM2,TIM_IT_Update)!=RESET)
// {
// TIM_ClearITPendingBit(TIM2,TIM_IT_Update); //清除中断标志位
// //定时器中断要执行的功能
// }
//}
```