代码讲解
#include "BSP_TIM.h"
extern uint16_t msHcCount = 0;
void TIM_NVIC_Config(void)
{
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
NVIC_InitStructure.NVIC_IRQChannel =TIM2_IRQn ;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority =0 ;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
void HYSRF05_Init(void)
{
TIM_TimeBaseInitTypeDef TIM_Init_structure;
GPIO_InitTypeDef GPIO_InitStructer;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB, ENABLE);
/*TRIG */
GPIO_InitStructer.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_InitStructer.GPIO_Mode=GPIO_Mode_Out_PP;
GPIO_InitStructer.GPIO_Pin=GPIO_Pin_10;
GPIO_Init(GPIOB, &GPIO_InitStructer);
/*ECOH */
GPIO_InitStructer.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_InitStructer.GPIO_Mode=GPIO_Mode_IN_FLOATING;
GPIO_InitStructer.GPIO_Pin=GPIO_Pin_11;
GPIO_Init(GPIOB, &GPIO_InitStructer);
TIM_Init_structure.TIM_Period=999;
TIM_Init_structure.TIM_Prescaler=71;
TIM_Init_structure.TIM_CounterMode=TIM_CounterMode_Up;
TIM_Init_structure.TIM_ClockDivision=TIM_CKD_DIV1;
TIM_Init_structure.TIM_RepetitionCounter=0;
TIM_TimeBaseInit(TIM2,&TIM_Init_structure);
TIM_ClearFlag(TIM2,TIM_FLAG_Update);
TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);
TIM_NVIC_Config();
TIM_Cmd(TIM2, DISABLE);
}
static void OpenTimerForHc(void)
{
TIM_SetCounter(TIM2,0);
msHcCount = 0;
TIM_Cmd(TIM2, ENABLE);
}
static void CloseTimerForHc(void)
{
TIM_Cmd(TIM2, DISABLE);
}
uint32_t GetEchoTimer(void)
{
u32 t1 = 0;
t1 = msHcCount*1000;
t1 += TIM_GetCounter(TIM2);
TIM2->CNT = 0;
Delay_Ms(50);
return t1;
}
float Hysrf05GetLength(void)
{
uint32_t t2 = 0;
uint32_t t = 0;
int i = 0;
float lengthTemp = 0;
float sum = 0;
while(i!=5){
GPIO_WriteBit(GPIOC,GPIO_Pin_6, Bit_SET);
Delay_Us(20);
GPIO_WriteBit(GPIOC,GPIO_Pin_6, Bit_RESET);
while(GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_7)==RESET);
OpenTimerForHc() ;
i++;
while(GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_7)==SET);
t = TIM_GetCounter(TIM2);
CloseTimerForHc();
t2=TIM_GetCounter(TIM2);
lengthTemp = ((float)t2/58);//cm
sum = lengthTemp + sum ;}
lengthTemp = sum/5.0;
return lengthTemp;
}
1、第一个extern uint16_t msHcCount ,extern这个关键词是代表声明 msHcCount 为一个全局变量,这个是代表定时器溢出的次数。我上一篇博客说明了定时器的时间的计算方法,既然有了定时器溢出的次数那肯定少不了定时器中断的配置和定时器的中断服务函数的配置。
中断服务函数
extern uint16_t msHcCount; void TIM2_IRQHandler(void) //TIM2 { if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET) //jian cha geng xin zhong duan fa sheng yu fou { TIM_ClearITPendingBit(TIM2, TIM_IT_Update ); // qing chu geng xin zhong duan biao zhi wei msHcCount++; } }
因为博主的这个文字注释我改了的话,有些程序就不能执行了,可能是我keil5软件有些问题。
2、关于代码有一个当初是困扰我好久的一个地方,不知道大家是怎么理解的。while(GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_7)==RESET); OpenTimerForHc() ; i=i+1; while(GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_7)==SET); CloseTimerForHc();
当时我在想为什么是等于0的时候开始打开定时器呢 不应该是等于SET开始打开定时器 然后RESET的时候关闭定时器
后来我特意去查了while语句的用法
当while语句是 while(条件);的这种情况的时候,第一个while后面加了分号; 代表空循环,实际上是检测是否为低电平,如果是,则一直处于循环。后面的也是一样
标题while(语句);就是语句为真后面的程序语句都不执行
这样就可以合理的解释了,不是SET第一条while语句根本不向下执行的