[DSP]/DSP60002012. 2. 3. 21:30

[TMS320C6720 EVM] RTI Timer 테스트 - 1초 만들기

[TMS320C6720 EVM] RTI Timer 테스트 - 1초 만들기


TMS320C67xx RTI Timer 관련 자료

TMS320C672x는 C671x에 있는 일반적인 타이머 모듈이 없고 The Real-Time Interrupt Module (RTI) 라고 하는 타이머 모듈이 2채널 존재 한다.
 






TMS320C6720 RTI Timer 인터럽트 핸들러
//time interval = 1ms
void RTI_TimerHandler(void)
{
    Bool          intEvent;
    CSL_Status    status;

    /* Read the interrupt flag register */
    status = CSL_rtiGetHwStatus (hRti, CSL_RTI_QUERY_INT0_STATUS, &intEvent);

 //----------------------------------------
 Led1Toggle();

 gTimeTick1++;
 //----------------------------------------

    /* Clear the interrupt */
    status = CSL_rtiHwControl (hRti, CSL_RTI_CMD_CLEAR_INT0, &intEvent);
}



TMS320C6720 RTI Timer 초기화 함수
void RTI_Setup(void)
{
    CSL_RtiObj               rtiObj;
    CSL_Status               status = CSL_SOK;
    CSL_RtiHwSetup           hwSetup = CSL_RTI_HWSETUP_DEFAULTS;
    CSL_RtiHwSetup           hwSetupRead;
    Uint16                   count = 0;

    /* clear local data structures */
    memset (&rtiObj, 0, sizeof (CSL_RtiObj));
    memset (&hwSetup, 0, sizeof (CSL_RtiHwSetup));
    memset (&hwSetupRead, 0, sizeof (CSL_RtiHwSetup));

    /* Initalize the RTI csl module */
    status = CSL_rtiInit (NULL);
    
    /* Open csl module */
    hRti = CSL_rtiOpen (&rtiObj, CSL_RTI, NULL, &status);
    if ((status != CSL_SOK) || (hRti == NULL)) return;

    /* Setup hardware parameters */       
    hwSetup.blk0ExtnCntl                    = CSL_RTI_CAPTURE_EVENT_SOURCE1;
    hwSetup.blk1ExtnCntl                    = CSL_RTI_CAPTURE_EVENT_SOURCE1;  
    hwSetup.compareUpCntrs.compareUpCntr0   = UC_COMP_VALUE;  
    hwSetup.compVal.comp0Val                = COMPARE0_VALUE;
    hwSetup.compVal.comp1Val                = COMPARE1_VALUE;
    hwSetup.compVal.comp2Val                = COMPARE2_VALUE;
    hwSetup.compVal.comp3Val                = COMPARE3_VALUE;
    hwSetup.updateCompVal.updateComp0Val    = UPDATECOMPARE_VALUE;
    hwSetup.updateCompVal.updateComp1Val    = UPDATECOMPARE_VALUE;
    hwSetup.updateCompVal.updateComp2Val    = UPDATECOMPARE_VALUE;
    hwSetup.updateCompVal.updateComp3Val    = UPDATECOMPARE_VALUE;  
    hwSetup.preLoadWatchdog                 = PRELOAD_VALUE;   
       
    /* Enable compIntr0 alone */
    hwSetup.intConfig.compIntr0En       = TRUE;
    hwSetup.intConfig.compIntr1En       = FALSE;
    hwSetup.intConfig.compIntr2En       = FALSE;
    hwSetup.intConfig.compIntr3En       = FALSE;

    /* Stop Rti Block0 counters */
    status = CSL_rtiHwControl (hRti, CSL_RTI_CMD_STOP_BLOCK0, NULL);

    /* Setup rti module */
    status = CSL_rtiHwSetup (hRti, &hwSetup);

    /* verify the hwsetup configuration */
    status = CSL_rtiGetHwSetup (hRti, &hwSetupRead);

    /* Start Rti Block0 counters */
    status = CSL_rtiHwControl (hRti, CSL_RTI_CMD_START_BLOCK0, NULL);
    }




TMS320C6720 RTI Timer 테스트 예제 소스코드
TMS320C6720의 RTI0를 이용하여 1ms 인터럽트로 구동하고 메인함수에서 1초마다 한번씩 LED를 점등하는 예제이다.
void main()
{
 SystemInit();

 //Led Init..
 Led1Init();
 Led2Init();

 Led1Off();
 Led2Off();

 DebugPrint("[TMS320C6720 EVM] Test Program - RTI Timer.\n");

 //RTI Timer 초기
 RTI_Init();

 while(1)
 {
  //1000ms/1ms = 1000 => 1초
  if(gTimeTick1>1000)화
  {
   gTimeTick1 = 0;

   Led2Toggle();
  }
 }
}

Posted by nexp

댓글을 달아 주세요