#include "fsl_debug_console.h"
#include "board.h"
#include "app.h"
#include "fsl_tpm.h"
#include "fsl_rgpio.h"
#include "fsl_lpuart.h"
/****************************************************************************************
* 定義
**********************************************************************************/
/****************************************************************************************
* プロトタイプ
**********************************************************************************/
/****************************************************************************************
* 変数
**********************************************************************************/
揮発性ブールtpmIsrFlag = false ;
揮発性uint32_t立ち上がり時間 = 0 ;
揮発性uint32_t落下時間 = 0 ;
揮発性ブールgotRisingEdge = false ;
/****************************************************************************************
* コード
**********************************************************************************/
void Init_LPUART( void )
{
lpuart_config_t 設定;
/* デフォルトの UART 設定を取得します (8N1、パリティなし、フロー制御なし) */
LPUART_GetDefaultConfig(&config);
/* 必要に応じてパラメータを変更します */
config.baudRate_Bps = 115200U ;
config.enableTx = true ;
config.enableRx = true ;
/* 指定されたパラメータでUARTを初期化します */
LPUART_Init( BOARD_LPUART 、&config、 BOARD_LPUART_CLK_FREQ );
}
float CalculateDistance( void )
{
uint32_tティック;
下降時間 >= 上昇時間の場合
ticks = 下降時間 - 上昇時間;
それ以外
ticks = ( TPM_MAX_COUNTER_VALUE ( DEMO_TPM_BASEADDR ) - risingTime) + fallsTime; /* オーバーフロー処理 */
float tpmClk = CLOCK_GetIpFreq( LPTPM_CLOCK_ROOT ); /* TPMクロックに調整できます */
float timeUs = (ティック * 1.0f / tpmClk) * 1e6 ;
PRINTF ( "TPM クロック: %.2f\r\n" ,tpmClk);
浮動小数点距離Cm = timeUs / 58.0f ;
distanceCmを返します。
}
voidセットアップ( void )
{
rgpio_pin_config_t out_config ={
kRGPIO_デジタル出力、
0 ,
};
/* トリガーピン */
RGPIO_PinInit( BOARD_RGPIO 、 TRIG_PIN 、 &out_config);
RGPIO_PinWrite( BOARD_RGPIO , TRIG_PIN , 0 );
}
void SendTrigPulse( void )
{
RGPIO_PinWrite( BOARD_RGPIO 、 TRIG_PIN 、 1 );
SDK_DelayAtLeastUs( 10 , SystemCoreClock);
RGPIO_PinWrite( BOARD_RGPIO , TRIG_PIN , 0 );
}
void TPM_INPUT_CAPTURE_HANDLER ( void )
{
uint32_tステータス = TPM_GetStatusFlags( DEMO_TPM_BASEADDR );
if (ステータス & TPM_CHANNEL_FLAG )
{
uint32_tキャプチャされた値 = TPM_GetChannelValue( DEMO_TPM_BASEADDR 、 BOARD_TPM_INPUT_CAPTURE_CHANNEL );
if (!gotRisingEdge)
{
立ち上がり時間 = キャプチャされた値;
gotRisingEdge = true ;
// 立ち下がりエッジ検出に切り替える
TPM_SetupInputCapture( DEMO_TPM_BASEADDR 、 BOARD_TPM_INPUT_CAPTURE_CHANNEL 、 kTPM_FallingEdge );
}
それ以外
{
落下時間 = キャプチャされた値;
tpmIsrFlag = true ;
gotRisingEdge = false ;
// 次の測定では立ち上がりエッジ検出に戻る
TPM_SetupInputCapture( DEMO_TPM_BASEADDR 、 BOARD_TPM_INPUT_CAPTURE_CHANNEL 、 kTPM_RisingEdge );
}
// このチャネルの割り込みフラグをクリアする
TPM_ClearStatusFlags( DEMO_TPM_BASEADDR 、 TPM_CHANNEL_FLAG );
}
SDK_ISR_EXIT_BARRIER ;
// tpmIsrFlag = true;
// /* 割り込みフラグをクリアします。*/
// TPM_ClearStatusFlags(DEMO_TPM_BASEADDR、TPM_CHANNEL_FLAG);
// SDK_ISR_EXIT_BARRIER;
}
/*!
* @briefメイン関数
*/
int main( void )
{
tpm_config_t tpmInfo;
/* ボードピン、クロック、デバッグコンソールの初期化 */
BOARD_InitHardware();
SetUp(); /* GPIO をセットアップする */
// Init_LPUART(); /* もう1つのUARTを初期化します */
/* 端末にメモを印刷する */
PRINTF ( "\r\nTPM入力キャプチャの例\r\n" );
PRINTF ( "\r\n入力信号が受信されると、入力キャプチャ値が出力されます\r\n" );
TPM_GetDefaultConfig(&tpmInfo);
/* TPMモジュールを初期化する */
TPM_Init( DEMO_TPM_BASEADDR , &tpmInfo);
/* TPMチャネルで入力キャプチャを設定する */
TPM_SetupInputCapture( DEMO_TPM_BASEADDR 、 BOARD_TPM_INPUT_CAPTURE_CHANNEL 、 kTPM_RisingEdge );
/* タイマーをフリーランニングモードに設定する */
TPM_SetTimerPeriod( DEMO_TPM_BASEADDR , TPM_MAX_COUNTER_VALUE ( DEMO_TPM_BASEADDR ));
/* 2番目のエッジが検出されたときにチャネル割り込みを有効にする */
TPM_EnableInterrupts( DEMO_TPM_BASEADDR 、 TPM_CHANNEL_INTERRUPT_ENABLE );
/* NVIC で有効にする */
EnableIRQ( TPM_INTERRUPT_NUMBER );
TPM_StartTimer( DEMO_TPM_BASEADDR , kTPM_SystemClock );
一方( 1 )
{
tpmIsrFlag = false ;
送信トリガパルス();
while (!tpmIsrFlag)
{
__NOP (); // キャプチャを待つ
}
フロート距離 = CalculateDistance();
PRINTF ( "上昇時刻: %u\r\n" ,上昇時刻);
PRINTF ( "落下時間: %u\r\n" ,落下時間);
PRINTF ( "距離: %.2f cm\r\n" , 距離);
SDK_DelayAtLeastUs( 60000 ,SystemCoreClock);
}
}