カレンダー(月別)
06 ≪│2017/07│≫ 08
- - - - - - 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 - - - - -
プロフィール

Suma

Author:Suma
東北の田舎でロボット開発に励んでいます。
現在のメインはマイクロマウス。目指すは東北地区大会優勝!!

ご注意
・当ブログはリンクフリーです ・当ブログの掲載情報を元に行った行為によって何らかの損害が生じたとしても管理人は一切責任を負いません。予めご了承ください。
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

--/--/--(--) --:-- |
CMTを使用して1ms周期の割り込みを作成
前回設定したクロックは、ICLK=96MHz、PCLK=48MHz

CMTはPCLKをベースに動作するのため48MHzが基準となる

まずはCMT0のストップ状態を解除しておく
(消費電力低減機能によって初期状態ではストップしている)
SYSTEM.MSTPCRA.BIT.MSTPA15 = 0; //CMT0ストップ解除

CMT0のストップを解除するとCMT0レジスタへのアクセスが可能となる
初期設定手順は以下の通り
CMT.CMSTR0.WORD = 0x0000u; //CMT停止
CMT0.CMCNT = 0;        //カウンタクリア
CMT0.CMCOR = 5999; //1ms
CMT0.CMCR.WORD = 0x0040u; //クロック=PCLK/8、CMI0許可
CMT.CMSTR0.BIT.STR0 = 1;       //タイマスタート

CMCNTのカウントクロックは、PCLK/8で6MHzとする
6MHzで6000カウントするとちょうど1msとなるため、CMCORに6000を設定…
としたいところだが、実際に割り込みが発生するのはコンペアマッチが発生した次のカウントタイミングとある
このため6000から1カウントをマイナスした5999をレジスタに設定する
最後にタイマーをスタートして初期設定は完了

次に割り込み関連
上記でCMI0を割り込みで使用するように設定したが、同様にCMI0の割り込み優先度と割り込み許可設定をICUに対しても行う必要がある

優先度は、0:優先度低~15:優先度高、同一レベル設定の場合はベクタ番号の小さい側が優先高、となっている
ただし0を設定すると割り込み禁止となるため、1以上を設定すること
ICU.IPR[0x04u].BIT.IPR = 2; //CMT0割り込み優先度2
ICU.IER[0x03u].BIT.IEN4 = 1; //CMT0割り込み許可

ICUのIPR、IERと各割り込み要因の関連はベクタテーブルの章の参照のこと

続いて、intprg.cをちょっと編集
CMT0のCMI0割り込みの関数として定義されている以下の関数をコメントアウトしておく(自分の好きなファイルに割り込み関数を書きたいので)
// CMT0 CMI0
//void Excep_CMT0_CMI0(void){ } ←コメントアウト

最後に割り込み関数本体を記述(多重割り込み禁止版)
#pragma interrupt (Excep_CMT0_CMI0(vect=28))
void Excep_CMT0_CMI0(void) {
 ICU.IR[28].BIT.IR = 0; //割り込みフラグクリア
 IO_PORT_DEBUG = 1;  //割り込み周期・処理時間測定用
 /* 割り込み処理 */
 IO_PORT_DEBUG = 0;  //割り込み周期・処理時間測定用
}

本当に1ms周期になっているのかは
・マイコンのポートにHi,Loを出力してオシロスコープで波形を測定する
・1ms割り込み内で1000カウントし、LEDを1秒ごとにON、OFFさせる
のような方法で確認すればOK

2015/01/04(日) 12:03 | コメント:0 | トラックバック:0 |
コメント
コメントを投稿
名前
タイトル
メール
URL
コメント
パスワード
管理者にだけ表示を許可する


トラックバック

この記事のトラックバックURL
 

この記事にトラックバックする (FC2 blog user only!)
 
この記事へのトラックバック


探索済み区画
これまで
区画を探索
検索フォーム
夢を叶えるための名言集


presented by 地球の名言
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。