PIC32MX CoreTimer

2016年9月23日

昔に書いた記事なので、よくまとまっていない気がするので、delay関数が必要な場合はこちらを参考にしてください。


PIC32MX(PIC32MX220F03B) には Timer1 から Timer5 まであります。
ところが、さらに Core Timer というのが有ります。
マニュアルでは一切触れられていません。割り込み一覧とかに書いてあるくらいです。
Microchip のフォーラムには取り上げられています。どうやら、MIPS 系のアーキテクチャなら有るらしいのです。
そこにあったサンプルコード。

// ----------------------------------------------------------------------------
// DelayMs creates a delay of given miliseconds using the Core Timer
//
void delay_ms(unsigned long delay)
{
unsigned int int_status;
while( delay-- )
{
int_status = INTDisableInterrupts();
OpenCoreTimer(GetSystemClock() / 2000);
INTRestoreInterrupts(int_status);
mCTClearIntFlag();
while( !mCTGetIntFlag() );
}
mCTClearIntFlag();
}

Openで割り込み時間の設定をして、フラグがたったら云々してますね。実際割り込みの設定もできるわけですが。
ですが、プログラムは止まってしまいます。
Using the 32-bit Core Timer
ここのHPでは割り込みではなく、常時UP Countしている物をResetして、数字を読みだしてなにがしをすると。


void start_timer( void)
{   // resets the core timer count
WriteCoreTimer( 0);
} // start_timer
double read_timer( void)
{
unsigned int ui;
// get the core timer count
ui = ReadCoreTimer();
// convert in seconds (1 core tick = 2 SYS cycles)
return ( ui * 2.0 /FSYS);
} // read_timer

フリーランカウンタで32Bit Timerなので、結構な時間測れます。まあこのリンクのHP適当に読めば大体分かります。
この関数、システムクロックで除算して Double で値を返していますが、まあ、サンプルだからです。
こんな感じではどうでしょう。


#define delay_10ns(_t)      WriteCoreTimer(1); \
while( ( (GetSystemClock() / 20000000ul) * _t) \
/ ReadCoreTimer() ) {}

WriteCoreTimer(0) でも1命令でいきなり除算は有り得ないのでいいと思うのですが、まあ 20nsec 位なので1を入れておきました。
昔で言う「0で除算しました」、そして PC 停止。リセットボタン。なんて。
delayじゃなくプログラムが動作中にタイムアウトを見ることもできます。

PIC32

Posted by saba