工具/软件:
我正在使用 TMS320F280049C 微控制器,我想使用 Ws2812B neo 像素 led 来点亮我所需的颜色,并在我的代码它打开所有 数量提到的 LED 的白色,而不是我所需的颜色。 我会附上代码。 请帮助我尽快解决此问题。 谢谢你。
#include "device.h"
#include "gpio.h"
#define NEOPIXEL_PIN 4
#define NUM_LEDS 2 // Number of LEDs
#define BLINK_DELAY 500000 // 500ms delay
// GRB color values (0-255)
#define RED 0, 255, 0 // Green component for red color
#define GREEN 255, 0, 0 // Red component for green color
#define BLUE 0, 0, 255 // Blue component
// System clock frequency in MHz for cycle calculations
#define SYS_FREQ_MHZ (DEVICE_SYSCLK_FREQ / 1000000)
// Timing parameters (in microseconds)
#define T0H 0.4f // High time for '0' bit
#define T1H 0.8f // High time for '1' bit
#define T0L 0.85f // Low time for '0' bit
#define T1L 0.45f // Low time for '1' bit
// Convert timing to CPU cycles
#define CYCLES_PER_US SYS_FREQ_MHZ
#define T0H_CYCLES (uint32_t)(T0H * CYCLES_PER_US)
#define T1H_CYCLES (uint32_t)(T1H * CYCLES_PER_US)
#define T0L_CYCLES (uint32_t)(T0L * CYCLES_PER_US)
#define T1L_CYCLES (uint32_t)(T1L * CYCLES_PER_US)
void delay_cycles(uint32_t cycles) {
while (cycles--) {
__asm(" NOP");
}
}
void send_neopixel_byte(uint8_t byte, uint16_t pin) {
for (int i = 7; i >= 0; i--) {
uint8_t bit_val = (byte >> i) & 1;
GPIO_writePin(pin, 1); // Signal start of bit
if (bit_val) {
delay_cycles(T1H_CYCLES - 2); // High pulse for '1'
GPIO_writePin(pin, 0);
delay_cycles(T1L_CYCLES - 2); // Low period for '1'
} else {
delay_cycles(T0H_CYCLES - 2); // High pulse for '0'
GPIO_writePin(pin, 0);
delay_cycles(T0L_CYCLES - 2); // Low period for '0'
}
}
}
void set_all_leds(uint8_t green, uint8_t red, uint8_t blue) {
for (int j = 0; j < NUM_LEDS; j++) {
send_neopixel_byte(green, NEOPIXEL_PIN); // GRB order
send_neopixel_byte(red, NEOPIXEL_PIN);
send_neopixel_byte(blue, NEOPIXEL_PIN);
}
GPIO_writePin(NEOPIXEL_PIN, 0); // Reset signal
delay_us(60); // Hold low for 60µs
}
void main(void) {
Device_init();
Device_initGPIO();
GPIO_setDirectionMode(NEOPIXEL_PIN, GPIO_DIR_MODE_OUT);
while (1) {
set_all_leds(GREEN); // Green component for red color
delay_us(BLINK_DELAY);
set_all_leds(0, 0, 0); // Turn off LEDs
delay_us(BLINK_DELAY);
}
}
