summaryrefslogtreecommitdiff
path: root/ws2812/main.c
diff options
context:
space:
mode:
authorxengineering <mail2xengineering@protonmail.com>2021-01-26 16:05:27 +0100
committerxengineering <mail2xengineering@protonmail.com>2021-01-26 16:05:27 +0100
commit60849a62e04769aff854781e6cafa67b7025ed73 (patch)
treeabe07c2472e3b43795fb7dec611f36d5df23f95f /ws2812/main.c
parent17857f69f675141a814c80975545afb7c13dc675 (diff)
downloadstm32f103c8-examples-main.tar
stm32f103c8-examples-main.tar.zst
stm32f103c8-examples-main.zip
Update ws2812 Lib and ExampleHEADmain
Diffstat (limited to 'ws2812/main.c')
-rw-r--r--ws2812/main.c105
1 files changed, 68 insertions, 37 deletions
diff --git a/ws2812/main.c b/ws2812/main.c
index 323d03c..6721531 100644
--- a/ws2812/main.c
+++ b/ws2812/main.c
@@ -1,3 +1,4 @@
+// vim: tabstop=4 shiftwidth=4 noexpandtab
#include <libopencm3/stm32/rcc.h>
@@ -6,44 +7,34 @@
#include "ws2812.h"
-#define DELAY 90000 // 18,000,000 nops are one second @ 72 MHz (one nop --> 4 clock cycles)
-#define BRIGHTNESS 30
-#define LED_ARRAY_LENGTH 3
+#define LED_ARRAY_LENGTH 64 // ws2812 array is 64 LEDs long (adapt it to your needs)
+
+// pin B13 is connected to DIN of ws2812 array:
+#define LED_ARRAY_PORT GPIOB
+#define LED_ARRAY_PIN GPIO13
+#define RCC_GPIO_PORT RCC_GPIOB
+
+#define MAX_BRIGHTNESS 10 // maximum brightness per LED (value from 0 to 255)
void clock_init(void);
void gpio_init(void);
-void delay(void);
+void delay_ms(uint16_t delay);
+void animation_full_color(WS2812_ARRAY *leds);
int main(void)
{
+ WS2812_ARRAY leds; // ws2812 control struct
+ uint8_t led_buffer[LED_ARRAY_LENGTH*3]; // reserve a uint8_t for each color in each LED
+
clock_init();
gpio_init();
- uint8_t led_array_buffer[LED_ARRAY_LENGTH*WS2812_NUMBER_OF_COLORS];
- WS2812_ARRAY led_panel;
- ws2812_init(&led_panel, GPIOB, GPIO13, (uint8_t *)led_array_buffer, LED_ARRAY_LENGTH);
+ ws2812_init(&leds, LED_ARRAY_PORT, LED_ARRAY_PIN, (uint8_t *)led_buffer, LED_ARRAY_LENGTH);
while(1)
{
- for (uint16_t i=0; i<=BRIGHTNESS; i++)
- {
- ws2812_set_array_led(&led_panel, 0, i, 0, 0);
- ws2812_set_array_led(&led_panel, 1, 0, i, 0);
- ws2812_set_array_led(&led_panel, 2, 0, 0, i);
-
- ws2812_write_leds(&led_panel);
- delay();
- }
- for (uint16_t i=BRIGHTNESS; i>0; i--)
- {
- ws2812_set_array_led(&led_panel, 0, i, 0, 0);
- ws2812_set_array_led(&led_panel, 1, 0, i, 0);
- ws2812_set_array_led(&led_panel, 2, 0, 0, i);
-
- ws2812_write_leds(&led_panel);
- delay();
- }
+ animation_full_color(&leds);
}
return 0;
@@ -52,27 +43,67 @@ int main(void)
void clock_init(void)
{
- rcc_clock_setup_in_hse_12mhz_out_72mhz();
- rcc_periph_clock_enable(RCC_GPIOB); // for ws2812
- rcc_periph_clock_enable(RCC_GPIOC); // for PC13 blinking
+ rcc_clock_setup_in_hse_8mhz_out_72mhz(); // use external oscillator for 72 MHz sysclock frequency
+ rcc_periph_clock_enable(RCC_GPIO_PORT); // enable gpio port clock to use LED_ARRAY_PORT
}
void gpio_init(void)
{
- // on board led blinking
- gpio_set_mode(GPIOC, GPIO_MODE_OUTPUT_50_MHZ, GPIO_CNF_OUTPUT_PUSHPULL, GPIO13);
- gpio_set(GPIOC, GPIO13);
-
- // ws2812 output pin
- gpio_set_mode(GPIOB, GPIO_MODE_OUTPUT_50_MHZ, GPIO_CNF_OUTPUT_PUSHPULL, GPIO13);
- gpio_set(GPIOB, GPIO13);
+ gpio_set_mode(LED_ARRAY_PORT, GPIO_MODE_OUTPUT_50_MHZ, GPIO_CNF_OUTPUT_PUSHPULL, LED_ARRAY_PIN); // settings for LED_ARRAY_PIN
+ gpio_clear(LED_ARRAY_PORT, LED_ARRAY_PIN); // set LED_ARRAY_PIN to 0 V
}
-void delay(void)
+void delay_ms(uint16_t delay)
{
- for (int i = 0; i < DELAY; i++) {
+ uint32_t delay_nops = delay * 4500; // just @ 72 MHz!
+ for (uint32_t i = 0; i < delay_nops; i++) {
__asm__("nop");
}
}
+
+
+void animation_full_color(WS2812_ARRAY *leds)
+{
+ // set red
+ ws2812_clear_buffer(leds);
+ for (uint32_t i = 0; i < leds->array_length*3; i++)
+ {
+ if (i%3 == 0) leds->array_buffer[i] = MAX_BRIGHTNESS;
+ }
+ ws2812_write_buffer_to_leds(leds);
+ delay_ms(500);
+
+ // set green
+ ws2812_clear_buffer(leds);
+ for (uint32_t i = 0; i < leds->array_length*3; i++)
+ {
+ if (i%3 == 1) leds->array_buffer[i] = MAX_BRIGHTNESS;
+ }
+ ws2812_write_buffer_to_leds(leds);
+ delay_ms(500);
+
+ // set blue
+ ws2812_clear_buffer(leds);
+ for (uint32_t i = 0; i < leds->array_length*3; i++)
+ {
+ if (i%3 == 2) leds->array_buffer[i] = MAX_BRIGHTNESS;
+ }
+ ws2812_write_buffer_to_leds(leds);
+ delay_ms(500);
+
+ // set white
+ ws2812_clear_buffer(leds);
+ for (uint32_t i = 0; i < leds->array_length*3; i++)
+ {
+ leds->array_buffer[i] = MAX_BRIGHTNESS;
+ }
+ ws2812_write_buffer_to_leds(leds);
+ delay_ms(500);
+
+ // set off
+ ws2812_clear_buffer(leds);
+ ws2812_write_buffer_to_leds(leds);
+ delay_ms(500);
+}