2264552_ja-JP

取消
显示结果 
显示  仅  | 搜索替代 
您的意思是: 

2264552_ja-JP

2264552_ja-JP

FTM CnV 更新の問題

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();
        }
    }
}

Re: FTM CnV Update Problem

しかし、そのレジスタの左から3番目のバイト、つまりMSBにLDOKがあり、右から2番目のバイトにはLDOKがないので、これが唯一の可能性ですよね?

0x0020=LDOK、0x0001=CH0SEL

私の観点からするとそれは正しいのではないでしょうか

そして私の投稿に返信していただきありがとうございます🙇🏼‍ 

そして、私のこの疑問も明らかにしてください。

Re: FTM CnV Update ProblemCAN、PWMがどのように生成を開始するかの流れを説明してください。Re: FTM CnV Update Problem

こんにちは@Jana_muralidharan

ご投稿ありがとうございます。

FTMEN = 1 (すでに設定済み) の場合、FTM のメイン レジスタ (CnV、MOD、CNTIN などを含む) は書き込みバッファリングされ、実際のレジスタは同期/ロード イベント情報がトリガーされたときにのみ更新されます。それ以外の場合、新しい値はバッファに残り、チャネルは古い初期化された値を使い続けます。RMの説明をご覧ください:

Celeste_Liu_0-1766053059160.png

Celeste_Liu_1-1766053104360.png


Celeste_Liu_2-1766053261449.png

ロードを有効にするには、以下のコードを変更して LDOK=1 を設定してください。

            /* ARM reload for next PWM cycle */
            *(volatile __UINT32_TYPE__ *)0x4003A098 = 0x0201;//0x0200=LDOK, 0x0001=CH0SEL

Celeste_Liu_3-1766053941711.png


お役に立てれば幸いです。

BR

セレステ


----------------------------------------------------------------------------------------------------------------------------
注: この投稿が質問の答えである場合は、「解決策として承認」ボタンをクリックしてください。ありがとう!
----------------------------------------------------------------------------------------------------------------------------

Re: FTM CnV Update Problem

いいえ、あなたの理解は間違っています。テストをしてみました。結果をご覧ください:
1) 正しい0x02 0 0=LDOK の場合:

Celeste_Liu_0-1766139388647.png

2) 間違った0x0 0 2 0=LDOK:

Celeste_Liu_1-1766139442165.png


バイト順序とビット番号を混同しているようです。32 ビット レジスタの場合、ドキュメントではビットごとにフィールドを参照します (ビット 0 が最下位、ビット 31 が最上位)。LDOK = bit9 は、それがどのバイトにあるかとは関係ありません。

お役に立てれば幸いです。

BR

セレステ

 

Re: FTM CnV Update Problemご回答ありがとうございます。私はSOバカだと分かりました。どうもありがとうございます

しかし、組み込みライブラリのマスクを使用しましたが、それでも同じ問題が発生します。とにかく、すぐに対応していただきありがとうございます。
Re: FTM CnV Update Problem

この質問については、より深く理解するために当社のSDKデモのCANを参照してください。

ボードを選択 | MCUXpresso SDKs ビルダー

Celeste_Liu_0-1766140071913.png


BR

セレステ


标记 (1)
无评分
版本历史
最后更新:
‎12-20-2025 03:30 AM
更新人: