[RTD400 MCAL 3] K312 MCUクロックシステム構成
【RTD400 MCAL 3】K312 MCUクロックシステム構成
1. アブストラクト
本ドキュメントでは、K3チップMCALのMCUでクロックシステムを構成する方法について説明します。この話題は以前LLDを行っていたときにはいつも軽視されがちでした。というのも、K3のクロックシステムは非常に単純で、内部高速・低速クロックソース、外部高速・低速クロックソース、PLL逓倍率、そして各種コア周辺モジュールで共有するだけだからです。K3のRMでは、規則を枠組み化するためにいくつかの選択肢まで用意されています。LLDの観点、特にS32DS CT設定の観点から見ると、さらに簡潔かつ明瞭です。以下にCTの図を示します。
図1
図2
このようなクロックシステムを使用すると、数回タップして入力するだけでコードを生成できます。しかし、LLD は自由すぎるため、MCAL では問題が発生することがよくあります。そこで、私はこの MCAL MCU のクロックシステム全体を理解するために時間を費やすことにしました。この記事では、K312を例として説明します。他のK3シリーズも似ています。
2. クロックシステムの理論と構成
2.1 K312クロックシステム
RMのクロック章を参照すると、システム全体のブロック図を確認できます。
図3
このブロック図は各部の状況を明確に示しています。クロックソースは4つあります。
内部高速クロック FIRC:48MHz、±5% 誤差、最大起動時間 25μs
内部低速クロック SIRC: 32KHz、±10% 誤差、最大起動時間 3ms
外部高速クロックFXOSC:8~40MHz、起動安定化時間はFXOSC_CTRL[EOCV] × 128
外部低速クロックSXOSC:32.768KHz、起動安定時間SXOSC_CTRL[EOCV]×128
One PLL: input 8-40MHZ, VOC output 640M-1280Mhz, PLL_PHIn_CLK output 25-480MHz.
MUX_0: Output CORE_CLK, AIPS_PLAT_CLK, AIPS_SLOW_CLK, HSE_CLK, DCM_CLK
MUX_1: システムタイマSTM0_CLK出力
MUX_3: FLEXCAN0-2クロックを出力
MUX_4: FLEXCAN3-5クロック出力
MUX_5: CLKOUT_STANDBY出力
MUX_6: 出力 CLKOUT_RUN
MUX_11: 出力 TRACE_CLK
RTC_CLK: RTC クロック
2.1.1PLL
PLLの観点では、逓倍率がどの値に関係しているかを知る必要があり、次の式で計算できます。
図4
整数の場合、上図の赤枠で示された方法が一般的であり、この記事でもその方法を使用して設定します。
PLL_PHIは最終的にPLLから出力されるクロックで、他のMUXで選択するために対応するMCへ供給されます。
2.1.2MUX_0システム
詳細なMUX_0システムはRMから確認できます。
図5
ご覧のとおり、MUX_0のクロックソースはPLLまたは内部FIRCの2種類です。
その後、コアクロックは後で生成できます。AIPS_PLAT_CLK、AIPS_SLOW_CLK、HSE_CLK、DCM_CLK。
では、生成されるクロックの具体的な周波数はいくつでしょうか。原則として各モジュールに対応する最大クロックを満たせますが、K3シリーズはさらにいくつかのオプション推奨を提示しています。例えばK312ではRUN時にオプションBモードの使用が推奨されており、とりわけHSEクロックは通常、このオプション推奨を厳格に満たす必要があります。
2.1.3MUX_6クロック出力
チップ内の該当クロック状況を確認するために、CLKOUTピン経由で対応クロックを出力できます。CLKOUTピンは複数のクロックソース選択に対応しています。具体的な状況は以下のとおりです。
図6
図中の黄色で示した内容がK312のCLKOUT_RUNでサポートされるものです。クロック構成後、対応するクロックを選択して出力が設定と一致しているかをテストします。
2.1.4option B推奨ソリューション
本記事では、K312でoption BのクロックをEB上で構成します。
図7
2.2 EB設定
まず、新しいK312 EBプロジェクトを作成します。具体的な作成方法については前回の記事を参照してください。
[S32K3 Tools Part] RTDの既存MCALデモを他のK3チップへ移植する方法
本記事では、RTD400 MCALに基づくMCUモジュールに対応するクロック構成に焦点を当てます。MCUを構成するには、参考資料として次の2つのドキュメントを参照する必要があります:
C:\NXP\SW32K3_S32M27x_RTD_R21-11_4.0.0\eclipse\plugins\Mcu_TS_T40D34M40I0R0\doc:RTD_MCU_UM.pdfとRTD_MCU_IM.pdf
設定方法が分からない場合は、ドキュメントで推奨されるデフォルト値に従うだけで問題ありません。
次の図はMCUの概要を示します。主に構成するモジュールは次の3つのコンポーネントです。
全般、McuClockSettingConfig、McuModeSettingConf
図8
2.2.1 一般設定
図8に加えて、内部および外部の高速・低速クロック制御とPLL制御を有効にし、対応するAPIおよび水晶発振器周波数を追加する必要があります。これを有効にしないと、その後の対応する設定を行うことができません。
図9
2.2.2 McuClockSettingConfig 構成
ここはMCUクロック設定の中核部分で、クロックソース、PLL、各種MUX条件を含みます。
まず、クロック構成を追加する必要があります。
図10
クリックすると詳細設定が表示されます。
図11
全部で17項目あります。オプション1と6はデフォルト設定のままで構いません。ボードに外部スロークロック水晶発振器5が接続されていないため、これは設定しません。残りは実際の状況に応じて設定してください。以下で順に説明します。
2.2.2.1 McuFIRC構成
内部高速クロック、48MHz:
図12
2.2.2.2 McuSIRC構成
内部スロークロック32kHz
図 13
2.2.2.3 McuFXOSC 構成
外部水晶発振器16MHzは、実際の接続状況に応じて入力してください。
図 14
2.2.2.4 McuCgm0ClockMux0 構成
Mux0の設定では、コアクロック、AIPS_PLAT_CLK、AIPS_SLOW_CLK、HSE、DCM_CLKを構成し、option Bの要件を満たすようにし、クロックはPLL_PHI0_CLKから供給されます。実際に設定する際は、まずPLLクロックを設定して正しいPLL_PHI0_CLKおよびPLL_PHI1_CLKを出力させます。
図15
2.2.2.5 McuCgm0ClockMux1 構成
図 16
必要なモジュールのクロックソースに応じて設定できます。
2.2.2.6 McuCgm0ClockMux3 構成
FLEXCAN0〜2モジュールのクロックソースを設定します。
図17
2.2.2.7 McuCgm0ClockMux4 構成
FLEXCAN3〜5モジュールのクロックソースを設定します。
図18
2.2.2.8 McuCgm0ClockMux5 構成
CLKOUT_STANBYモジュールのクロックソースを設定します。
図 19
2.2.2.9 McuCgm0ClockMux6 構成
CLKOUT_RUNモジュールのクロックソースを設定します。
図20
2.2.2.10 McuCgm0ClockMux11 構成
TRACE_CLKモジュールのクロックソースを設定します。
図21
2.2.2.11 McuRtcClockSelect設定
RTCモジュールのクロックソースを設定します。
図 22
2.2.2.12 McuPLL構成
PLLモジュールのクロックソースを設定します。
図23
2.2.2.13 McuClockReferencePoint 構成
周辺モジュールの基準クロックおよびクロックソース選択インターフェースを設定します。
図24
これでクロック設定は完了です。
検証のためには、CLKOUT_RUN 出力を使用して、対応するクロックをピン PTD10 に出力して確認することができます。
2.2.3 McuModeSettingConf 構成
McuのMcuModeSettingConf→McuPeripheralで、使用したいペリフェラルを有効にする必要があります。
図25
2.2.4 PORT構成
内部クロックをCLKOUT_RUNに出力する必要があるため、K312のPTD10 MSCR106をチェックし、以下のようにPORTピンを追加します。
図26
3. テスト結果
次に、S32K312-EVBボード上でEBのCLKOUT_RUNのクロックソースを変更し、クロックが設定に一致するかをテストします。
一般的に使用されるMCU関連ドライバは次のとおりです。
図27
システム起動時のMCU初期化の呼び出し順序は以下のとおりです。
1). Mcu_Init()
2). Mcu_InitClock()
3)Mcu_GetPllStatus() ‒ PLLがロックするまで
4). Mcu_DistributePllClock()
5). Mcu_SetMode()
6). Mcu_InitRamSection() - 必要な場合
対応するmainコードは次のとおりです。
#include "Mcu.h"
#include "Mcu_Cfg.h"
#include "Port.h"
#include "Dio.h"
#include "Port_Cfg.h"
#include "Platform.h"
void TestDelay(uint32 delay);
void TestDelay(uint32 delay)
{
static volatile uint32 DelayTimer = 0;
while(DelayTimer < delay)
{
DelayTimer++;
}
DelayTimer = 0;
}
/**
* @brief Main function of the example
* @details Initialize the used drivers and uses the Icu
* and Dio drivers to toggle a LED on a push button
*/
int main(void)
{
uint8 count = 0U;
uint8 u8TimeOut = 100U;
/* Initialize the Mcu driver */
#if (MCU_PRECOMPILE_SUPPORT == STD_ON)
Mcu_Init(NULL_PTR);
#elif (MCU_PRECOMPILE_SUPPORT == STD_OFF)
Mcu_Init(&Mcu_Config_VS_0);
#endif /* (MCU_PRECOMPILE_SUPPORT == STD_ON) */
/* Initialize the clock tree and apply PLL as system clock */
Mcu_InitClock(McuClockSettingConfig_0);
#if (MCU_NO_PLL == STD_OFF)
while ( MCU_PLL_LOCKED != Mcu_GetPllStatus() )
{
}
Mcu_DistributePllClock();
#endif
/* Apply a mode configuration */
Mcu_SetMode(McuModeSettingConf_0);
/* Initialize all pins using the Port driver */
Port_Init(NULL_PTR);
/* Initialize Platform driver */
Platform_Init(NULL_PTR);
while (count++ < 10)
{
Dio_WriteChannel(DioConf_DioChannel_Digital_Output_LED_Q172, STD_HIGH);
Dio_WriteChannel(DioConf_DioChannel_Digital_Output_LED_Q257, STD_HIGH);
TestDelay(5000000);
Dio_WriteChannel(DioConf_DioChannel_Digital_Output_LED_Q172, STD_LOW);
Dio_WriteChannel(DioConf_DioChannel_Digital_Output_LED_Q257, STD_LOW);
TestDelay(5000000);
}
// Exit_Example(TRUE);
return (0U);
}
#ifdef __cplusplus
}
#endif
3.1 CLKOUT FIRC_CLK DIV2
図28
FIRC の元の 48Mhz クロックが 2 で分周され、24Mhz のクロック波形が得られることが確認でき、これは正しいです!
3.2 CLKOUT SIRC_CLK DIV2
図29
SIRCの元の32kHzクロックが2分周され、16kHzのクロック波形が得られていることが確認でき、正しいことが分かります。
3.3 CLKOUT FXOSC_CLK DIV10
図30
FXOSCの元の16MHzクロックは10で分割され、1.6MHzのクロック波形が得られることがわかります。
3.4 CLKOUT PLLPH0 CLK DIV10
図31
PLLPH0 の元の 120MHz クロックが 10 で分割され、12MHz のクロック波形が得られ、正しいことが確認できます。
3.5 CLKOUT コア CLK DIV10
図32
COREの元の120MHzクロックが10分周され、12MHzのクロック波形が得られていることが確認でき、正しいことが分かります。
3.6 CLKOUT PLLPH1 CLK DIV4
図33
PLLPH1の元の48MHzクロックが4分周され、12MHzのクロック波形が得られていることが確認できます。
3.7 CLKOUT HSE CLK DIV10
図 34
HSEの元の60Mhzクロックが10で分周され、6Mhzのクロック波形が得られていることが確認でき、正しいです。
3.8 CLKOUT AIPS_PLAT CLK DIV10
図 35
AIPS_PLAT_CLKの元の60MHzクロックが10分周され、6MHzのクロック波形が得られていることが確認でき、正しいことが分かります。
3.9 CLKOUT AIPS_SLOW CLK DIV10
図 36
AIPS_SLOW_CLKの元の30MHzクロックが10分周され、3MHzのクロック波形が得られていることが確認でき、正しいことが分かります。
View full article