MK66F microsecond timer or DWT

取消
显示结果 
显示  仅  | 搜索替代 
您的意思是: 
已解决

MK66F microsecond timer or DWT

跳至解决方案
882 次查看
aaronm
Contributor IV

µcontroller: MK66F.  SDK: 2.11.0.  MCUXpresso v11.9.0

I'm writing an app on the MK66F that uses an HC-SR04 and part of the process is to determine the delay from the echo signal.  I'm using an LPTMR instance to count how long it takes for a rising and falling interrupt to occur on the GPIO input pin.  That part all works.  But the delay between rising and falling, according the values I get from LPTMR_GetCurrentTimerCount( LPTMR0 ); can be too small to measure in integers: the difference between finish and start can come back as 0, so I'm thinking my timer is counting in milliseconds, instead of microseconds.  Depending on the distance, the echo delay can be less than a millisecond, and I need this resolution.

By default, the DWT register isn't available in this SDK.  Ok, no worries, but how do I get microsecond level in my LPTMR?

 LPTMR_GetDefaultConfig( &tmrConfig );
LPTMR_Init( LPTMR0, &tmrConfig );
LPTMR_SetTimerPeriod( LPTMR0, 0xFFFF );
LPTMR_StartTimer( LPTMR0 );

This is the code I'm using to configure and start the LPTMR instance.  Or do I implement SDK_DELAY_USE_DWT as a project define and use getCpuCycleCount()?

标记 (1)
0 项奖励
回复
1 解答
835 次查看
aaronm
Contributor IV

XiangJun, thank you for this insight.

My GPIO interrupt handler is already handling the rise and fall events on the input pin, so I didn't really want "capture" from from FlexTimer.  I looked through the Mbed OS code for the MK66F, and found that they use the Periodic Interrupt Timer (PIT) to generate a cycle count, and I was able to graft much of their code to mine - particularly the us_ticker_init() and pit_isr() routines from mbed-os/targets/TARGET_Freescale/TARGET_MCUXpresso_MCUS/TARGET_K66F/us_ticker.c - and it seems to work.  My GPIO handler will read the PIT_GetCurrentTimerCount() on signal rise, and then another count on signal fall so I can count microseconds.

But I thank you for pointing me in this direction.

Aaron

在原帖中查看解决方案

0 项奖励
回复
2 回复数
836 次查看
aaronm
Contributor IV

XiangJun, thank you for this insight.

My GPIO interrupt handler is already handling the rise and fall events on the input pin, so I didn't really want "capture" from from FlexTimer.  I looked through the Mbed OS code for the MK66F, and found that they use the Periodic Interrupt Timer (PIT) to generate a cycle count, and I was able to graft much of their code to mine - particularly the us_ticker_init() and pit_isr() routines from mbed-os/targets/TARGET_Freescale/TARGET_MCUXpresso_MCUS/TARGET_K66F/us_ticker.c - and it seems to work.  My GPIO handler will read the PIT_GetCurrentTimerCount() on signal rise, and then another count on signal fall so I can count microseconds.

But I thank you for pointing me in this direction.

Aaron

0 项奖励
回复
874 次查看
xiangjun_rong
NXP TechSupport
NXP TechSupport

Hi,

I have checked the LPTMR module of K66, it does not have capture function, so it is not suitable for your application.

I suggest you use TPM or FTM modules to test the signal duty cycle or cycle time. You can connect the tested signal to the TPM_CHx pin(capture signal), when the rising/falling edge of the capture signal is detected, the current counter value is loaded into _CnV register, and interrupt is fired. Secondly, the TPM and FTM have high driving clock, so you can get high resolution. The LPTMR module is designed to work in low power mode, so it's driving clock is lowerer than that of TPM/FTM, so resolution is lower, btw, it does not support capture function.

I suggest you download SDK from the link:

https://mcuxpresso.nxp.com/en/select

 

In the SDK, there is input_capture example, located at:

............\driver_examples\ftm\input_capture

Hope it can help you

BR

XiangJun Rong