コード例 #1
0
ファイル: armv7m-cpucounter.c プロジェクト: gedare/rtems
static void armv7m_cpu_counter_initialize(void)
{
  bool cyccnt_enabled;

  cyccnt_enabled = _ARMV7M_DWT_Enable_CYCCNT();

  if (cyccnt_enabled) {
    #ifdef BSP_ARMV7M_SYSTICK_FREQUENCY
      uint64_t freq = BSP_ARMV7M_SYSTICK_FREQUENCY;
    #else
      volatile ARMV7M_Systick *systick = _ARMV7M_Systick;
      uint64_t freq = ARMV7M_SYSTICK_CALIB_TENMS_GET(systick->calib) * 100ULL;
    #endif

    rtems_counter_initialize_converter(freq);
  } else {
    bsp_fatal(BSP_ARM_ARMV7M_CPU_COUNTER_INIT);
  }
}
コード例 #2
0
ファイル: armv7m-clock-config.c プロジェクト: AoLaD/rtems
static void _ARMV7M_Systick_initialize(void)
{
  volatile ARMV7M_DWT *dwt = _ARMV7M_DWT;
  volatile ARMV7M_Systick *systick = _ARMV7M_Systick;
  #ifdef BSP_ARMV7M_SYSTICK_FREQUENCY
    uint64_t freq = BSP_ARMV7M_SYSTICK_FREQUENCY;
  #else
    uint64_t freq = ARMV7M_SYSTICK_CALIB_TENMS_GET(systick->calib) * 100ULL;
  #endif
  uint64_t us_per_tick = rtems_configuration_get_microseconds_per_tick();
  uint64_t interval = (freq * us_per_tick) / 1000000ULL;
  uint32_t dwt_ctrl;

  systick->rvr = (uint32_t) interval;
  systick->cvr = 0;
  systick->csr = ARMV7M_SYSTICK_CSR_ENABLE
    | ARMV7M_SYSTICK_CSR_TICKINT
    | ARMV7M_SYSTICK_CSR_CLKSOURCE;

  dwt_ctrl = dwt->ctrl;
  if ((dwt_ctrl & ARMV7M_DWT_CTRL_NOCYCCNT) == 0) {
    dwt->ctrl = dwt_ctrl | ARMV7M_DWT_CTRL_CYCCNTENA;
    _ARMV7M_TC.base.tc.tc_get_timecount = _ARMV7M_TC_dwt_get_timecount;
    _ARMV7M_TC.base.tc.tc_counter_mask = 0xffffffff;
    _ARMV7M_TC.base.tc.tc_frequency = freq;
    _ARMV7M_TC.base.tc.tc_quality = RTEMS_TIMECOUNTER_QUALITY_CLOCK_DRIVER;
    _ARMV7M_TC.tick = _ARMV7M_TC_dwt_tick;
    rtems_timecounter_install(&_ARMV7M_TC.base.tc);
  } else {
    _ARMV7M_TC.tick = _ARMV7M_TC_systick_tick;
    rtems_timecounter_simple_install(
      &_ARMV7M_TC.base,
      freq,
      interval,
      _ARMV7M_TC_systick_get_timecount
    );
  }
}
コード例 #3
0
ファイル: armv7m-clock-config.c プロジェクト: asuol/rtems
static void _ARMV7M_Systick_initialize(void)
{
  volatile ARMV7M_Systick *systick = _ARMV7M_Systick;
  #ifdef BSP_ARMV7M_SYSTICK_FREQUENCY
    uint64_t freq = BSP_ARMV7M_SYSTICK_FREQUENCY;
  #else
    uint64_t freq = ARMV7M_SYSTICK_CALIB_TENMS_GET(systick->calib) * 100ULL;
  #endif
  uint64_t us_per_tick = rtems_configuration_get_microseconds_per_tick();
  uint64_t interval = (freq * us_per_tick) / 1000000ULL;

  systick->rvr = (uint32_t) interval;
  systick->cvr = 0;
  systick->csr = ARMV7M_SYSTICK_CSR_ENABLE
    | ARMV7M_SYSTICK_CSR_TICKINT
    | ARMV7M_SYSTICK_CSR_CLKSOURCE;

  rtems_timecounter_simple_install(
    &_ARMV7M_TC,
    freq,
    interval,
    _ARMV7M_TC_get_timecount
  );
}