レジスタに書き込む前にブレークポイントが設定されている場合にのみ機能するアプリケーションがあります。特定の 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 つの書き込みの間に遅延を挿入しようとしましたが、うまくいきませんでした。この問題の原因について、どんな助けも大歓迎です!