[Microchip]/PIC32MZ2016. 12. 31. 12:17

[PIC32MZ EVM] 타이머 인터럽트 테스트

[PIC32MZ EVM] 타이머 인터럽트 테스트


PIC32MZ 시리즈의 타이머/카운터는 9개가 있고 MPLAB 코드 생성 툴을 이용하면 쉽게 사용 할 수 있다.

한가지 아쉬운점은 기본 16비트 타이머 이고 32비트 타이머를 사용하려면 16비트 타이머2개를 조합해서 사용해야 되는것 같다.

STM32의 경우 별도의 32비트 타이머가 존재해서 편리 했는데...



MPLAB Harmony Configurator  를 이용하여 타이머드라이버 생성 할 수 있고 각종 파라미터를 설정하면 쉽게 초기화 할 수 있다.



자동으로 생성된 코드를 보면 아래와 같이 PIC32MZ의 타이머 설정부분의 코드가 생성된다.

void SYS_Initialize ( void* data )

{

    /* Core Processor Initialization */

    SYS_CLK_Initialize( NULL );

    sysObj.sysDevcon = SYS_DEVCON_Initialize(SYS_DEVCON_INDEX_0, (SYS_MODULE_INIT*)&sysDevconInit);

    SYS_DEVCON_PerformanceConfig(SYS_CLK_SystemFrequencyGet());

    SYS_PORTS_Initialize();


    /* Initialize Drivers */


    sysObj.drvTmr0 = DRV_TMR_Initialize(DRV_TMR_INDEX_0, (SYS_MODULE_INIT *)&drvTmr0InitData);


    SYS_INT_VectorPrioritySet(INT_VECTOR_T1, INT_PRIORITY_LEVEL1);

    SYS_INT_VectorSubprioritySet(INT_VECTOR_T1, INT_SUBPRIORITY_LEVEL0);

 

 

     sysObj.drvUsart0 = DRV_USART_Initialize(DRV_USART_INDEX_0, (SYS_MODULE_INIT *)&drvUsart0InitData);

    SYS_INT_VectorPrioritySet(INT_VECTOR_UART1_TX, INT_DISABLE_INTERRUPT);

    SYS_INT_VectorSubprioritySet(INT_VECTOR_UART1_TX, INT_SUBPRIORITY_LEVEL0);

    SYS_INT_VectorPrioritySet(INT_VECTOR_UART1_RX, INT_PRIORITY_LEVEL1);

    SYS_INT_VectorSubprioritySet(INT_VECTOR_UART1_RX, INT_SUBPRIORITY_LEVEL0);

    SYS_INT_VectorPrioritySet(INT_VECTOR_UART1_FAULT, INT_PRIORITY_LEVEL1);

    SYS_INT_VectorSubprioritySet(INT_VECTOR_UART1_FAULT, INT_SUBPRIORITY_LEVEL0);


    /* Initialize System Services */


    /*** Interrupt Service Initialization Code ***/

    SYS_INT_Initialize();

  

    /* Initialize Middleware */


    /* Enable Global Interrupts */

    SYS_INT_Enable();


    /* Initialize the Application */

    APP_Initialize();

}





PIC32MZ 타이머 기본 설정 이외 인터럽터 핸들러 생성 및  등록은 초기화 코드에서 해 주어야 한다.


SYS_MODULE_OBJ T0Handle ;


void APP_Initialize ( void )

{

    /* Place the App state machine in its initial state. */

    appData.state = APP_STATE_INIT;


    printf("PIC32MZ EVM Timer Test\r\n");


    

   T0Handle = DRV_TMR_Open( DRV_TMR_INDEX_0, DRV_IO_INTENT_EXCLUSIVE );

 

   // calculate the divider value and register the ISR

   uint32_t desiredFrequency = 1000 ; // 1 khertz

   uint32_t actualFrequency = DRV_TMR_CounterFrequencyGet(T0Handle) ;

   uint32_t divider = actualFrequency/desiredFrequency; // cacluate divider value

  

   DRV_TMR_AlarmRegister(T0Handle, divider, true, 0 , T0_ISRHandler);

 

   // Starting the Timer   

   DRV_TMR_Start(T0Handle);    

}





PIC32MZ  타이머 인터럽트 핸들러 함수


void T0_ISRHandler(uintptr_t context, uint32_t alarmCount)

{

   PLIB_PORTS_PinToggle(PORTS_ID_0, PORT_CHANNEL_H, 10 );

}






Posted by nexp

댓글을 달아 주세요

[TI]/TM4C2014. 7. 26. 21:30

TM4C123 - Timer 테스트

TM4C123  - Timer 테스트



TM4C123의 페리는 정말 막강한데12개의 타이머와 20개의 PWM을 출력 할 수 있다. 그리고 마음에 드는 사항이 64bit 타이머가 6개 있다.


TM4C123의 타이머 관련 특징

■ 16/32-bit operating modes:

-16- or 32-bit programmable one-shot timer

-16- or 32-bit programmable periodic timer

-16-bit general-purpose timer with an 8-bit prescaler

-32-bit Real-Time Clock (RTC) when using an external 32.768-KHz clock as the input

-16-bit input-edge count- or time-capture modes with an 8-bit prescaler

-16-bit PWM mode with an 8-bit prescaler and software-programmable output inversion of the PWM signal


■ 32/64-bit operating modes:

-32- or 64-bit programmable one-shot timer

-32- or 64-bit programmable periodic timer

-32-bit general-purpose timer with a 16-bit prescaler

-64-bit Real-Time Clock (RTC) when using an external 32.768-KHz clock as the input

-32-bit input-edge count- or time-capture modes with a16-bit prescaler

-32-bit PWM mode with a 16-bit prescaler and software-programmable output inversion of the PWM signal


■ Count up or down


■ Twelve 16/32-bit Capture Compare PWM pins (CCP)



TM4C123의 타이머 블록도




TM4C123 타이머 CCP 핀맵




TM4C123 타이머 초기화 함수

void InitTimer0(void)

{

    // Enable the peripherals used by this example.

    ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_TIMER0);


    // Enable processor interrupts.

    ROM_IntMasterEnable();


    // Configure the two 32-bit periodic timers.

    ROM_TimerConfigure(TIMER0_BASE, TIMER_CFG_PERIODIC);

    

    //1ms

    ROM_TimerLoadSet(TIMER0_BASE, TIMER_A, ROM_SysCtlClockGet()/1000);


    

    // Setup the interrupts for the timer timeouts.

    ROM_IntEnable(INT_TIMER0A);

    ROM_TimerIntEnable(TIMER0_BASE, TIMER_TIMA_TIMEOUT);


    // Enable the timers.

    ROM_TimerEnable(TIMER0_BASE, TIMER_A);    

}




TM4C123 타이머 인터럽트 핸들러

void Timer0IntHandler(void)

{

    // Clear the timer interrupt.

    ROM_TimerIntClear(TIMER0_BASE, TIMER_TIMA_TIMEOUT);


    gTimeTick1++;    

}




TM4C123 타이머 예제 소스코드

int main(void)

{

    int cnt = 0;

    

    SystemInit();

    Led1Init();

    Led1On();

    

    Led2Init();

    Led2On();

    

    DebugInit(BAUD_115200);

    DebugPrint("TM4C123 Timer Test\r\n");

    

    InitTimer0();

    

    while(1)

    {

        if(gTimeTick1>1000)

        {

            gTimeTick1 = 0;

            Led1Toggle();

        }

    }


}


Posted by nexp

댓글을 달아 주세요

Cortex-M/NUVOTON2014. 7. 9. 13:30

M052LBN - NUVOTON Timer 테스트

M052LBN - NUVOTON Timer 테스트




Nuvoton사의 M051시리즈는 4개의 32bit (8bit prescale, 24bit timer)타이머가 있다. 


M052LBN 타이머 블록도




크럭소스 선택




M052LBN 타이머 초기화 코드

타이머 클럭소스는 내부클럭을 사용하고 있기 때문에 HIRC를 선택해서 사용하고 있다.

void Timer0Init(void)

{

    SYS_UnlockReg();    

    /* Enable peripheral clock */

    CLK->APBCLK |= CLK_APBCLK_TMR0_EN_Msk;


    /* Peripheral clock source */

    CLK->CLKSEL1 |= CLK_CLKSEL1_TMR0_S_HIRC;


    //1ms 타이머 설정

    TIMER_Open(TIMER0, TIMER_PERIODIC_MODE, 1000);

    TIMER_EnableInt(TIMER0);

    

    NVIC_EnableIRQ(TMR0_IRQn);

    

    TIMER_Start(TIMER0);

    

    SYS_LockReg(); 

}




M052LBN 타이머 인터럽트 핸들러

void TMR0_IRQHandler(void)

{

    if(TIMER_GetIntFlag(TIMER0) == 1)

    {

        TIMER_ClearIntFlag(TIMER0);


        gTimerTick1++;

    }

}




M052LBN 타이머 테스트 코드

int main(void)

{

    _SystemInit();

    

    Led1Init();

    Led1On();


    Led2Init();

    Led2On();

    

    //Serial Init

    DebugInit(BAUD_115200);

    DebugPrint("M052LBN Timer Test Program.\r\n");


    //타이머 초기화

    Timer0Init();

    while(1)

    {

        if(gTimerTick1>1000)

        {

            gTimerTick1 = 0;

            Led1Toggle();

        }

    }

}


Posted by nexp

댓글을 달아 주세요

[ST_MICRO]/STM32F42014. 6. 17. 00:16

STM32F4 타이머 인터럽트 테스트 - 1초 만들기


STM32F4 타이머 인터럽트 테스트



STM32F4에서 TIM2, TIM5는 32bit 타이머 모드를 지원한다. 이를 이용하여 1초 만들기 테스트를 해 보았다.




STM32F4 타이머 인터럽트 초기화 함수

void TimerInit2(void)

{

    TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;

    TIM_OCInitTypeDef  TIM_OCInitStructure;


    uint16_t PrescalerValue = 0;


    NVIC_InitTypeDef NVIC_InitStructure;


    /* TIM2 clock enable */

    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);


    /* TIM2 gloabal Interrupt 초기화 */

    NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;

    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;

    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;

    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;

    NVIC_Init(&NVIC_InitStructure);


    //--------------------------------------------------------------------------

    /* Compute the prescaler value */

    PrescalerValue = (uint16_t) ((SystemCoreClock / 2) / 6000000) - 1; 


    /* Time base configuration */

    TIM_TimeBaseStructure.TIM_Period = (6000-1);   //Autoreload value (ARR) -> 1ms

    TIM_TimeBaseStructure.TIM_Prescaler = (6000-1);

    TIM_TimeBaseStructure.TIM_ClockDivision = 0;

    TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;


    TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);


    /* Prescaler configuration */

    TIM_PrescalerConfig(TIM2, PrescalerValue, TIM_PSCReloadMode_Immediate);



    /* TIM Interrupts enable */

    TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);


    /* TIM2 enable counter */

    TIM_Cmd(TIM2, ENABLE);

    //--------------------------------------------------------------------------    

}




STM32F4 타이머 인터럽트 핸들러

void TIM2_IRQHandler(void)

{

if(TIM_GetITStatus(TIM2, TIM_IT_Update) == SET)

{

TIM_ClearITPendingBit(TIM2, TIM_IT_Update);

        Led2Toggle();

}  

}




Posted by nexp

댓글을 달아 주세요

[ST_MICRO]/STM82014. 6. 16. 01:14

STM8S - 타이머 테스트 (1초 만들기)

STM8S - 타이머 테스트 (1초 만들기)



마이컴 다루면서 가장 기본으로 필요한 타이머 인터럽트인데, STM8S에서 타이머 인터럽트를 어떻게 제어 하는지 테스트 해 보았다.


STM8S 타이머 구조

STM8S는 3개의 타이머가 있다. TIM4 는 8bit 베이직타이머로 일반 시간 계산하는데 사용하면 편리하다. 




Auto-reload 기능이 있어 한번만 설정하면 계속해서 자동으로 타이머 설정이 가능하다. 동급의 AVR에서는 이 기능이 없어서 인터럽트가 걸릴때 마다 매번 갱신해 주었어야 했었다.



메인클럭이 16Mhz 이므로 프리스케일로 1/128 하면 125khz가 되고 이는 8us 마다 한번씩 카운트 된다.

1초를 만드려면 1000ms/8ms -> 125번 만다 한번씩 인터럽트 걸리도록 하면 된다. 

ST제공 예제를 이용하면 타이머를 쉽게 설정 가능하다.

void Timer4Init(void)

{

        //Timer4 8bit Basic Timer Init

// 16MHz/128 = 125kHz -> 8us

TIM4_DeInit();

TIM4_TimeBaseInit(TIM4_PRESCALER_128, 125);

TIM4_ClearFlag(TIM4_FLAG_UPDATE);

TIM4_ITConfig(TIM4_IT_UPDATE, ENABLE);

TIM4_Cmd(ENABLE);

}




Timer4 인터럽트 핸들러

1ms마다 한번씩 증가 하도록 한다.

INTERRUPT_HANDLER(TIM4_UPD_OVF_IRQHandler, 23)

{

    //Led1Toggle();

    gTimeTick1++;

    

    TIM4_ClearITPendingBit(TIM4_IT_UPDATE);

}




STM8S Timer 테스트 예제코드

int main( void )

{

    SystemInit();

    

    DebugInit(BAUD_115200);

    DebugPrint("STM8S Timer Test\r\n"); 

    

    Led1Init();

    Led1Off();    


Timer4Init();

enable();



    while(1)

    {

        if(gTimeTick1>1000-1)

        {

            gTimeTick1 = 0;

            Led1Toggle();

        }

    }

    

    return 0;

}


Posted by nexp

댓글을 달아 주세요