このドキュメントでは、MRT(Multi-rate Timer)モジュールを使用して遅延機能を実装する方法を示しており、遅延時間はプログラム可能です。MRTにはワンショットストールモードがあり、このモードでは、MRTチャネルカウンタがカウントダウンしている間、MRTチャネルカウンタがゼロに達するまでコアがストールします。
MRT チャネル カウンタが 0 に達すると、MRT チャネルはアイドル状態になり、コアは動作し続けます。
場合によっては、2つの命令間にプログラム可能な遅延があることが予想されます。
インストラクション1
遅延
インストラクション2
一般に、遅延機能は、コアに__asm ("NOP") 命令を実行させることで実装できます
このコードは次のようになります。
ボイド遅延(uint32_tインターバル)
{
Uint32_tカウンター;
Counter=ConvertTimeToCounter(インターバル);
For(uint32_t i=0; i
{
__asm(「NOP」といいます)
}
}
マクロ convertTimeToCounter は、時間をループ数に変換するために使用されます
LPCファミリのMRTモジュールは、テストがLPC55S69-EVKボードに基づいているため、ワンショットストールモードと呼ばれる独自の機能を提供しているため、セクション27.5.3を参照しましたUM11126.pdfでのワンショットストールモード。
MRTには外部パッドがありません。
ワンショットストールモード:
バスストールモードは、2つのソフトウェア制御の間に短い遅延が必要な場合に使用できます
イベント、またはソフトウェアを続行する前に遅延が予想される場合。このモードでは
MRT がカウントダウンしている間、バス トランザクションは発生せず、CPU コアは停止し、MRT カウンタが 0 に達するまで、その間に最小量の電力を消費します。したがって、MRTのワンショットストールモードは、MRTカウントダウンプロセス中にコアストールを引き起こす可能性があり、遅延機能を実装できます。
LPC55S69の場合、MRTモジュールのクロックソースはAHBバスクロックであり、これはコアクロックと同じです。
LPC55S69例では、コア クロックを設定するコードがあります
void BOARD_InitBootClocks(void)
{
BOARD_BootClockPLL150M();
}
したがって、MRTのクロック周波数は150MHzです。
遅延時間は時間ですが、MRTはカウンターなので、遅延時間をカウンター値に変換する必要があります。カウンタ値は MRT クロック周波数に依存します。MRT クロック ソースは AHB バス クロック、またはコア クロックです。
LPC55S69コアクロック周波数は150Mhzであるため、
#define MRT_CLOCK_FREQUENCY 150MHz帯
必要な遅延時間が 2 番目の単位で変数delay_time場合、必要な MRT カウンタ値は次のようになります
MRT カウンタ値 = delay_time/(MRT クロック サイクル時間)= delay_time* MRT_CLOCK_FREQUENCY。
たとえば、必要なdelay_timeが 1mS または 1*10**(-3) Second であると仮定すると、対応するカウンタ値は 1*(10**-3)*150*(10**6)=150 000 です
MRT 遅延時間の制限。
MRTカウンタレジスタは24ビットで、最大カウンタ値は2 ** 24 = 16,777,216で、最大遅延時間は16777216 /(150 * 10** 6)= 0.111848Sまたは111mSです。
MRT遅延機能のソースコードはSDKパッケージSDK_2_11_1_LPCXpresso55S69.zipに基づいており、ツールは MCUXpresso IDE v11.5.0 です。この例は LPC55S69-EVK で実行されます
この例では、MRTを使用して100mS(0.1秒)遅延し、遅延後にLEDが切り替わります
MRT カウンタ値は 0.1S*150*(10**6)=15 000 000 です。
mrt_init() api 関数 の場合 、MRT を初期化し、 OneShotStall モードで MRT channel0 を設定します。
コアがラインを実行すると、 MRT_StartTimer(MRT0、 kMRT_Channel_0、15000000);MRTのchannel0カウンタは15000000からカウントダウンし、カウントプロセス中にCortex-M33は失速します。カウンタが ZERO に達すると、コアはストール モードを終了し、次の行の実行を続行すると、MRT channel0 カウンタはアイドル モードになります。
/**
※@file LPC55S69_Project_mrt_stall.c
* @brief アプリケーションのエントリ ポイント。
*/
#include
#include 「ボード.h」
#include 「周辺機器.h」
#include 「pin_mux.h」
#include 「clock_config.h」
#include 「LPC55S69_cm33_core0.h」
#include 「fsl_debug_console.h」
#include 「fsl_mrt.h」
#include 「fsl_iocon.h」
/* TODO: ここに他のインクルードファイルを挿入します。*/
#define BOARD_LED_PORT BOARD_LED_BLUE_GPIO_PORT
#define BOARD_LED_PIN BOARD_LED_BLUE_GPIO_PIN
/* TODO: ここに他の定義と宣言を挿入します。*/
void mrt_init(void);
/*
* @brief アプリケーションのエントリ ポイント。
*/
int main(void) {
/* ボード ハードウェアを初期化 します。*/
BOARD_InitBootPins();
BOARD_InitBootClocks();
BOARD_InitBootPeripherals();
#ifndef BOARD_INIT_DEBUG_CONSOLE_PERIPHERAL
/* FSL デバッグ コンソール を初期化 します。*/
BOARD_InitDebugConsole();
#endif
mrt_init();
PRINTF("Hello World\n");
for(;;)
{
MRT_StartTimer(MRT0、 kMRT_Channel_0、15000000);
GPIO_PortToggle(GPIO、BOARD_LED_PORT、1U << BOARD_LED_PIN);
__asm ("nop");
}
/* カウンターを強制的にメモリに配置します。*/
volatile static int i = 0 ;
/* 無限ループに入り、カウンターをインクリメントするだけです。*/
一方(1) {
i ++の;
/* 'Dummy' NOP は、ソースレベルのシングルステップを許可します。
タイトなwhile()ループ */
__asm volatile ("nop");
}
return 0 ;
}
uint32_t mrt_clock;
mrt_config_t mrtConfig;
void mrt_init(void)
{
/* mrtConfig.enableMultiTask = false; */
MRT_GetDefaultConfig(&mrtConfig);
/* Init mrt module */
MRT_Init(MRT0, &mrtConfig);
/* チャンネル 0 を繰り返すように設定 */
MRT_SetupChannelMode(MRT0, kMRT_Channel_0, kMRT_OneShotStallMode);
//MRT_StartTimer(MRT0, kMRT_Channel_0, 15000000);
}
}
上記のコードが実行されている場合、ユーザーはLPC55S69-EVKボードの青色LEDのトグルを確認できます。LPC55S69-EVKにPIO1_4ピン信号(P18コネクタのピン5)を接続すると、PIO1_4信号のトグル周波数は5Hz、サイクルタイムは200mSなので、遅延は100mSです。