-
Notifications
You must be signed in to change notification settings - Fork 0
/
ws2812.cpp
90 lines (81 loc) · 2.01 KB
/
ws2812.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
#include <Arduino.h>
#include <ws2812.h>
WS2812::WS2812()
{
}
void WS2812::begin(uint8_t pin, uint8_t numberled)
{
// set pin as output
// volatile uint32_t *CRX;
// #define port_addr GPIOC // pin string is connected to
// uint8_t port_bit = 13;
// if (port_bit < 8)
// CRX = ((volatile uint32_t *)(port_addr + 0x00)); // GPIOx_CRL
// else
// {
// CRX = ((volatile uint32_t *)(port_addr + 0x04)); // GPIOx_CRH
// port_bit -= 8;
// }
// *CRX &= ~(0xF << port_bit * 4); // CNF = 0 (gp push-pull output)
// *CRX |= 1 << port_bit * 4; // MODE = 1 (output mode 10 MHz)
CoreDebug->DEMCR |= CoreDebug_DEMCR_TRCENA_Msk;
DWT->CTRL |= DWT_CTRL_CYCCNTENA_Msk;
DWT->CYCCNT = 0;
Serial.begin(115200);
//
// GPIOC->CRL = 0x33333333;
pinMode(pin, OUTPUT);
GPIOC->CRH = 0x33333333;
}
void WS2812::setLedColor(uint8_t numberLED, uint8_t blue, uint8_t green, uint8_t red)
{
buffer[(numberLED * 3) + 0] = green;
buffer[(numberLED * 3) + 1] = red;
buffer[(numberLED * 3) + 2] = blue;
}
void WS2812::showLED()
{
for (int i = 0; i < sizeof(buffer); i++)
{
k++;
for (uint8_t j = 0; j < 8; j++)
{
if (bitRead(buffer[i], j) == 1)
{
one();
}
else
zero();
}
if (k == 3)
{
clear();
k = 0;
}
}
}
void WS2812::zero()
{
DWT->CYCCNT = 0;
while (DWT->CYCCNT < (10))
GPIOC->BSRR = 8192;
DWT->CYCCNT = 0;
while (DWT->CYCCNT < (20))
GPIOC->BRR = 8192;
}
void WS2812::one()
{
DWT->CYCCNT = 0;
while (DWT->CYCCNT < (20))
GPIOC->BSRR = 8192;
DWT->CYCCNT = 0;
while (DWT->CYCCNT < (10))
GPIOC->BRR = 8192;
}
void WS2812::clear()
{
DWT->CYCCNT = 0;
while (DWT->CYCCNT < (10))
GPIOC->BRR = 8192;
// GPIOC->BSRR = 8192;
}