1. Overview
This module demonstrates how to implement a vehicle lighting control system using analog input acquisition and FlexIO-based LED driving on NXP S32K3 microcontrollers.
The application reads analog inputs from the Analog Key Click module (six push-buttons, each generating a distinct voltage level) and converts them into commands that drive a 4x4 RGB LED matrix. Each button press activates a specific lighting function — low beam, high beam, turn signals, brake lights, or hazard lights — while safety interlocks and blinking patterns run continuously in the background, mimicking how a real automotive Body Control Module (BCM) manages vehicle lighting.
This example is based on Application Code Hub demonstrations for:
In this workshop, the Analog Key Click simulates six vehicle lighting controls. When the student presses a button, an analog voltage proportional to the pressed key is read by the MCU through the ADC (with software debouncing), decoded into a specific lighting command, and translated into an RGB pattern generated by the FlexIO peripheral. The 4x4 RGB Click then displays the corresponding automotive lighting behavior in real time — warm white for low beams, cool white for high beams, blinking amber for turn signals and hazards, and red for brake lights.
Beyond the technical implementation, the course serves as a foundation for the Eat-Sleep-Code-Repeat learning initiative, encouraging a hands-on approach where students continuously learn, develop, test, and improve automotive embedded applications using real hardware and practical examples.
2. Learning Scope
After completing this course, participants should be able to:
- Understand a basic vehicle lighting control system and the ideas behind an automotive Body Control Module (BCM).
- Use the Analog Key Click as a simulated multi-button user interface (six inputs on a single analog line).
- Acquire analog values (0–3.3 V) using the ADC and understand how multiple buttons share one channel through voltage division.
- Perform software debouncing and decode which button was pressed based on ADC value ranges.
- Drive an RGB LED matrix using the FlexIO peripheral, generating precise timing for WS2812-style LEDs.
- Implement safety interlocks between lighting functions (e.g., high beam requires low beam ON).
- Implement continuous background patterns such as blinking turn signals and synchronized hazards.
- Recognize the actuation data flow: analog input → ADC → command decoding → FlexIO LED output.
- Import, build, flash, and debug an ACH project in S32 Design Studio 3.6.5.
- Understand why lighting functions are relevant for automotive safety and driver visibility.
3. System Architecture
The three elements capture exactly the basic idea of the system in the demo:
- Input: Analog Key Click (six buttons T1–T6, each generating a distinct analog voltage level)
- Processing: S32K3 MCU (reads the ADC, decodes the button, applies BCM logic, updates the LED state)
- Output: 4x4 RGB Click (16-LED matrix driven by FlexIO to display lighting patterns)
This matches the classic flow of an embedded body-control system: sensor → processing → actuator.
Functional Flow
The system operates continuously as follows:
- The user presses a button on the Analog Key Click (T1–T6)
- Each button generates a distinct analog voltage on the shared output line
- The ADC samples the voltage and converts it into a digital value
- The application decodes which button was pressed (with debouncing)
- The BCM logic applies interlocks and dependencies (e.g., high beam requires low beam)
- The FlexIO peripheral drives the RGB Click LEDs with the corresponding color pattern
This loop runs continuously to ensure real-time lighting control, with blinking patterns and safety interlocks maintained in the background.
Vehicle Lighting Control Application Architecture
4. Key Concepts
4.1 ADC (Analog-to-Digital Converter)
The Analog Key Click outputs 0–3.3 V on a single analog line, with each button generating a specific voltage step. The ADC samples this voltage on ADC0_P0 (pin PTD1) at regular intervals and quantizes it into a digital code (a 12-bit ADC produces values between 0 and 4095). Each button corresponds to a specific value range, allowing six digital inputs to be read through a single ADC channel. ADC acquisition is the foundation of automotive sensing — used for switches, buttons, sensors, and many others.
4.2 Analog Multi-Button Decoding
Instead of using six separate GPIO pins, the Analog Key Click uses a resistor ladder that produces a different voltage for each button press. The application performs software debouncing (multiple ADC samples must agree before a press is confirmed) and then compares the ADC value against predefined thresholds to identify which button (T1–T6) was pressed. This technique is common in automotive steering-wheel controls, where many buttons share a single analog line to save wiring and pins.
4.3 FlexIO — Driving the RGB Click LEDs
FlexIO is a highly flexible peripheral on S32K3 that can emulate serial protocols like WS2812/NeoPixel. The RGB Click uses individually addressable LEDs that require precise timing (~800 kHz with strict pulse widths). FlexIO on PTA13 (FlexIO_D8) generates this waveform in hardware, without loading the CPU. Each of the 16 LEDs receives its color data through a serial stream, allowing independent control of color and brightness per LED.
4.4 RGB LED Mapping and Lighting Zones
The 16 LEDs of the RGB Click are logically grouped into automotive lighting zones:
- LEDs 13, 14 → Low Beam Headlights (warm white)
- LEDs 8, 9, 10, 11 → High Beam Headlights (cool white)
- LEDs 0, 12 → Left Turn Signal (blinking amber)
- LEDs 3, 15 → Right Turn Signal (blinking amber)
- LEDs 1, 2, 5, 6 → Brake Lights (red)
- LEDs 0, 3, 12, 15 → Hazard Lights (synchronized blinking amber)
4.5 BCM Safety Interlocks and State Dependencies
The application implements safety logic typical of a real Body Control Module: high beam can only be activated when low beam is already ON; turning OFF the low beam automatically disables the high beam; hazard lights synchronize left and right turn signals simultaneously; high beam state is preserved during hazard blinking and restored between cycles. These interlocks illustrate how real automotive lighting logic prevents unsafe combinations and preserves driver intent.
4.6 Data Flow at a Glance
Button press → analog voltage on shared line → ADC sample → software debouncing → button decoding → BCM logic (interlocks + dependencies) → FlexIO WS2812 output stream → RGB LED color update. This direct chain from the student's finger to the LEDs is the main educational value of the demo.
5. Hardware and Software Setup
Required Hardware
| Component |
Image |
Purpose |
| FRDM-A-S32K312 |
 |
Alternative MCU platform used to run the lighting application and process user inputs.
|
| FRDM-A-S32K344 |
 |
Alternative MCU platform used to run the lighting application and control connected peripherals.
|
| FRDM-K64 Click Shield |
 |
mikroBUS expansion board used to connect Click modules to the FRDM platform.
|
| Analog Key Click |
 |
Six-button analog module used to simulate the vehicle lighting controls (headlights, indicators, brakes, hazards).
|
| 4x4 RGB Click |
 |
16-LED RGB matrix used to display the automotive lighting patterns in real time.
|
| USB-C / 12 V supply |
— |
Provides power and enables programming and debugging of the system through a single USB-C connection.
|
The example applications demonstrate how these peripherals are connected to the MCU pins and used to simulate a complete vehicle lighting control system.
| Vehicle Lighting Control on FRDM-A-S32K312 |
Vehicle Lighting Control on FRDM-A-S32K344 |
 |
 |
Software Environment
6. Implementation Guide
| Step |
Action |
Sub-steps |
Expected Result |
| 1 |
Import the Project |
- Open S32 Design Studio 3.6.5
- Select “Import project from Application Code Hub”
- Search for “Lighting”
- Select the desired project for your FRDM board
- Use the GitHub link for automatic configuration
- Select main branch
- Import project
|
Project successfully appears in workspace |
| 2 |
Build the Application |
- Right-click project
- Select “Update Code and Build Project”
- Confirm SDK component management
|
Build completes with no errors and generates .elf file |
| 3 |
Connect Hardware |
- Connect USB-C cable (and 12 V supply for FRDM-A-S32K312)
- Attach FRDM-K64 Click Shield, Analog Key Click and 4x4 RGB Click
- Verify wiring on PTA13 (FlexIO) and PTD1 (ADC)
|
Board is powered and detected by IDE |
| 4 |
Flash and Run |
- Open Debug Configurations
- Select “debug_flash_pemicro”
- Start debugging
|
Application runs continuously; LEDs perform startup test sequence |
| 5 |
Functional Validation |
- Press buttons T1–T6 on the Analog Key Click
- Observe corresponding LED patterns on the RGB Click
- Verify safety interlocks (high beam requires low beam)
- Verify continuous blinking on turn signals and hazards
|
RGB LEDs display the correct automotive lighting patterns for each button |
7. Signal Behavior and Control Logic
The following diagram illustrates how each user input on the Analog Key Click is mapped to a specific lighting function and to the individual LEDs of the 4×4 RGB Click matrix. Each button (T1–T6) triggers a unique combination of LEDs, colors, and patterns, reproducing the behavior of a simplified automotive lighting system.

The MCU continuously monitors the analog input from the Analog Key Click and decodes which button is pressed. Based on the detected input, the application activates the corresponding lighting function by driving the assigned LEDs on the 4×4 RGB Click through the FlexIO serial interface. Steady functions (Low Beam, High Beam, Brake) keep the associated LEDs constantly ON, while directional functions (Left Turn, Right Turn, Hazard) toggle the LEDs at approximately 1 Hz to reproduce the blinking behavior of real vehicle indicators. Additional control rules — such as High Beam requiring Low Beam to be active, or Hazard Lights preserving and restoring the High Beam state — reflect the interdependencies found in a real automotive body control module.
8. Troubleshooting
| Issue |
Possible Actions |
| Board Not Detected |
- Check USB-C cable and drivers
- Verify debugger connection
- Restart IDE
|
| No LEDs Lighting Up |
- Verify FlexIO configuration on PTA13
- Check 3.3 V and GND wiring on RGB Click
- Confirm data-line wiring to IN1
|
| Buttons Not Detected |
- Verify ADC0_P0 configuration on PTD1
- Check 3.3 V and GND wiring on Analog Key Click
- Confirm software debouncing thresholds
|
| Wrong Button Triggered |
- Recalibrate ADC value ranges for each button
- Verify power supply stability (3.3 V)
- Check for noise on the analog line
|
| Incorrect LED Colors or Timing |
- Verify FlexIO clock configuration (WS2812 timing)
- Check LED index → color mapping in code
- Ensure RGB order (GRB vs. RGB) matches the LED type
|
| High Beam Not Activating |
- Ensure low beam (T1) is ON first — BCM interlock
- Check application logic for beam dependencies
|
9. Extending the Application
The basic implementation can be extended in several ways:
Additional Lighting Functions
-
Add fog lights, parking lights, or daytime running lights (DRL)
-
Simulate reverse lights that activate when a specific input is triggered
Adaptive Front Lighting
-
Integrate a steering angle input (e.g., POT Click) to swivel the headlights
-
Simulate cornering lights that turn on when indicators are active
Ambient Light Sensing
Brake Light Enhancements
-
Add an emergency brake flashing pattern for hard braking
-
Implement a third brake light (single LED, always ON with brakes)
CAN Communication
-
Enable communication with other vehicle ECUs (e.g., BCM master, doors)
-
Receive lighting commands over the vehicle network
State Machine Implementation A more advanced approach is to implement a formal state machine covering:
-
Off
-
DRL / Parking
-
Low Beam
-
High Beam
-
Hazard / Fault
10. Safety Context
This example reflects key automotive principles:
-
Continuous monitoring of driver input
-
Immediate response to control signals
-
Reliable actuator (LED) control with predictable timing
-
Safety interlocks between lighting functions (high beam requires low beam)
In real systems:
-
Redundancy is required for safety-relevant functions (e.g., brake lights, hazards)
-
Fault detection mechanisms are implemented (open lamp, short circuit, overcurrent)
-
Systems must comply with ISO 26262 (functional safety standard)
Vehicle lighting is one of the most safety-critical automotive functions because it directly affects driver visibility and vehicle conspicuity. Modern Body Control Modules implement extensive diagnostics, backup lighting strategies, and fail-safe defaults (e.g., hazard lights activated on power-loss recovery).
11. Conclusion
This module demonstrates how a simple embedded system can implement complete vehicle lighting control using ADC input and FlexIO output on the S32K3 platform.
It shows how:
-
Multiple digital inputs can share a single analog line through resistor-ladder decoding
-
Analog data is acquired, debounced and processed in real time
-
Complex automotive lighting patterns are controlled through FlexIO-driven WS2812 LEDs
-
Safety interlocks and background blinking patterns are managed by BCM-style logic
| Result on FRDM-A-S32K312 |
Result on FRDM-A-S32K344 |
FRDM-A-S32K312 |
FRDM-A-S32K344 |
The course provides a strong foundation for more advanced systems, including adaptive lighting, CAN networking, ambient sensing, and safety-oriented designs typical of automotive body-control modules.