RX62NのタイマCMTを使いusオーダーで時間待ちするプログラムです。割り込みを使用しています。頻繁に割り込みが発生するので実用的かどうかはわかりません。
- #include <machine.h>
- #include "timer.h"
- #include "iodefine.h"
- #include "vect.h"
- #define PCLK 48 //PCLK = 48MHz
- /* 1usecでカウントアップする変数 */
- static volatile unsigned int utimer;
- /*
- タイマ初期化 使用するタイマCMT1
- 引数 無し
- 戻り値 無し
- */
- void initTimer(void)
- {
- MSTP(CMT1) = 0; // enable CMT1
- CMT1.CMCR.WORD = 0x0040; // 1/8
- //CMT1.CMCOR = PCLK*1000000L/1000L/8L - 1; // 1000Hz(1ms)
- CMT1.CMCOR = PCLK*1000000L/1000000L/8L - 1; // 1MHz(1us)
- ICU.IER[IER_CMT1_CMI1].BIT.IEN_CMT1_CMI1 = 1; //Enable CMIE
- ICU.IPR[IPR_CMT1_CMI1].BYTE = 8; // Set interrupt priority level
- CMT.CMSTR0.WORD |= 0x0002; // start CMT0 CMT1
-
- utimer = 0; //タイマの初期化
- }
- /*
- タイマカウンタの初期化
- 引数 タイマ番号
- 戻り値 無し
- */
- void clearTimer(void)
- {
- utimer = 0;
- }
- /*
- タイマの値を取得する
- 引数 タイマ番号
- 戻り値 タイマの値
- */
- unsigned int getTimer(void)
- {
- return utimer;
- }
- /*
- mSec単位でウェイトをかける
- 引数 待ち時間 ミリ秒
- 戻り値 無し
- */
- void delay_ms(unsigned int ms)
- {
- unsigned int us;
- us = 1000*ms;
- clearTimer();
- while(getTimer()<=us);
- }
- /*
- uSec単位でウェイトをかける
- 引数 待ち時間 マイクロ秒
- 戻り値 無し
- */
- void delay_us(unsigned int us)
- {
- clearTimer();
- while(getTimer()<=us);
- }
- /*
- タイマ割込みプログラム
- CMT1割込みで起動
- */
- void Excep_CMT1_CMI1(void)
- {
- utimer++;
- }