MCPcopy Create free account
hub / github.com/FastLED/FastLED / begin

Method begin

src/platforms/arm/lpc/rx_sct_capture.cpp.hpp:351–479  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

349// ============================================================================
350
351bool LpcSctRxChannel::begin(const RxConfig& config) FL_NOEXCEPT {
352 mFinished = false;
353 mCapacity = config.buffer_size > 0 ? config.buffer_size : 4096u;
354 mPrevTick = 0;
355 mPrevSeen = false;
356 mLastRising = false;
357 mEdges.clear();
358 mEdges.reserve(mCapacity);
359
360#if defined(FASTLED_LPC_RX_SCT) && defined(FL_IS_ARM_LPC_845)
361 // ---- 1. Power up SCT + SWM (and DMA when the DMA path is opted in),
362 // then pulse their resets. ----
363 reg(kSysconBase, kOffSYSAHBCLKCTRL0) |= (kClkSCT | kClkSWM
364#if defined(FASTLED_LPC_RX_SCT_DMA)
365 | kClkDMA
366#endif
367 );
368 volatile fl::u32& presetctrl = reg(kSysconBase, kOffPRESETCTRL0);
369 presetctrl &= ~(kRstSCT | kRstSWM
370#if defined(FASTLED_LPC_RX_SCT_DMA)
371 | kRstDMA
372#endif
373 ); // assert reset (low pulse)
374 presetctrl |= (kRstSCT | kRstSWM
375#if defined(FASTLED_LPC_RX_SCT_DMA)
376 | kRstDMA
377#endif
378 ); // release reset
379
380 // ---- 2. Route mPin -> SCT input 0 via SWM PINASSIGN6 byte[31:24]. ----
381 swmAssignSctInput0(static_cast<fl::u8>(mPin & 0xFFu));
382
383 // ---- 3. Configure SCT: UNIFY counter + INSYNC for input 0. ----
384 // The 2-clock synchronizer adds ~67 ns of capture jitter at F_CPU=30 MHz,
385 // well below the WS2812 T0H/T1H discrimination window (~500 ns margin).
386 sct(kOffCTRL) = kCtrlHaltL | kCtrlClrCtrL; // halted, counter zeroed
387 sct(kOffCONFIG) = kCfgUnify | kCfgInsync0;
388 sct(kOffLIMIT) = 0u; // free-running counter
389 sct(kOffCOUNT) = 0u;
390
391 // ---- 4. Mark register slots 0 + 1 as CAPTURE (REGMODE bits 0,1 = 1). ----
392 sct(kOffREGMODE) = (1u << 0) | (1u << 1);
393
394 // ---- 5. Event 0 → rising edge on SCT input 0 → captures into CAP[0].
395 // Event 1 → falling edge on SCT input 0 → captures into CAP[1].
396 sct_ev_state(0) = 0x1u; // active in STATE 0
397 sct_ev_ctrl (0) = evCtrlInputCapture(0u, kIoCondRise);
398 sct_ev_state(1) = 0x1u;
399 sct_ev_ctrl (1) = evCtrlInputCapture(0u, kIoCondFall);
400
401 sct_capctrl(0) = (1u << 0); // EV0 loads CAP[0]
402 sct_capctrl(1) = (1u << 1); // EV1 loads CAP[1]
403
404 sct(kOffEVEN) = 0u; // polling mode — IRQs off
405 sct(kOffEVFLAG) = 0xFFu; // clear any stale flags
406
407#if defined(FASTLED_LPC_RX_SCT_DMA)
408 // ---- 6. SCT → DMA wiring. ----

Callers

nothing calls this directly

Calls 8

swmAssignSctInput0Function · 0.85
evCtrlInputCaptureFunction · 0.85
sct_cap_addrFunction · 0.85
kDmaChCfgFunction · 0.85
kXferCountFunction · 0.85
kDmaChXferCfgFunction · 0.85
clearMethod · 0.45
reserveMethod · 0.45

Tested by

no test coverage detected