結論: 無い。
PIC32はdelayするマクロが用意されていないらしい。( yahoo知恵袋 )別に正確じゃなくていいから、sleep(3) とかそういうことがしたいのよ。。
いろいろ調べてTimer触ったので記念にメモ。
MPLAB Harmonyというものについて
PIC32MXの開発では、開発環境拡張のHarmonyを利用するようになってきているらしい。ネットで少し古いソースコード参考にすると、開発環境に含まれないライブラリをインクルードしてたりして困る。Harmonyには、設定を簡単にするGUI、コードジェネレータ+ライブラリがセットになってる感じだった。Harmonyを使うと20~40%も開発効率があがるとかなんとか。
便利そうだしPIC32の開発に使ってみようと思った。インストールはググったページみながらやればOK。「MPLAB Harmonyのインストール手順」
MPLAB Harmony使ってみる
「MPLAB Harmonyの使い方」というページから順にやってみた。丁寧に書いてあるなぁ。。
まずは、コードジェネレータだけ試した。生成したコードをPICKIT3で焼いたらそのままできたのでOK。
タイマーについて
分からない。分からない。分からない。分からない。分からない。本当に分からない。
動かしたけどあってるか自信ない。よく、皆こんな情報だけで動かせるなぁ。。素人にはキツイぜ。
本家サイトの「Using Harmony to Control Timers」に次の表がある。
取りあえず、staticが簡単で使いやすいらしい。
考え方としては、タイマのオシレータに内部クロックを使う場合、
(ペリフェラルクロック) / (プリスケール) / (カウンタ) = 割り込みの頻度
になる。
「MPLAB Harmonyの使い方(4)」は前ページで30MHzに設定しているので、それをベースに記述してある。
私は、オシロとか持ってないのでLEDチカチカで割り込みの頻度を確認することにした。PICはいつものPIC32MX120F032B。
タイマ確認手順
まず、harmonyのGUIでクロック設定。Auto-Calculateボタンを押して、表示されるダイアログで20MHzを設定した。
システムクロックを20MHzにすると、デフォルトでペリフェラルバスクロックが半分の10MHzになる。
次にタイマの設定で、MPLAB Harmonyの使い方(4)に書いてある図と自分の設定が合わなくて困った。使い方(4)にある図は次のもの。
一方、私のはこんな感じで若干選択できる項目違った。。
特に分からなかったのが、Clock Sourceで「DRV_TMR_CLKSOURCE_INTERNAL」のINTERNALってなんじゃい!!っていうとこ。参考にしたサイトはPERIPHERAL_CLOCKってあるのに、それが選べなくて悩んだ。
それで、途方にくれながらソースコード生成して、ソースコードジャンプしたら、INTERNALは、PERIPHERALとして取り扱ってるような記述だった。深く考える必要なし(笑)
で、私は10MHzで1秒ごとにLEDを点滅させる作戦だったので、プリスケール256として、timer周期が25.6㎲。よって、1秒の割り込みするなら1/25.6㎲=39063(Timer Period)とした。
設定をしたら、「Generate Code」ボタンを押してソースコード吐き出す。
あとは、Using Harmony Static Drivers to Control Timers を見ながら初期設定を書いてあげた。(最初、 MPLAB Harmonyの使い方(4) だけみながらやったがなんかうまくいかなかったので本家も見た)
app.c の初期化部分で、TRISAレジスタを設定して、RA0を使えるようにして、system_interrupt.c のLEDチカチカする部分こんな感じにした。
---------------------
int status = 0;
void __ISR(_TIMER_1_VECTOR, ipl4AUTO) IntHandlerDrvTmrInstance0(void)
{
PLIB_INT_SourceFlagClear(INT_ID_0,INT_SOURCE_TIMER_1);
status = !status;
PORTA = status;
}
---------------------
そしたらこんな感じ。
pic32のタイマーが全然理解できんw pic.twitter.com/RbhEkx7K6z— ( ゚∀゚)o彡゚さーけ!さーけ! (@kitamurahisao) 2016年6月13日
PICは難しいねぇ(笑)