summaryrefslogtreecommitdiff
path: root/libraries
diff options
context:
space:
mode:
authorxengineering <mail2xengineering@protonmail.com>2020-10-31 20:49:22 +0100
committerxengineering <mail2xengineering@protonmail.com>2020-10-31 20:49:22 +0100
commit0314c77fd9fd9372bdef8c190cef7e78dc2ae5b2 (patch)
tree86f8a9ab0287dcdd9c923a2b49e8b6a07d167fc9 /libraries
parent45def2a4827b206fc3e2351a29719d16b980338b (diff)
downloadstm32f103c8-examples-0314c77fd9fd9372bdef8c190cef7e78dc2ae5b2.tar
stm32f103c8-examples-0314c77fd9fd9372bdef8c190cef7e78dc2ae5b2.tar.zst
stm32f103c8-examples-0314c77fd9fd9372bdef8c190cef7e78dc2ae5b2.zip
ws2812: No usage of Heap anymore
Diffstat (limited to 'libraries')
-rw-r--r--libraries/ws2812.c41
-rw-r--r--libraries/ws2812.h29
2 files changed, 31 insertions, 39 deletions
diff --git a/libraries/ws2812.c b/libraries/ws2812.c
index 41d4fb5..aa64031 100644
--- a/libraries/ws2812.c
+++ b/libraries/ws2812.c
@@ -8,7 +8,7 @@ Please mind these restrictions:
- Only usable with libopencm3
- Newer versions of libopencm3 may be not compatibel (libopencm3 api is not stable yet)
-- Just usable with a clock frequency of 80 MHz
+- Just usable with a clock frequency of 72 MHz
- You have to setup the clock and gpio yourself
*/
@@ -21,19 +21,18 @@ Please mind these restrictions:
#define NUMBER_NOPS_SHORT 6 // 0.35 µs = 25.2 cycles @ 72 MHz = 6.3 nops --> 16.7 ns timing error
-void ws2812_init(ws2812_init_typedef *control_struct, uint32_t port, uint16_t pin, uint32_t array_length, uint32_t matrix_width)
+void ws2812_init(WS2812_ARRAY *control_struct, uint32_t port, uint16_t pin, uint8_t *buffer_ptr, uint32_t array_length)
{
control_struct->gpio_port = port;
control_struct->gpio_pin = pin;
+ control_struct->array_buffer = buffer_ptr;
control_struct->array_length = array_length;
- control_struct->matrix_width = matrix_width;
- control_struct->led_array = malloc(sizeof(uint8_t[array_length][3]));
ws2812_clear_buffer(control_struct);
ws2812_send_reset(control_struct);
}
-void ws2812_send_reset(ws2812_init_typedef *control_struct)
+void ws2812_send_reset(WS2812_ARRAY *control_struct)
{
gpio_clear(control_struct->gpio_port, control_struct->gpio_pin);
for (int i = 0; i < NUMBER_NOPS_RESET; i++) {
@@ -42,7 +41,7 @@ void ws2812_send_reset(ws2812_init_typedef *control_struct)
}
-void ws2812_send_zero(ws2812_init_typedef *control_struct)
+void ws2812_send_zero(WS2812_ARRAY *control_struct)
{
gpio_set(control_struct->gpio_port, control_struct->gpio_pin);
for (int i = 0; i < NUMBER_NOPS_SHORT; i++) {
@@ -55,7 +54,7 @@ void ws2812_send_zero(ws2812_init_typedef *control_struct)
}
-void ws2812_send_one(ws2812_init_typedef *control_struct)
+void ws2812_send_one(WS2812_ARRAY *control_struct)
{
gpio_set(control_struct->gpio_port, control_struct->gpio_pin);
for (int i = 0; i < NUMBER_NOPS_LONG; i++) {
@@ -68,7 +67,7 @@ void ws2812_send_one(ws2812_init_typedef *control_struct)
}
-void ws2812_send_byte(ws2812_init_typedef *control_struct, uint8_t data)
+void ws2812_send_byte(WS2812_ARRAY *control_struct, uint8_t data)
{
for (int i=7; i>=0; i--){
if ( (data >> i) & 0x01 ){
@@ -81,7 +80,7 @@ void ws2812_send_byte(ws2812_init_typedef *control_struct, uint8_t data)
}
-void ws2812_send_led(ws2812_init_typedef *control_struct, uint8_t red, uint8_t green, uint8_t blue)
+void ws2812_send_led(WS2812_ARRAY *control_struct, uint8_t red, uint8_t green, uint8_t blue)
{
ws2812_send_byte(control_struct, green);
ws2812_send_byte(control_struct, red);
@@ -89,35 +88,29 @@ void ws2812_send_led(ws2812_init_typedef *control_struct, uint8_t red, uint8_t g
}
-void ws2812_write_leds(ws2812_init_typedef *control_struct)
+void ws2812_write_leds(WS2812_ARRAY *control_struct)
{
for(uint32_t i=0; i<(control_struct->array_length); i++){
ws2812_send_led(
control_struct,
- control_struct->led_array[i][0], // red
- control_struct->led_array[i][1], // green
- control_struct->led_array[i][2] // blue
+ control_struct->array_buffer[i * WS2812_NUMBER_OF_COLORS + 0], // red
+ control_struct->array_buffer[i * WS2812_NUMBER_OF_COLORS + 1], // green
+ control_struct->array_buffer[i * WS2812_NUMBER_OF_COLORS + 2] // blue
);
}
ws2812_send_reset(control_struct);
}
-void ws2812_set_array_led(ws2812_init_typedef *control_struct, uint32_t index, uint8_t red, uint8_t green, uint8_t blue)
+void ws2812_set_array_led(WS2812_ARRAY *control_struct, uint32_t index, uint8_t red, uint8_t green, uint8_t blue)
{
- control_struct->led_array[index][0] = red;
- control_struct->led_array[index][1] = green;
- control_struct->led_array[index][2] = blue;
+ control_struct->array_buffer[index * WS2812_NUMBER_OF_COLORS + 0] = red;
+ control_struct->array_buffer[index * WS2812_NUMBER_OF_COLORS + 1] = green;
+ control_struct->array_buffer[index * WS2812_NUMBER_OF_COLORS + 2] = blue;
}
-void ws2812_set_matrix_led(ws2812_init_typedef *control_struct, uint32_t x, uint32_t y, uint8_t red, uint8_t green, uint8_t blue)
-{
- ws2812_set_array_led(control_struct, (x + y * (control_struct->matrix_width)), red, green, blue);
-}
-
-
-void ws2812_clear_buffer(ws2812_init_typedef *control_struct)
+void ws2812_clear_buffer(WS2812_ARRAY *control_struct)
{
for (uint32_t i=0; i<control_struct->array_length; i++){
ws2812_set_array_led(control_struct, i, 0, 0, 0);
diff --git a/libraries/ws2812.h b/libraries/ws2812.h
index e4f0754..c6c85d9 100644
--- a/libraries/ws2812.h
+++ b/libraries/ws2812.h
@@ -7,32 +7,31 @@
#include <stdlib.h>
#include <libopencm3/stm32/gpio.h>
+#define WS2812_NUMBER_OF_COLORS 3
-typedef struct ws2812_init_typedef{
+
+typedef struct WS2812_ARRAY{
uint32_t gpio_port;
uint16_t gpio_pin;
+ uint8_t *array_buffer;
uint32_t array_length;
- uint32_t matrix_width;
- uint8_t (*led_array)[3];
-
-}ws2812_init_typedef;
+}WS2812_ARRAY;
-void ws2812_init(ws2812_init_typedef *control_struct, uint32_t port, uint16_t pin, uint32_t array_length, uint32_t matrix_width);
-void ws2812_send_reset(ws2812_init_typedef *control_struct);
-void ws2812_send_zero(ws2812_init_typedef *control_struct);
-void ws2812_send_one(ws2812_init_typedef *control_struct);
+void ws2812_init(WS2812_ARRAY *control_struct, uint32_t port, uint16_t pin, uint8_t *buffer_ptr, uint32_t array_length);
-void ws2812_send_byte(ws2812_init_typedef *control_struct, uint8_t data);
-void ws2812_send_led(ws2812_init_typedef *control_struct, uint8_t red, uint8_t green, uint8_t blue);
-void ws2812_write_leds(ws2812_init_typedef *control_struct);
+void ws2812_send_reset(WS2812_ARRAY *control_struct);
+void ws2812_send_zero(WS2812_ARRAY *control_struct);
+void ws2812_send_one(WS2812_ARRAY *control_struct);
-void ws2812_set_array_led(ws2812_init_typedef *control_struct, uint32_t index, uint8_t red, uint8_t green, uint8_t blue);
-void ws2812_set_matrix_led(ws2812_init_typedef *control_struct, uint32_t x, uint32_t y, uint8_t red, uint8_t green, uint8_t blue);
+void ws2812_send_byte(WS2812_ARRAY *control_struct, uint8_t data);
+void ws2812_send_led(WS2812_ARRAY *control_struct, uint8_t red, uint8_t green, uint8_t blue);
-void ws2812_clear_buffer(ws2812_init_typedef *control_struct);
+void ws2812_write_leds(WS2812_ARRAY *control_struct);
+void ws2812_set_array_led(WS2812_ARRAY *control_struct, uint32_t index, uint8_t red, uint8_t green, uint8_t blue);
+void ws2812_clear_buffer(WS2812_ARRAY *control_struct);
#endif /* WS2812_H */