まずはクロックの設定を確認、ということで、clock周りのレジスタを表示させてみた。自分のテストプログラムはクロック設定は何もせず、StartUP(asm)からmainが呼ばれるだけの実装。clock controllerは初期設定(RC oscillator)で動ているはずなんだが、、
#define CLOCK_BASE (unsigned int *)0x40000000
void show_clock_stat(void)
{
printf("----------------------------------\n");
printf("HFCLKSTARTED %x\n",*(CLOCK_BASE+0x100));
printf("LFCLKSTARTED %x\n",*(CLOCK_BASE+0x104));
printf("DONE %x\n",*(CLOCK_BASE+0x10C));
printf("CTTO %x\n",*(CLOCK_BASE+0x110));
printf("INTENSET %x\n",*(CLOCK_BASE+0x304));
printf("INTENCLR %x\n",*(CLOCK_BASE+0x308));
printf("HFCLKRUN %x\n",*(CLOCK_BASE+0x408));
printf("HFCLKSTAT %x\n",*(CLOCK_BASE+0x40C));
printf("LFCLKRUN %x\n",*(CLOCK_BASE+0x414));
printf("LFCLKSTAT %x\n",*(CLOCK_BASE+0x418));
printf("LFCLKSRCCOPY %x\n",*(CLOCK_BASE+0x41C));
printf("LFCLKSRC %x\n",*(CLOCK_BASE+0x518));
printf("CTIV %x\n",*(CLOCK_BASE+0x538));
printf("XTALFREQ %x\n",*(CLOCK_BASE+0x550));
printf("----------------------------------\n");
}実行させると以下。なぜRUNとかのステータスフラグ(HFCLKSTAT)が0のままなのか??
---------------------------------- HFCLKSTARTED 4 LFCLKSTARTED 0 DONE 0 CTTO 0 INTENSET 0 INTENCLR 0 HFCLKRUN 0 HFCLKSTAT 0 LFCLKRUN 0 LFCLKSTAT 0 LFCLKSRCCOPY 0 LFCLKSRC 0 CTIV 0 XTALFREQ 0 ----------------------------------
初期設定である、RC oscillatorで動作している間はHFCLKSTASTは変化しないのか??
ググって見つけたクロックの切り替え方(内部オッシレータから外付けXtalへの切り替え)
NRF_CLOCK->EVENTS_HFCLKSTARTED = 0;
NRF_CLOCK->TASKS_HFCLKSTART = 1;
while(NRF_CLOCK->EVENTS_HFCLKSTARTED == 0)
{
}https://devzone.nordicsemi.com/f/nordic-q-a/20628/using-external-16mhz-help-with-code/80401#80401
■追記
このサンプル(自分が作ったコード)は決定的な間違いを犯していて、ポインタに加算するのはいいけど、0x40000000の定数は宣言により、int型ポインタの定数なので、 0x00 + 1 すると、一見0x01になるように思うが、int型=4Bなので、0x1にならず0x4 になる。。意図通りには動いていない。。Cの基本が分かっていないということか。。使い始めたのは大学の時だが。。なんたる。。
修正版は以下
#define CLOCK_BASE 0x40000000UL
void clock_test(void){
unsigned int *ptr ;
printf("----------------------------------\n");
ptr = (unsigned int *)(CLOCK_BASE + 0x100);
printf("HFCLKSTARTED %x(%x)\n",*ptr,ptr);
ptr = (unsigned int *)(CLOCK_BASE + 0x104);
printf("LFCLKSTARTED %x(%x)\n",*ptr,ptr);
ptr = (unsigned int *)(CLOCK_BASE + 0x10C);
printf("DONE %x(%x)\n",*ptr,ptr);
ptr = (unsigned int *)(CLOCK_BASE + 0x110);
printf("CTTO %x(%x)\n",*ptr,ptr);
ptr = (unsigned int *)(CLOCK_BASE + 0x304);
printf("INTENSET %x(%x)\n",*ptr,ptr);
ptr = (unsigned int *)(CLOCK_BASE + 0x308);
printf("INTENCLR %x(%x)\n",*ptr,ptr);
ptr = (unsigned int *)(CLOCK_BASE + 0x408);
printf("HFCLKRUN %x(%x)\n",*ptr,ptr);
ptr = (unsigned int *)(CLOCK_BASE + 0x40C);
printf("HFCLKSTAT %x(%x)\n",*ptr,ptr);
ptr = (unsigned int *)(CLOCK_BASE + 0x414);
printf("LFCLKRUN %x(%x)\n",*ptr,ptr);
ptr = (unsigned int *)(CLOCK_BASE + 0x418);
printf("LFCLKSTAT %x(%x)\n",*ptr,ptr);
ptr = (unsigned int *)(CLOCK_BASE + 0x41C);
printf("LFCLKSRCCOPY %x(%x)\n",*ptr,ptr);
ptr = (unsigned int *)(CLOCK_BASE + 0x518);
printf("LFCLKSRC %x(%x)\n",*ptr,ptr);
ptr = (unsigned int *)(CLOCK_BASE + 0x538);
printf("CTIV %x(%x)\n",*ptr,ptr);
ptr = (unsigned int *)(CLOCK_BASE + 0x550);
printf("XTALFREQ %x(%x)\n",*ptr,ptr);
printf("----------------------------------\n");
}出力結果
---------------------------------- HFCLKSTARTED 0(40000100) LFCLKSTARTED 0(40000104) DONE 0(4000010c) CTTO 0(40000110) INTENSET 0(40000304) INTENCLR 0(40000308) HFCLKRUN 0(40000408) HFCLKSTAT 10000(4000040c) LFCLKRUN 0(40000414) LFCLKSTAT 0(40000418) LFCLKSRCCOPY 0(4000041c) LFCLKSRC 0(40000518) CTIV 0(40000538) XTALFREQ ffffffff(40000550) ----------------------------------
ステータスを見ると、HFCLKがRCオッシレータで動いていることになっている。まぁCPUもクロックがないと動かないので、そういうことなんだろう。一方、LFCLKSTATが0であり、LFCLKは動いていないようだ。