Cortex-M/EFM322013. 5. 1. 19:30

EFM32 Timer 테스트 - 타이머 인터럽트로 1초 만들기

EFM32 Timer 테스트 - 타이머 인터럽트로 1초 만들기

 


 

EFM32 Timer 초기화 함수


 void InitTimer0(void)

 {

// Enable clock for TIMER0 module

CMU_ClockEnable(cmuClock_TIMER0, true);



//Select TIMER0 parameters

TIMER_Init_TypeDef timerInit =

{

.enable     = true,

.debugRun   = true,

.prescale   = timerPrescale1024,

.clkSel     = timerClkSelHFPerClk,

.fallAction = timerInputActionNone,

.riseAction = timerInputActionNone,

.mode       = timerModeUp,

.dmaClrAct  = false,

.quadModeX4 = false,

.oneShot    = false,

.sync       = false,

};


// Enable overflow interrupt

TIMER_IntEnable(TIMER0, TIMER_IF_OF);


// Enable TIMER0 interrupt vector in NVIC

NVIC_EnableIRQ(TIMER0_IRQn);


// Set TIMER Top value - Top Value / (28MHz / 1024 (prescaler))

// For 1 Seconds Top Value= 27344

TIMER_TopSet(TIMER0, 27344);


/* Configure TIMER */

TIMER_Init(TIMER0, &timerInit);

}





EFM32 타이머 인터럽트 핸들러

void TIMER0_IRQHandler(void)

{

//Clear flag for TIMER0 overflow interrupt

TIMER_IntClear(TIMER0, TIMER_IF_OF);


Led1Toggle();

}


Posted by nexp

댓글을 달아 주세요

[Microchip]/PIC16F2012. 11. 15. 05:51

[PIC16F150x EVM]TIMER 인터럽트 테스트

[PIC16F150x EVM]TIMER 인터럽트 테스트


PIC16F1509 에는 3개의 타이머/카운터가 있다.

타이머 입력소스는 시스템클럭의 1/4 또는 T0CKI핀 으로 입력 받을 수 있다.




PIC16F1509 타이머 초기화 함수

void InitTimer0(void)

{

 // TMR0 Associate Registers Initial

 TMR0CS = 0; // Timer0 CLK Source설정 -> FOSC/4


 PSA = 0;                   //Prescaler 사용여부 설정(사용)

 PS0 = 0;         // Prescaler 1:4

 PS1 = 1;         // Prescaler 1:16

 PS1 = 0;         // Prescaler 1:256


 TMR0 = INTERVAL_1mS;  // Initial TMR0

 

 //타이머 인터럽트 레지스터 초기화

 T0IF = 0;     //Clear TMR0 Interrupt Flag

 T0IE = 1;     //Enable TMR0 Interrupt


 GIE = 1;     //Enable Global Interrupt

}





MCU_TimerCal 프로그램을 이용해  간단히 1ms에 대한 설정값을 구할 수 있다.



#define INTERVAL_1mS 0x82


volatile unsigned int gTimeTick1_1ms = 0;

//인터럽트 핸들러 

interrupt ServiceRoutine() 

{

   // Timer0 Interrupt 발생하면

   if(T0IF)

  { 

    TMR0 = INTERVAL_1mS;  // Initial TMR0

    T0IF = 0;     // Clear Interrupt Flag


gTimeTick1_1ms++;

//Led1Toggle();

  }

}








Posted by nexp

댓글을 달아 주세요

[AVR]/Mega82012. 5. 9. 23:51

[ATmeag88] Timer2 테스트 - 8-bit Timer/Counter2 with PWM

[ATmeag88] Timer2 테스트 - 8-bit Timer/Counter2 with PWM

 

- Single Channel Counter
- Clear Timer on Compare Match (Auto Reload)
- Glitch-free, Phase Correct Pulse Width Modulator (PWM)
- Frequency Generator
- 10-bit Clock Prescaler
- Overflow and Compare Match Interrupt Sources (TOV2, OCF2A and OCF2B)
- Allows Clocking from External 32 kHz Watch Crystal Independent of the I/O Clock

 

 

 

 

Timer2 초기화

#define TIMER2_VALUE      (256-115)

 

#define TIMER2_CLK_DIVCLK                   1
#define TIMER2_CLK_DIV8                     2
#define TIMER2_CLK_DIV32                    3
#define TIMER2_CLK_DIV64                    4
#define TIMER2_CLK_DIV128                   5
#define TIMER2_CLK_DIV256                   6
#define TIMER2_CLK_DIV1024                  7

 

#define TIMER2_DISABLE_PWM                 0

 

 

#define TIMSK        TIMSK2
#define TIMER2_INT_ENABLE     BIT0
#define Timer2Set(Value)     (TCNT2 = Value)
#define TCCR2        TCCR2B

 

//Initialize Timer2

void IntitTime2(void)
{

    // Enable Timer 2 output compare interrupt
    Sbi(TIMSK, TIMER2_INT_ENABLE);

 

    // Start timer 2 with prescaler 128

    Sbi(TCCR2, TIMER2_CLK_DIV128);

   //set 1ms
   Timer2Set(TIMER2_VALUE);
}

 

 

Timer Interrupt Handler

 SIGNAL(SIG_OUTPUT_COMPARE2A)

    gTimeTick++;

    Timer2Set(255-5);

}   

 

 

 

Posted by nexp

댓글을 달아 주세요

[MCU]/CANTUS2012. 2. 15. 15:53

[CANTUS] Timer 테스트 - 타이머 인터럽트를 이용하여 1초 만들기

[CANTUS] Timer 테스트 - 타이머 인터럽트를 이용하여 1초 만들기

CANTUS의 Timer는 15bit Pre-scaler를 내장한 32 Bit Timer로 8채널을 가지고 있다.
엄청 많은데... 혹 다른 기능들 하고 겹치진 않겠지? (좀더 알아볼 필요가 있다.) 아무튼 스펙은 좋다.





Timer Interrupt를 사용하기 위해 Interrupt.c의 setinterrupt() 함수를 사용하면 된다.
BOOL setinterrupt(INTNUM_TIMER0, void (*fp)())


Interrupt Service Routine(ISR)이 Vector Table에 Setting되면 Interrupt를 Enable 한다.
void EnableInterrupt(INTNUM_TIMER0, TRUE);




CANTUS 타이머 제어 레지스터
Lib사용할 경우 아래 함수로 쉽게 설정 가능하다.
BOOL settimer(int nCh,U32 ms);






CANTUS Timer 테스트 예제코드

#include "system.h"
#include "serial.h"


volatile unsigned int gTimerTick1_1ms = 0;


//----------------------------------------------------------------------------
//Timer Interrupt Handler
void Timer0ISR(void)
{

 gTimerTick1_1ms++;

}
//----------------------------------------------------------------------------


int main()
{
 int flag = 0;
 
 SystemInit();

 Led1Init();
 Led1On();

 U0_Init(BAUD_115200);
 DebugPrint("adStar EVM - Timer Test\r\n");



 //Timer  초기화

 InitInterrupt();

 setinterrupt(INTNUM_TIMER0,Timer0ISR);

 settimer(0,1);


 while(1)
 {
  if( gTimerTick1_1ms>1000)
  {
   gTimerTick1_1ms = 0;
    
   flag ^= 1;
   if(flag)Led1On();
   else Led1Off();
  }
 }
 
 return 0;
}



Posted by nexp
TAG CANTUS, timer

댓글을 달아 주세요

[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

댓글을 달아 주세요