NXP LPC2388 のタイマー機能の検証を以下のとおりおこなった。
概要 4つのLEDを4つのタイマー(TIMER0~TIMER3)で異なるインターバルで点滅させる。
※10秒程度チカチカしてプログラムはハングする。
1.タイマ設定 main()関数側
// タイマ 設定 Timer0
TIMER_StructInit(&TIMER_InitStructure);
TIMER_InitStructure.TIMER_ID =TIMER_ID_0;
TIMER_InitStructure.TIMER_INTVL_MR0 = TIMER_INTVL_1mS * 5;
TIMER_InitStructure.TIMER_INTVL_MR0_TCR = TRUE;
TIMER_InitStructure.INTRPT_HANDLR = Tim0_InterruptHnd;
TIMER_Init(&TIMER_0,&TIMER_InitStructure);
*(TIMER_0.pTPR) = 0xF;
TIMER_Start(&TIMER_0);
2.LPC用タイマ関数側。
1)タイマ設定構造体
typedef struct
{
TIMER_ID_TypeDef TIMER_ID;
TIMER_PCLK_TypeDef TIMER_PCLK;
u32 TIMER_PRCMAX;
u32 TIMER_INTVL_MR0;
u32 TIMER_INTVL_MR1;
u32 TIMER_INTVL_MR2;
u32 TIMER_INTVL_MR3;
bool TIMER_INTVL_MR0_TCR;
bool TIMER_INTVL_MR1_TCR;
bool TIMER_INTVL_MR2_TCR;
bool TIMER_INTVL_MR3_TCR;
u32 INTRPT_HANDLR;
}TIMER_InitTypeDef;
2)関数 TIMER_StructInit
1)のタイマ設定構造体に初期値を設定
3)関数 TIMER_Init
①TIMER0~3のタイマレジスタ群のポインタを設定。
②割り込みレジスタVICIRQStatus、VICIntEnableの設定
③割り込みレジスタVICVectCntlxxとVICVectPriorityxxに割り込みハンドラー、プライオリティを設定する。(効果なし)
④プリスケーラのMAX値の設定(今のところ0を設定:プリスケールなし)・・・よく解らない
⑤タイマーインターバルの設定。
⑥タイマ一致コントロールレジスタの設定。(タイマ割り込みを設定、タイマカウンタリセットを設定)
void TIMER_Init(TIMER_TypeDef* TIMERx, TIMER_InitTypeDef* TIMER_InitStruct)
{
Timer_Interval_Rate= TIMER_INTVL_RATE;
switch(TIMER_InitStruct->TIMER_ID)
{
case TIMER_ID_0:
PCLKSEL0 &= 0xFFFFFFF3;
PCLKSEL0 = TIMER_InitStruct->TIMER_PCLK <<>
TIMERx->pTIR = (u32 *)(TMR0_BASE_ADDR + 0x00); ①
TIMERx->pTTCR = (u32 *)(TMR0_BASE_ADDR + 0x04);
TIMERx->pTTC = (u32 *)(TMR0_BASE_ADDR + 0x08);
・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・
VICIntSelect = VICIntSelect & ~(0x1<<4); ②
VICIntEnable = VICIntEnable (0x1<<4);
VICVectCntl4 = TIMER_InitStruct->INTRPT_HANDLR; ③
VICVectPriority4 = 0x04;
break;
case TIMER_ID_1:
PCLKSEL0 &= 0xFFFFFFCF;
・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・
VICVectCntl27 =TIMER_InitStruct->INTRPT_HANDLR; ③
VICVectPriority27 = 0x07;
break;
default:
return;
}
/* Prescale Register */
*(TIMERx->pTPR) = TIMER_InitStruct->TIMER_PRCMAX; ④
if(TIMER_InitStruct->TIMER_INTVL_MR0 != (u32)NULL)
{
*(TIMERx->pTMR0) = TIMER_InitStruct->TIMER_INTVL_MR0 * Timer_Interval_Rate; ⑤
*(TIMERx->pTMCR) = *(TIMERx->pTMCR) & ~(0x07);
if(TIMER_InitStruct->TIMER_INTVL_MR0_TCR )
{
*(TIMERx->pTMCR) = *(TIMERx->pTMCR) (0x03); ⑥(TCリセットあり)
} else {
*(TIMERx->pTMCR) = *(TIMERx->pTMCR) (0x01); ⑥(TCリセットなし)
}
}
if(TIMER_InitStruct->TIMER_INTVL_MR1 != (u32)NULL)
{
・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・
・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・
return;
}
4)関数 TIMER_Start
TIMER_Initでポインタが設定されたタイマコントロールレジスタ TxCR でTIMERカウンタ Enable設定。
void TIMER_Start(TIMER_TypeDef* TIMERx)
{
*(TIMERx->pTTCR) = *(TIMERx->pTTCR) 0x00000001;
return;
}
3.タイマー割り込み処理
本来 1.で指定したタイマ割り込みハンドラ(Tim0_InterruptHnd)でLEDの点滅を実現したいが不調、IRQ割り込みで(タイマ割り込みをIRQ割り込み指定)実行されるハンドラで実現。
void CPU_IRQInterrupt(void)
{
switch(VICIRQStatus)
{
case INT_IRQ_TIMER0:
if(toggle0 == 0)
{
toggle0 = 1;
GPIO_ResetBits(&GPIO_0,GPIO_Pin_27);
} else {
toggle0 = 0;
GPIO_SetBits(&GPIO_0,GPIO_Pin_27);
}
TIMER_InterruptReset(&TIMER_0);
break;
case INT_IRQ_TIMER1:
if(toggle1 == 0)
{
toggle1 = 1;
GPIO_ResetBits(&GPIO_1,GPIO_Pin_19);
} else {
toggle1 = 0;
GPIO_SetBits(&GPIO_1,GPIO_Pin_19);
}
TIMER_InterruptReset(&TIMER_1);
・・・・・・・・・・・・・・・・・・・・・・・・・・・
2009年5月2日土曜日
登録:
コメントの投稿 (Atom)
0 件のコメント:
コメントを投稿