コード例 #1
0
ファイル: uptime.c プロジェクト: shiohuang/bsp430
void
vBSP430uptimeStart_ni (void)
{
  xBSP430uptimeTIMER_ = hBSP430timerLookup(BSP430_UPTIME_TIMER_PERIPH_HANDLE);
  vBSP430timerSafeCounterInitialize_ni(xBSP430uptimeTIMER_->hpl);
  xBSP430uptimeTIMER_->hpl->ctl = 0;
  vBSP430timerResetCounter_ni(xBSP430uptimeTIMER_);
  xBSP430uptimeTIMER_->hpl->ctl =
    ((TASSEL0 | TASSEL1) & (BSP430_UPTIME_TASSEL))
    | ((ID0 | ID1) & (BSP430_UPTIME_DIVIDING_SHIFT * ID0))
    | TACLR | TAIE;
  vBSP430timerInferHints_ni(xBSP430uptimeTIMER_);
#if (configBSP430_UPTIME_DELAY - 0)
  {
    hBSP430timerAlarm delay_alarm;

    delayAlarm_.flags = 0;
    delay_alarm = hBSP430timerAlarmInitialize(&delayAlarm_.alarm, BSP430_UPTIME_TIMER_PERIPH_HANDLE, BSP430_UPTIME_DELAY_CCIDX, delayCallback_);
    while (H_delayAlarm != delay_alarm) {
      /* Hang if the alarm cannot be used. */
    }
    delayAlarm_.flags = DELAY_ALARM_VALID | DELAY_ALARM_ENABLED | DELAY_ALARM_TIMER_ACTIVE;
  }
#endif /* configBSP430_UPTIME_DELAY */
  vBSP430uptimeResume_ni();
}
コード例 #2
0
ファイル: main.c プロジェクト: pabigot/bsp430
void main ()
{
  sBSP430halPORT * port_hal;
  hBSP430halTIMER hal;
  volatile sBSP430hplTIMER * hpl;

  vBSP430platformInitialize_ni();
  (void)iBSP430consoleInitialize();
  cputchar('\n');
  BSP430_CORE_DELAY_CYCLES(BSP430_CLOCK_NOMINAL_MCLK_HZ / 1000);

  cprintf("\n\nsynccap " __DATE__ " " __TIME__ "\n");
  cprintf("External input on %s.%u corresponds to %s.%u%c\n",
          xBSP430portName(BSP430_TIMER_CCACLK_CC1_PORT_PERIPH_HANDLE),
          bitToPin(BSP430_TIMER_CCACLK_CC1_PORT_BIT),
          xBSP430timerName(BSP430_TIMER_CCACLK_PERIPH_HANDLE),
          PORT_CCIDX,
          'A' + (BSP430_TIMER_CCACLK_CC1_CCIS / CCIS0));
  port_hal = hBSP430portLookup(BSP430_TIMER_CCACLK_CC1_PORT_PERIPH_HANDLE);
  if (NULL == port_hal) {
    cprintf("Port HAL not available\n");
    return;
  }
  hal = hBSP430timerLookup(BSP430_TIMER_CCACLK_PERIPH_HANDLE);
  if (NULL == hal) {
    cprintf("Can't find timer\n");
    return;
  }

  BSP430_PORT_HAL_HPL_DIR(port_hal) &= ~BSP430_TIMER_CCACLK_CC1_PORT_BIT;
  BSP430_PORT_HAL_HPL_SEL(port_hal) |= BSP430_TIMER_CCACLK_CC1_PORT_BIT;
  hpl = hal->hpl;
  hpl->cctl[1] = CM_3 | BSP430_TIMER_CCACLK_CC1_CCIS | SCS | CAP | CCIE;
  captured.last_cci = !!(hpl->cctl[1] & CCI);
  BSP430_HAL_ISR_CALLBACK_LINK_NI(sBSP430halISRIndexedChainNode,
                                  hal->cc_cbchain_ni[PORT_CCIDX],
                                  captured.cb,
                                  next_ni);
  hpl->ctl = TASSEL_2 | MC_2 | TACLR | TAIE;

  /* Need to enable interrupts so timer overflow events are properly
   * acknowledged */
  while (1) {
    unsigned int ccr;
    unsigned int cctl;
    unsigned int count;
    unsigned int errors;
    int last_cci;
    unsigned long event_tt;

    BSP430_CORE_DISABLE_INTERRUPT();
    do {
      event_tt = captured.event_tt;
      captured.event_tt = 0;
      count = captured.count;
      errors = captured.errors;
      captured.count = 0;
      captured.errors = 0;
      last_cci = captured.last_cci;
      cctl = hpl->cctl[PORT_CCIDX];
      ccr = hpl->ccr[PORT_CCIDX];
      hpl->cctl[PORT_CCIDX] &= ~COV;
    } while (0);
    BSP430_CORE_ENABLE_INTERRUPT();

    cprintf("Up %lu ACLK ticks, timer %lu event %lx ccr %x cctl %04x\n"
            "\tCCI %d SCCI %d COV %d ; recorded CCI %d ; count %u errors %d\n",
            ulBSP430uptime(),
            ulBSP430timerCounter(hal, NULL),
            event_tt,
            ccr,
            cctl,
            !!(cctl & CCI), !!(cctl & SCCI), !!(cctl & COV), last_cci, count, errors);
    BSP430_CORE_DELAY_CYCLES(BSP430_CLOCK_NOMINAL_MCLK_HZ);
  }
}
コード例 #3
0
ファイル: main.c プロジェクト: JOHNNYROJASMED/bsp430
void main ()
{
  volatile sBSP430hplPORTIE * b0hpl;
  hBSP430halTIMER b0timer_hal;
  int b0pin = iBSP430portBitPosition(BSP430_PLATFORM_BUTTON0_PORT_BIT);
  struct sBSP430timerPulseCapture pulsecap_state;
  hBSP430timerPulseCapture pulsecap;
  unsigned long freq_Hz;
  int rc;

  vBSP430platformInitialize_ni();
  (void)iBSP430consoleInitialize();

  cprintf("\npulsecap " __DATE__ " " __TIME__ "\n");

  cprintf("There's supposed to be a button at %s.%u\n",
          xBSP430portName(BSP430_PLATFORM_BUTTON0_PORT_PERIPH_HANDLE),
          b0pin);
  b0hpl = xBSP430hplLookupPORTIE(BSP430_PLATFORM_BUTTON0_PORT_PERIPH_HANDLE);
  if (NULL == b0hpl) {
    cprintf("Guess it's not there.  Never mind.\n");
    return;
  }
  cprintf("Found it at %p.  Now looking for timer HAL.\n", b0hpl);
  b0timer_hal = hBSP430timerLookup(BUTTON0_TIMER_PERIPH_HANDLE);
  if (NULL == b0timer_hal) {
    cprintf("That's not there, though.  Going away now.\n");
    return;
  }
  vBSP430timerResetCounter_ni(b0timer_hal);
  b0timer_hal->hpl->ctl = TASSEL__SMCLK | MC__CONTINOUS | TBCLR | TBIE;
  vBSP430timerInferHints_ni(b0timer_hal);
  freq_Hz = ulBSP430timerFrequency_Hz_ni(BUTTON0_TIMER_PERIPH_HANDLE);

  cprintf("Cool, we're good to go with a %lu Hz timer at %p, now %lu.\n",
          freq_Hz, b0timer_hal, ulBSP430timerCounter_ni(b0timer_hal, NULL));

  /* Configure the port for its primary peripheral function */
  b0hpl->dir &= ~BSP430_PLATFORM_BUTTON0_PORT_BIT;
  BSP430_PORT_HPL_SET_REN(b0hpl, BSP430_PLATFORM_BUTTON0_PORT_BIT, BSP430_PORT_REN_PULL_UP);
  BSP430_PORT_HPL_SET_SEL(b0hpl, BSP430_PLATFORM_BUTTON0_PORT_BIT, 1);

  pulsecap = hBSP430timerPulseCaptureInitialize(&pulsecap_state,
                                                BUTTON0_TIMER_PERIPH_HANDLE,
                                                BUTTON0_TIMER_CCIDX,
                                                BUTTON0_TIMER_CCIS,
                                                BSP430_TIMER_PULSECAP_START_CALLBACK | BSP430_TIMER_PULSECAP_END_CALLBACK,
                                                pulsecap_callback_ni);
  if (NULL == pulsecap) {
    cprintf("Sorry, pulsecap initialization failed\n");
    return;
  }
  cprintf("%s.%u%c cctl %04x; pulsecap %p flags %04x\n",
          xBSP430timerName(BUTTON0_TIMER_PERIPH_HANDLE),
          BUTTON0_TIMER_CCIDX,
          'A' + (BUTTON0_TIMER_CCIS / CCIS0),
          b0timer_hal->hpl->cctl[BUTTON0_TIMER_CCIDX],
          pulsecap, pulsecap->flags_ni);

  /* Need to enable interrupts so timer overflow events are properly
   * acknowledged */
  BSP430_CORE_ENABLE_INTERRUPT();

  rc = iBSP430timerPulseCaptureEnable(pulsecap);
  cprintf("Enable got %d\n", rc);
  rc = iBSP430timerPulseCaptureActivate(pulsecap);
  cprintf("Activate got %d\n", rc);
  while (1) {
    unsigned int flags;
    unsigned long pulseWidth_tt;
    unsigned int overflows;
    unsigned int activehighs;

    BSP430_CORE_DISABLE_INTERRUPT();
    do {
      flags = pulsecap_state.flags_ni;
      pulseWidth_tt = pulseWidth_tt_v;
      overflows = overflows_v;
      activehighs = activehighs_v;
    } while (0);
    BSP430_CORE_ENABLE_INTERRUPT();
    cprintf("Timer %lu flags %04x ; %u over %u activehigh\n",
            ulBSP430timerCounter(b0timer_hal, NULL),
            flags, overflows, activehighs);
    if (0 != pulseWidth_tt) {
      cprintf("\tNew width: %lu ticks = %lu us\n", pulseWidth_tt,
              (unsigned long)((1000ULL * pulseWidth_tt) / (freq_Hz / 1000UL)));
      pulseWidth_tt = 0;
    }
    BSP430_CORE_DELAY_CYCLES(BSP430_CLOCK_NOMINAL_MCLK_HZ);
  }
}