2009年5月2日土曜日

フェーズ2 TIMERテスト NXP LPC2388

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);
                ・・・・・・・・・・・・・・・・・・・・・・・・・・・

0 件のコメント:

コメントを投稿