This is an example program of WS2812 library https://developer.mbed.org/users/devararendy/code/WS2812/ in main program, i also put some line to measure how many asm NOP do we need. I have test it on STM32F411RE (Nucleo 411RE). if you would like to use another microcontroller, you need to adjust the asm("nop") in the library.
Dependencies: USBDevice WS2812 mbed-os
Diff: main.cpp
- Revision:
- 0:a27bf0451169
- Child:
- 2:0d3906d69a41
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/main.cpp Sat Dec 10 08:26:36 2016 +0000 @@ -0,0 +1,253 @@ +#include "mbed.h" +#include "USBSerial.h" +#include "WS2812.h" + +#define LED_RGB PA_1 + +WS2812 RGB(LED_RGB, 1); +DigitalOut test(PB_7); + +USBSerial serial; +unsigned int timerValue; +static TIM_HandleTypeDef s_TimerInstance = { + .Instance = TIM2 +}; +void InitializeTimer() +{ + __TIM2_CLK_ENABLE(); + s_TimerInstance.Init.Prescaler = 1; + s_TimerInstance.Init.CounterMode = TIM_COUNTERMODE_UP; + s_TimerInstance.Init.Period = 45000000; //tim clock = 45MHz, 1Sec = 1 Period + s_TimerInstance.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; + s_TimerInstance.Init.RepetitionCounter = 0; + HAL_TIM_Base_Init(&s_TimerInstance); + HAL_TIM_Base_Start(&s_TimerInstance); +} +int main(void) +{ + wait(3); + InitializeTimer(); + serial.printf("Welcome to STM32FC RGB LED Tester\r\n"); + while(1) + { + /* + timerValue = __HAL_TIM_GET_COUNTER(&s_TimerInstance); + test = 1; + asm("nop"); + asm("nop"); + asm("nop"); + asm("nop"); + asm("nop"); + asm("nop"); + asm("nop"); + timerValue = __HAL_TIM_GET_COUNTER(&s_TimerInstance) - timerValue; + + unsigned int timerValue2 = __HAL_TIM_GET_COUNTER(&s_TimerInstance); + test = 0; + asm("nop"); + asm("nop"); + asm("nop"); + asm("nop"); + asm("nop"); + + asm("nop"); + asm("nop"); + asm("nop"); + asm("nop"); + asm("nop"); + + asm("nop"); + asm("nop"); + asm("nop"); + asm("nop"); + asm("nop"); + + asm("nop"); + asm("nop"); + asm("nop"); + asm("nop"); + asm("nop"); + + asm("nop"); + asm("nop"); + asm("nop"); + asm("nop"); + asm("nop"); + + asm("nop"); + asm("nop"); + asm("nop"); + asm("nop"); + asm("nop"); + + asm("nop"); + asm("nop"); + asm("nop"); + asm("nop"); + asm("nop"); + + asm("nop"); + asm("nop"); + asm("nop"); + asm("nop"); + asm("nop"); + asm("nop"); + asm("nop"); + asm("nop"); + asm("nop"); + asm("nop"); + + asm("nop"); + asm("nop"); + asm("nop"); + asm("nop"); + asm("nop"); + + asm("nop"); + asm("nop"); + asm("nop"); + timerValue2 = __HAL_TIM_GET_COUNTER(&s_TimerInstance) - timerValue2; + + serial.printf("Send 0 val %u, val2 = %u \r\n", timerValue, timerValue2); + ////////////////////////////////////////////////////////////////////////// + timerValue = __HAL_TIM_GET_COUNTER(&s_TimerInstance); + test = 1; + asm("nop"); + asm("nop"); + asm("nop"); + asm("nop"); + asm("nop"); + + asm("nop"); + asm("nop"); + asm("nop"); + asm("nop"); + asm("nop"); + + asm("nop"); + asm("nop"); + asm("nop"); + asm("nop"); + asm("nop"); + + asm("nop"); + asm("nop"); + asm("nop"); + asm("nop"); + asm("nop"); + + asm("nop"); + asm("nop"); + asm("nop"); + asm("nop"); + asm("nop"); + + asm("nop"); + asm("nop"); + asm("nop"); + asm("nop"); + asm("nop"); + + asm("nop"); + asm("nop"); + asm("nop"); + asm("nop"); + asm("nop"); + + asm("nop"); + asm("nop"); + asm("nop"); + asm("nop"); + asm("nop"); + timerValue = __HAL_TIM_GET_COUNTER(&s_TimerInstance) - timerValue; + + timerValue2 = __HAL_TIM_GET_COUNTER(&s_TimerInstance); + test = 0; + asm("nop"); + asm("nop"); + asm("nop"); + asm("nop"); + asm("nop"); + + asm("nop"); + asm("nop"); + asm("nop"); + asm("nop"); + asm("nop"); + + asm("nop"); + asm("nop"); + asm("nop"); + asm("nop"); + asm("nop"); + + asm("nop"); + asm("nop"); + asm("nop"); + asm("nop"); + asm("nop"); + + asm("nop"); + asm("nop"); + asm("nop"); + asm("nop"); + asm("nop"); + + asm("nop"); + asm("nop"); + asm("nop"); + asm("nop"); + asm("nop"); + + asm("nop"); + asm("nop"); + asm("nop"); + asm("nop"); + asm("nop"); + timerValue2 = __HAL_TIM_GET_COUNTER(&s_TimerInstance) - timerValue2; + + serial.printf("Send 1 val %u, val2 = %u \r\n", timerValue, timerValue2); + */ + /* + RGB.writeColor(0xffffff); + RGB.sendReset(); + serial.printf("R = 0x%X, G = 0x%X ,B = 0x%X\r\n", RGB.Red, RGB.Green, RGB.Blue); + wait(2); + RGB.writeColor(0xff00ff); + RGB.sendReset(); + serial.printf("R = 0x%X, G = 0x%X ,B = 0x%X\r\n", RGB.Red, RGB.Green, RGB.Blue); + wait(2); + RGB.writeColor(0xffff00); + RGB.sendReset(); + serial.printf("R = 0x%X, G = 0x%X ,B = 0x%X\r\n", RGB.Red, RGB.Green, RGB.Blue); + wait(2); + */ + + RGB.send1Color(0xFF0000); + Thread::wait(1000); + RGB.send1Color(0xFF00); + Thread::wait(1000); + RGB.send1Color(0xFF); + Thread::wait(1000); + RGB.send1Color(0xFFFF00); + Thread::wait(1000); + RGB.send1Color(0xFFFF); + Thread::wait(1000); + RGB.send1Color(0xFF00FF); + Thread::wait(1000); + + RGB.send1Color(0xff8000); + Thread::wait(1000); + RGB.send1Color(0x9933ff); + Thread::wait(1000); + RGB.send1Color(0xff3300); + Thread::wait(1000); + RGB.send1Color(0x99cc00); + Thread::wait(1000); + RGB.send1Color(0xff99ff); + Thread::wait(1000); + RGB.send1Color(0x009999); + Thread::wait(1000); + + } +} \ No newline at end of file