SO、データのビット値に基づいてCnVの値を変更しようとしました
しかし、出力は最初に書き込まれた値のまま変化しません
私はまだこのマイクロコントローラMKE02Z64VLC4を使い始めたばかりなので、
どのステップが間違っているのか分かりません。どの行が欠けているか教えてください。
#include "MKE02Z4.h"
#define FTM_MOD 24 // 25 ticks → 1.25us @ 20MHz
#define TICKS_0 7
#define TICKS_1 14
void FTM_Init(void)
{
SIM->SCGC |= SIM_SCGC_FTM2_MASK;
FTM2->MODE = FTM_MODE_WPDIS_MASK | FTM_MODE_FTMEN_MASK;
FTM2->CNTIN = 0;
FTM2->CNT = 0;
FTM2->MOD = FTM_MOD;
FTM2->CONTROLS[0].CnSC =
FTM_CnSC_MSB_MASK |
FTM_CnSC_ELSB_MASK;
FTM2->CONTROLS[0].CnV = TICKS_0;
/* ENABLE CHANNEL OUTPUT (CRITICAL) */
FTM2->OUTMASK &= ~(1 << 0);
/* Initial load */
*(volatile __UINT32_TYPE__ *)0x4003A098 = 0x0021;
FTM2->SC = FTM_SC_CLKS(1) | FTM_SC_PS(0);
*(volatile __UINT32_TYPE__ *)0x4003A064 = 0x00;
}
static inline void wait_ftm_period(void)
{
while(!(FTM2->SC & FTM_SC_TOF_MASK));
FTM2->SC &= ~FTM_SC_TOF_MASK;
}
uint32_t word = 0x5555;
int main(void)
{
FTM_Init();
while (1)
{
for(int i = 0; i < 16; i++)
{
if (word & (1UL << i))
*(volatile __UINT32_TYPE__ *)0x4003A010 = TICKS_1;
else
*(volatile __UINT32_TYPE__ *)0x4003A010 = TICKS_0;
/* ARM reload for next PWM cycle */
*(volatile __UINT32_TYPE__ *)0x4003A098 = 0x0021;
/* WAIT ONE PWM PERIOD */
wait_ftm_period();
}
}
}しかし、そのレジスタの左から3番目のバイト、つまりMSBにLDOKがあり、右から2番目のバイトにはLDOKがないので、これが唯一の可能性ですよね?
0x0020=LDOK、0x0001=CH0SEL
私の観点からするとそれは正しいのではないでしょうか
そして私の投稿に返信していただきありがとうございます🙇🏼
そして、私のこの疑問も明らかにしてください。
こんにちは@Jana_muralidharan 、
ご投稿ありがとうございます。
FTMEN = 1 (すでに設定済み) の場合、FTM のメイン レジスタ (CnV、MOD、CNTIN などを含む) は書き込みバッファリングされ、実際のレジスタは同期/ロード イベント情報がトリガーされたときにのみ更新されます。それ以外の場合、新しい値はバッファに残り、チャネルは古い初期化された値を使い続けます。RMの説明をご覧ください:
ロードを有効にするには、以下のコードを変更して LDOK=1 を設定してください。
/* ARM reload for next PWM cycle */
*(volatile __UINT32_TYPE__ *)0x4003A098 = 0x0201;//0x0200=LDOK, 0x0001=CH0SEL
お役に立てれば幸いです。
BR
セレステ
----------------------------------------------------------------------------------------------------------------------------
注: この投稿が質問の答えである場合は、「解決策として承認」ボタンをクリックしてください。ありがとう!
----------------------------------------------------------------------------------------------------------------------------
いいえ、あなたの理解は間違っています。テストをしてみました。結果をご覧ください:
1) 正しい0x02 0 0=LDOK の場合:
2) 間違った0x0 0 2 0=LDOK:
バイト順序とビット番号を混同しているようです。32 ビット レジスタの場合、ドキュメントではビットごとにフィールドを参照します (ビット 0 が最下位、ビット 31 が最上位)。LDOK = bit9 は、それがどのバイトにあるかとは関係ありません。
お役に立てれば幸いです。
BR
セレステ
この質問については、より深く理解するために当社のSDKデモのCANを参照してください。
BR
セレステ