본문 바로가기

아두이노우노 R4

Arduino UNO R4의 FspTimer 라이브러리 사용법

반응형

 

 

1. 시작하기

 

Arduino UNO R4의 보급이 활발해져서 이미 구입하신 분들도 많을 것으로 생각됩니다. 이 보드에서 타이머 인터럽트를 사용하는 방법을 알아보다가 FspTimer라는 라이브러리가 표준으로 제공된다는 것을 알게 되어 사용법을 알아보았습니다.

 

2. FspTimer 구현

 

FspTimer의 헤더 파일과 소스 파일은 다음 위치에 있습니다.

 

C:\Users\%USERNAME%\AppData\Local\Arduino15\packages\arduino\hardware\renesas_uno\1.0.2\cores\arduino\FspTimer.h

 

C:\Users\%USERNAME%\AppData\Local\Arduino15\packages\arduino\hardware\renesas_uno\1.0.2\cores\arduino\FspTimer.cpp

 

사용법은? 찾았는데, API에 대한 설명은 찾아볼 수 없었습니다.

 

3. API 조사

 

우선 아래 소스에서 사용되는 것부터 사용법을 알아보겠습니다.

 

Arduino_LED_Matrix.h 

 

3.1 get_available_timer

 

형식

 

static int8_t get_available_timer(uint8_t &type, bool force = false);

 

설명

 

사용하지 않는 타이머 채널 번호와 타이머 종류를 가져온다. 타이머 채널 번호는 반환값으로, 타이머 종류는 첫 번째 인자로 가져옵니다. 타이머 종류는 GPT_TIMER 또는 AGT_TIMER가 반환됩니다. 처리를 보면 사용하지 않는 타이머는 GPT_TIMER에서 검색되며, 둘 중 하나를 지정해서 가져오는 것은 불가능해 보입니다.

 

사용 예시

 

 uint8_t timer_type;
    int8_t timer_ch = FspTimer::get_available_timer(timer_type);
    if (timer_ch < 0) {
        // 할당 실패
    }

 

3.2 begin

 

형식

 

bool begin(timer_mode_t mode, uint8_t type, uint8_t type, uint8_t channel, float freq_hz, float duty_perc, GPTimerCbk_f cbk = nullptr , void *ctx = nullptr );

 

설명

 

FspTimer의 인스턴스에 파라미터를 설정한다. 첫 번째 인수의 mode에 지정할 수 있는 것은 다음과 같다. 현재 어떤 동작이 될지는 미확인입니다. 

 

설명
TIMER_MODE_PERIODIC  주기적 타이머 
TIMER_MODE_ONE_SHOT  원샷 타이머 
TIMER_MODE_PWM  PWM 모드 
TIMER_MODE_ONE_SHOT_PULSE  원샷 펄스 모드 
TIMER_MODE_TRIANGLE_WAVE_SYMMETRIC_PWM  대칭 삼각파 PWM 모드 
TIMER_MODE_TRIANGLE_WAVE_ASYMMETRIC_PWM  비대칭 삼각파 PWM 모드 
TIMER_MODE_TRIANGLE_WAVE_ASYMMETRIC_PWM_MODE3  비대칭 삼각파 PWM 모드 3 

 

  • type과 channel은 앞서 설명한 get_available_timer()에서 가져온 값을 지정한다.
  • freq_hz에는 주파수를 float 형식으로 지정한다.
  • duty_perc에는 듀티비를 float 형식으로 지정한다.
  • cbk에는 인터럽트 발생 시 호출할 콜백 함수를 지정한다.
  • ctx에는 위의 콜백 함수에 전달할 인수를 지정합니다. 

 

사용 사례  

 

void timer_callback(timer_callback_args_t *arg);
uint8_t timer_type;
int8_t timer_ch
FspTimer fsp_timer;

fsp_timer.begin(TIMER_MODE_PERIODIC, timer_type, static_cast<uint8_t>(timer_ch), 1000.0, 25.0, timer_callback, nullptr);

 

 

FspTimer 클래스에는 다음과 같은 begin 메서드도 정의되어 있으므로, freq_hz와 duty_perc는 float로 지정한다. 

 

bool begin(timer_mode_t mode, uint8_t type, uint8_t channel,  uint32_t period, uint32_t pulse, timer_source_div_t sd, GPTimerCbk_f cbk = nullptr , void *ctx = nullptr);

 

 

3.3 setup_overflow_irq

 

형식

 

bool setup_overflow_irq(uint8_t priority = 12, Irq_f isr_fnc = nullptr );

 

설명

 

타이머 오버플로우 인터럽트를 활성화한다. 두 번째 인자 isr_fnc는 사용하지 않는 것으로 보인다.

 

사용 예시

 

FspTimer fsp_timer;

fsp_timer.setup_overflow_irq();

 

 

3.4 open

 

형식

 

bool open();

 

설명

 

해당 타이머의 채널을 활성화한다.

 

사용 예시 FspTimer fsp_timer; fsp_timer.open();

 

3.5 start

 

형식

 

bool start();

타이머를 시작합니다.

 

사용 예시

 

FspTimer fsp_timer;

fsp_timer.start();

 

 

4. 프로그램 예시 타이머를 사용하여 LED를 점멸시키는 프로그램입니다. 

 

#include <FspTimer.h>

static constexpr uint32_t led_on_ms = 100;
static constexpr uint32_t led_off_ms = 400; 

static FspTimer fsp_timer;

static bool is_led_on;

void
timer_callback([[maybe_unused]]timer_callback_args_t *arg)
{
  static uint32_t cnt = 0;

  cnt++;
  if (is_led_on) {
    if (cnt > led_on_ms) {
      digitalWrite(LED_BUILTIN, LOW);   // turn the LED off
      is_led_on = false;
      cnt = 0;
    }
  } else {
    if (cnt > led_off_ms) {
      digitalWrite(LED_BUILTIN, HIGH);   // turn the LED on
      is_led_on = true;
      cnt = 0;
    }
  }
}

void
setup()
{
  while (!Serial) {
    ;
  }
  pinMode(LED_BUILTIN, OUTPUT);
  digitalWrite(LED_BUILTIN, HIGH);  // turn the LED on
  is_led_on = true;

  uint8_t timer_type;
  int8_t timer_ch = FspTimer::get_available_timer(timer_type);
  if (timer_ch < 0) {
    Serial.println("get_available_timer() failed.");
    return;
  }
  fsp_timer.begin(TIMER_MODE_PERIODIC, timer_type, static_cast<uint8_t>(timer_ch), 1000.0, 25.0, timer_callback, nullptr);
  fsp_timer.setup_overflow_irq();
  fsp_timer.open();
  fsp_timer.start();
  Serial.println("started.");
}

void
loop()
{
  __WFI(); 
}

 

 

5. 앞으로의 방침 다음에는 FspTimer의 PWM 기능을 알아보고 싶습니다. 

 

 

참고 문서 

 

잘 정리한 일본어 사이트 

위 내용을 쓴 개발자 사이트 - 좋은 내용 많네. 

 

 

 

 

 

반응형

캐어랩 고객 지원

취업, 창업의 막막함, 외주 관리, 제품 부재!

당신의 고민은 무엇입니까? 현실과 동떨어진 교육, 실패만 반복하는 외주 계약, 아이디어는 있지만 구현할 기술이 없는 막막함.

우리는 알고 있습니다. 문제의 원인은 '명확한 학습, 실전 경험과 신뢰할 수 있는 기술력의 부재'에서 시작됩니다.

이제 고민을 멈추고, 캐어랩을 만나세요!

코딩(펌웨어), 전자부품과 디지털 회로설계, PCB 설계 제작, 고객(시장/수출) 발굴과 마케팅 전략으로 당신을 지원합니다.

제품 설계의 고수는 성공이 만든 게 아니라 실패가 만듭니다. 아이디어를 양산 가능한 제품으로!

귀사의 제품을 만드세요. 교육과 개발 실적으로 신뢰할 수 있는 파트너를 확보하세요.

지난 30년 여정, 캐어랩이 얻은 모든 것을 함께 나누고 싶습니다.

카카오 채널 추가하기

카톡 채팅방에서 무엇이든 물어보세요

귀사가 성공하기까지의 긴 고난의 시간을 캐어랩과 함께 하세요.

캐어랩 온라인 채널 바로가기

캐어랩