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(); }
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); } }
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); } }