0

レジスタに書き込む前にブレークポイントが設定されている場合にのみ機能するアプリケーションがあります。特定の uC は Atmel SAMC21 であり、GCLK ペリフェラルへの書き込み時に問題が発生しているようです。GEN ビットを正しく書き込み、CHEN を設定してチャネルを有効にします。ブレークポイントを使用すると、正しく有効になります。ブレークポイントがないと、Atmel Studio IO デバッグ ウィンドウから観察したときにビットが設定されません。この特定のチャネルが接続されている CAN ペリフェラルは、ビットが設定されていない場合 (クロックされていないため) ハングしますが、ブレークポイントを設定してプログラムを続行できるようにすると正常に動作します。このビットが設定またはチェックされるコード内の他の場所はなく、マルチスレッドもありません。

問題のコード:

// PCHCTRL[26] GCLK_CAN0
GCLK->PCHCTRL[26].bit.GEN = 7;          // Generic clock generator 7
GCLK->PCHCTRL[26].bit.CHEN = 1;         // The peripheral channel is enabled.
GCLK->PCHCTRL[26].bit.WRTLOCK = 0;      // The peripheral channel and the associated generator registers are not locked.

PCCHCTRL:

union PCHCTRL {
    uint32_t reg;
    struct bit {
        uint32_t GEN:4;
        uint32_t :2;
        uint32_t CHEN:1;
        uint32_t WRTLOCK:1;
        uint32_t :24;
    } bit;
} PCHCTRL[41];

2 つの書き込みの間に遅延を挿入しようとしましたが、うまくいきませんでした。この問題の原因について、どんな助けも大歓迎です!

4

2 に答える 2

0

データシートをすばやくスキャンすると、これが明らかになります(強調は私のものです):

17.5.8. アクセス保護の登録

書き込みアクセスを持つすべてのレジスタは、オプションで Peripheral Access Controller (PAC) によって書き込み保護することができます。

注: オプションの書き込み保護は、レジスタの説明の「PAC 書き込み保護」プロパティによって示されます。

CPU がデバッグ モードで停止すると、すべての書き込み保護が自動的に無効になります。書き込み保護は、外部デバッガを介したアクセスには適用されません。

それから、起動コードまたはアプリケーションの他の部分が PAC を GCLK の書き込み保護に設定している可能性があるように思えます。

そうでなければ、これもあります:

17.6.3.1. 周辺クロックの有効化

ペリフェラル クロックを有効にする前に、ジェネレータの 1 つを有効にし (GENCTRLn.GENEN)、ペリフェラル チャネル制御レジスタ (PCHCTRL.GEN) のジェネレータ選択ビットを設定してペリフェラル チャネルのソースとして選択する必要があります。使用可能なジェネレーターは、各ペリフェラル チャネルのクロック ソースとして選択できます。

ジェネレータが選択されている場合、ペリフェラル チャネル制御レジスタのチャネル イネーブル ビットを PCHCTRLm.CHEN = 1 に設定することにより、ペリフェラル クロックが有効になります。PCHCTRLm.CHEN ビットは、汎用クロック ドメインに同期する必要があります。PCHCTRLm.CHEN は、同期が完了するまで、以前の状態として読み取り続けます。

これは、ジェネレーター自体が正しくセットアップおよび有効化されていない場合に、同様の現象が発生する可能性があることを示唆しています。

于 2016-03-13T14:15:12.410 に答える