私は現在、MCXN236VNLTというカスタム基板を開発中です。RTC0ペリフェラルを有効にすると、クロックを有効にしてからRTC0のレジスタにアクセスすると、MCUがハングアップし、Cycloneとの接続が失われます。clock_config.c以下のことを行います。
CLOCK_SetPLL0Freq(&pll0Setup); /*!< PLL0 を目的の値に設定します */
CLOCK_SetPll0MonitorMode( kSCG_Pll0MonitorDisable ); /* Pll0 モニターが無効になります */
CLOCK_SetupOsc32KClocking( kCLOCK_Osc32kToVbat ); /* OSC_32 kHz 出力クロックをVbatに有効にする */
vbat_osc_config_t g_vbatOscConfig_BOARD_BootClockPLL150M = {
.coarseAdjustment = kVBAT_OscCoarseAdjustment05 、
.enableInternalCapBank = true、
.enableCrystalOscillatorBypass = true、
.xtalCap = kVBAT_OscXtal12pFCap 、
.extalCap = kVBAT_OscExtal12pFCap 、
};
VBAT_SetOscConfig(VBAT0, &g_vbatOscConfig_BOARD_BootClockPLL150M);
SYSCON-> CLOCK_CTRL |= SYSCON_CLOCK_CTRL_FRO1MHZ_CLK_ENA_MASK; /*!< FRO_1M を有効にする */
CLOCK_EnableClock( kCLOCK_Rtc0 );
RTC0->CTRL |= RTC_CTRL_CLK_SEL_MASK; (ここでハングアップします!)
デバッガでその行をスキップすると、他のコードがRTC0上のレジスタにアクセスしようとするまで、MCUの起動が続行されます。
思いつく限りのことはすべて試してみました。SystickとMRTも優先度の高い割り込みで動作していますが、無効にしても、RTC0のクロックの問題だけのようです。
不思議なことに、MCUxpressoが接続を停止すると、「ADC0_IRQHandler() at 0x0」のタブが開き、「ADC0_IRQHandler() at 0x0 のソースが利用できません」と表示されます。
外部の32768水晶発振子を使用していますが、クロックを内部の16kに変更すると、コードの実行が少し進み、次のようになります。
status_t IRTC_Init ( RTC_Type *base, const irtc_config_t *config)
{
assert(NULL != config);
そして「主張」に失敗する。「config」は設定ファイルであって、NULLではないのに、どういうことでしょうか?うわぁ!
新鮮な視点やアイデアがあれば、ぜひお聞かせください!
こんにちは、 @jmullen_condose さん、
投稿ありがとうございます。ご指摘のとおり、 MCXN947で32kオシレータを使用してiRTCの初期化に失敗しました。この問題は、RTCの初期化とRTCレジスタへのアクセス前にクロックソースを提供する必要があることが原因です。
デフォルトでは、RTC CTRL[CLK_SEL]ビットフィールドはFRO16Kクロックソースを選択します。したがって、RTC CTRL[CLK_SEL]がOSC32Kクロックソースに切り替わるまで、FRO16Kクロックは有効のままにしておく必要があります。これが、RTCCLKSELクロックセレクタを正しく初期化する唯一の方法です。
さらに、MCXN236に関する内部チケットも作成します。恒久的な修正プログラムが利用可能になるまでは、その投稿に記載されている回避策をご参照ください。
お役に立てば幸いです。
BR
セレステ
こんにちは、 @jmullen_condose さん、
MCXN947に関する問題は、 @Celeste_Liuさんが指摘したように、既に報告されています。この問題は、Config Toolsの最新バージョン26.03において、MCXN236 MCUについても修正されています。FRO16Kが無効化され、 RTC0->CTRLレジスタにアクセスされた際に提供される以下のコードを参照してください。
このユースケースに適した初期化コードを提供する、最新バージョンのConfig Tools 26.03を使用してください。
よろしくお願いいたします。
マレク・ノイジル