コードを説明しました
#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();
それは、タイマーを回すために始めたときにタイマーがオフになると開き始め、タイマーのSETとRESETと等しくなるべきではありません0に等しい、なぜ私は思っていた
し、私が意図的に文の間、使用状況を確認するために行ってきました
(条件)しながら、while文があるとき。ときにこのような場合、最初のセミコロンながら加えた後(;)アイドルループの代表的な、実際に検出された場合に低い、そうであれば、循環していました。同じことが、バックの真実であります
タイトルしばらく(ステートメント)は、プログラム文が実行されていないの後ろにその文が真であります
ない最初のSETステートメントがダウンして実行されなかった一方でこれは、合理的な説明することができ