b. 임베디드/EK-RA2E1

[EK-RA2E1] Timer GPT0 사용하기

로봇쟁이 2022. 4. 22. 13:53

RA2E1에서 타이머가 3가지 존재합니다.

GPT, AGT, RTC (사실 Cortex M시리즈는 systick 도 존재하는데 사용법을 찾아봤는데 일단 보이질 않아서 패스)

 

일단 FSP를 사용했고 millis() 함수를 만들기 위해서 일반적인 타이머인 GPT를 사용했습니다.

 

 

 

 

일단 핀 설정은 하지 않고 Timer overflow interrupt를 이용하고 user_gpt_callback 함수를 만들었습니다.

 

별도 타이머 파일을 만들어서 다음가 같이 정리했습니다.

 

 

#include "gpt_timer.h"



static volatile uint32_t ms_cnt = 0;
uint8_t g_timer_open_state = RESET_VALUE;


fsp_err_t init_gpt_timer(timer_ctrl_t * const p_timer_ctl, timer_cfg_t const * const p_timer_cfg, uint8_t timer_mode)
{
    fsp_err_t err = FSP_SUCCESS;

    /* Initialize GPT Timer */
    err = R_GPT_Open(p_timer_ctl, p_timer_cfg);
    if (FSP_SUCCESS != err)
    {
        return err;
    }
    if(PERIODIC_MODE_TIMER == timer_mode)
    {
        g_timer_open_state = PERIODIC_MODE;
    }
    else if(PWM_MODE_TIMER == timer_mode)
    {
        g_timer_open_state = PWM_MODE;
    }
    else
    {
        g_timer_open_state = ONE_SHOT_MODE;
    }
    return err;
}


fsp_err_t start_gpt_timer (timer_ctrl_t * const p_timer_ctl)
{
    fsp_err_t err = FSP_SUCCESS;


    err = R_GPT_Start(p_timer_ctl);
    if (FSP_SUCCESS != err)
    {

    }
    return err;
}


void deinit_gpt_timer(timer_ctrl_t * const p_timer_ctl)
{
    fsp_err_t err = FSP_SUCCESS;

    err = R_GPT_Close(p_timer_ctl);
    if (FSP_SUCCESS != err)
    {

    }

    g_timer_open_state = RESET_VALUE;
}


uint32_t get_tick(void)
{
    return ms_cnt;
}


void user_gpt_callback(timer_callback_args_t *p_args)
{
    if(p_args != NULL)
    {
        ms_cnt++;
    }
}

 

callback 함수에는 변수를 카운팅하였고 타이머 초기화 함수를 별도로 만들었습니다.

 

void timer_init(void)
{
    fsp_err_t err = FSP_SUCCESS;
    uint64_t period_counts = 0;
    uint32_t pclkd_freq_hz = 0;

    pclkd_freq_hz = R_FSP_SystemClockHzGet(FSP_PRIV_CLOCK_PCLKD);
    pclkd_freq_hz >>= (uint32_t)(g_timer0_cfg.source_div);


    period_counts = (uint64_t)((1 * (pclkd_freq_hz * CLOCK_TYPE_SPECIFIER))  / TIMER_UNITS_MILLISECONDS);



    err = init_gpt_timer(&g_timer0_ctrl, &g_timer0_cfg, PERIODIC_MODE_TIMER);
    if(FSP_SUCCESS != err)
    {
        APP_ERR_PRINT("** GPT TIMER INIT FAILED ** \r\n");
        APP_ERR_TRAP(err);
    }

    err = start_gpt_timer(&g_timer0_ctrl);
    if(FSP_SUCCESS != err)
    {
        APP_ERR_PRINT("** GPT TIMER START FAILED ** \r\n");
        /*Close Periodic Timer instance */
        deinit_gpt_timer(&g_timer0_ctrl);
        APP_ERR_TRAP(err);
    }
    APP_PRINT("Started Timer in Periodic Mode\r\n");

    R_GPT_PeriodSet(&g_timer0_ctrl, (uint32_t)period_counts);
}




uint32_t millis(void)
{
    return get_tick();
}

 

hal_entry()함수

void hal_entry(void)
{
    uint32_t pre_time;
    bsp_io_level_t state = BSP_IO_LEVEL_HIGH;

    device_init();

    pre_time = millis();
    while(1)
    {
        if(millis() - pre_time >= 100)
        {
            pre_time = millis();
            if(state == BSP_IO_LEVEL_HIGH)
            {
                state = BSP_IO_LEVEL_LOW;
            }
            else
            {
                state = BSP_IO_LEVEL_HIGH;
            }
            R_IOPORT_PinWrite(&g_ioport_ctrl, LED, state);
        }
    }





#if BSP_TZ_SECURE_BUILD
    /* Enter non-secure code */
    R_BSP_NonSecureEnter();
#endif
}

 

동작 확인 완료 ^^;

반응형