2017-04-08 9 views
0

GPIOピンの立ち上がりエッジでタイマをインクリメントする必要があります。私はちょうどそれを行うコード例を見つけることができません。STM32F411Eで汎用タイマをカウンタモードに設定するにはどうすればよいですか?

私はセンサーに近づいてくる磁石を感知するデジタルホールセンサーを持っていて、センサーの周りに何回マグネットが来たかを数えたいと思います。マグネットが回っているとき、センサーは正のパルスを出します。このパルスを使用してカウンタの値を増やしたい。

私はタイマーを基本的なアップカウントモード(内部クロックあり)に設定する方法を知っています。

TIM_TimeBaseInitTypeDef TIM_BaseStruct; 
/* Configure TIMER4*/ 
TIM_BaseStruct.TIM_Prescaler = 40000; 
TIM_BaseStruct.TIM_CounterMode = TIM_CounterMode_Up; 
TIM_BaseStruct.TIM_Period = 500; 
TIM_BaseStruct.TIM_ClockDivision = TIM_CKD_DIV1; 
TIM_BaseStruct.TIM_RepetitionCounter = 0; 
TIM_TimeBaseInit(TIM4, &TIM_BaseStruct); 
TIM_Cmd(TIM4, ENABLE); 

そして、これは動作しますが、私は外部信号にクロックを切り替える必要があります。それ、どうやったら出来るの?


EDIT

(私はHALライブラリを使用していない)私が使用しているライブラリで定義された関数を使用してギョーム・ミシェルの答えからコードを書き換えた後、私はコード

TIM_TimeBaseInitTypeDef timer4; 
timer4.TIM_Prescaler=0; 
timer4.TIM_CounterMode=TIM_CounterMode_Up; 
timer4.TIM_Period=5; 
timer4.TIM_ClockDivision=TIM_CKD_DIV1; 
TIM_TimeBaseInit(TIM4,&timer4); 

TIM_ETRClockMode2Config(TIM4,TIM_ExtTRGPSC_DIV2,TIM_ExtTRGPolarity_NonInverted, 0); 

TIM_SelectSlaveMode(TIM4,TIM_SlaveMode_Reset); 
TIM_SelectMasterSlaveMode(TIM4, TIM_MasterSlaveMode_Disable); 

RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE); 

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; 
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; 
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13; 
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; 
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; 
GPIO_PinAFConfig(GPIOD,GPIO_Pin_13,GPIO_AF_TIM4); 
GPIO_Init(GPIOD, &GPIO_InitStructure); 
を思い付い

これはコンパイル可能ですが、動作しないコードです。私はタイマーの周期を5に設定し、タイマーがすべてカウントアップするたびにLEDをトグルするように割り込みを設定しますが、センサーの回りに何回も磁石を動かしてもLEDは点灯しません。目に見える間違いがありますか?それを機能させるために私は何ができますか?

答えて

1

ホールセンサの出力をSTM32F411のGPIOに接続し、このGPIOをタイマーのクロックとして設定できます。

TIM_HandleTypeDef htim4; 
TIM_ClockConfigTypeDef sClockSourceConfig; 
TIM_MasterConfigTypeDef sMasterConfig; 

htim4.Instance = TIM4; 
htim4.Init.Prescaler = 0; 
htim4.Init.CounterMode = TIM_COUNTERMODE_UP; 
htim4.Init.Period = 65535; 
htim4.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; 
HAL_TIM_Base_Init(&htim4); 

sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_ETRMODE2; 
sClockSourceConfig.ClockPolarity = TIM_CLOCKPOLARITY_NONINVERTED; 
sClockSourceConfig.ClockPrescaler = TIM_CLOCKPRESCALER_DIV1; 
sClockSourceConfig.ClockFilter = 0; 
HAL_TIM_ConfigClockSource(&htim4, &sClockSourceConfig); 

sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET; 
sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE; 
HAL_TIMEx_MasterConfigSynchronization(&htim4, &sMasterConfig); 

GPIOは、このように設定されています:

//Set PE0 as TIM4_ETR 
__HAL_RCC_GPIOE_CLK_ENABLE(); 
GPIO_InitTypeDef GPIO_InitStruct; 
GPIO_InitStruct.Pin = GPIO_PIN_0; 
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; 
GPIO_InitStruct.Pull = GPIO_NOPULL; 
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; 
GPIO_InitStruct.Alternate = GPIO_AF2_TIM4; 
HAL_GPIO_Init(GPIOE, &GPIO_InitStruct); 
+0

私は私がクロックとして使用することをwan't特定のピンを伝える方法をコードで見ることができないこれは、のようになります。 。あなたは、その地域についていくつかの説明をしてください。どうもありがとうございました。 – user50222

+1

IOを設定するコードを追加しました。 PE0はタイマの外部クロックです。 –

+0

ありがとうございます。私はHALライブラリを使用することはできませんので、私はあなたのコードを取り、私が使用するライブラリから定義を使用しようとしました(私は標準stm32f4xxライブラリと思いますか?まだ動作していません。私は質問を更新しました。 – user50222

関連する問題