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
}
동작 확인 완료 ^^;
반응형
'b. 임베디드 > EK-RA2E1' 카테고리의 다른 글
[EK-RA2E1] UART 출력 (0) | 2022.04.25 |
---|---|
[EK-RA2E1] GPIO Output 출력 (0) | 2022.04.21 |
[EK-RA2E1] 개발보드 기본자료 (0) | 2022.04.20 |