超音波モジュールについての学習STM32 MCU(2)

コードを説明しました

#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ステートメントがダウンして実行されなかった一方でこれは、合理的な説明することができ

次はをご紹介し、シリアルポートのはextern構成と機能を説明し、マイクロコントローラの使用の概要ながら、

リリース元の2件の記事 ウォンの賞賛0 ビュー264

おすすめ

転載: blog.csdn.net/weixin_45749794/article/details/104651974