diff --git a/drivers/arm/ws2812.c b/drivers/arm/ws2812.c index bab52e7531..f8730c6e1c 100644 --- a/drivers/arm/ws2812.c +++ b/drivers/arm/ws2812.c @@ -40,16 +40,17 @@ #if !defined(WS2812_TIM_N) #error WS2812 timer not specified -#elif WS2812_TIM_N == 1 - #define WS2812_DMA_STREAM STM32_DMA1_STREAM5 -#elif WS2812_TIM_N == 2 - #define WS2812_DMA_STREAM STM32_DMA1_STREAM2 -#elif WS2812_TIM_N == 3 - #define WS2812_DMA_STREAM STM32_DMA1_STREAM3 -#elif WS2812_TIM_N == 4 - #define WS2812_DMA_STREAM STM32_DMA1_STREAM7 -#else - #error WS2812 timer set to invalid value +#endif +#if defined(STM32F2XX) || defined(STM32F3XX) || defined(STM32F4XX) || defined(STM32F7XX) + #if WS2812_TIM_N <= 2 + #define WS2812_AF 1 + #elif WS2812_TIM_N <= 5 + #define WS2812_AF 2 + #elif WS2812_TIM_N <= 11 + #define WS2812_AF 3 + #endif +#elif !defined(WS2812_AF) + #error WS2812_AF timer alternate function not specified #endif #if !defined(WS2812_TIM_CH) @@ -60,8 +61,8 @@ /* --- PRIVATE CONSTANTS ---------------------------------------------------- */ -#define WS2812_PWM_FREQUENCY (72000000) /**< Clock frequency of PWM */ -#define WS2812_PWM_PERIOD (90) /**< Clock period in ticks. 90/(72 MHz) = 1.25 uS (as per datasheet) */ +#define WS2812_PWM_FREQUENCY (STM32_SYSCLK/2) /**< Clock frequency of PWM */ +#define WS2812_PWM_PERIOD (WS2812_PWM_FREQUENCY/800000) /**< Clock period in ticks. 90/(72 MHz) = 1.25 uS (as per datasheet) */ /** * @brief Number of bit-periods to hold the data line low at the end of a frame @@ -85,7 +86,7 @@ * a low period of (90 - 22)/(72 MHz) = 9.44 uS. These values are within the allowable * bounds, and intentionally skewed as far to the low duty-cycle side as possible */ -#define WS2812_DUTYCYCLE_0 (22) +#define WS2812_DUTYCYCLE_0 (WS2812_PWM_FREQUENCY/(1000000000/350)) /** * @brief High period for a one, in ticks @@ -98,7 +99,7 @@ * a low period of (90 - 56)/(72 MHz) = 4.72 uS. These values are within the allowable * bounds, and intentionally skewed as far to the high duty-cycle side as possible */ -#define WS2812_DUTYCYCLE_1 (56) +#define WS2812_DUTYCYCLE_1 (WS2812_PWM_FREQUENCY/(1000000000/800)) /* --- PRIVATE MACROS ------------------------------------------------------- */ @@ -173,8 +174,12 @@ void ws2812_init(void) for (i = 0; i < WS2812_COLOR_BIT_N; i++) ws2812_frame_buffer[i] = WS2812_DUTYCYCLE_0; // All color bits are zero duty cycle for (i = 0; i < WS2812_RESET_BIT_N; i++) ws2812_frame_buffer[i + WS2812_COLOR_BIT_N] = 0; // All reset bits are zero - // Configure PA0 as AF output - palSetPadMode(GPIOA, 1, PAL_MODE_ALTERNATE(1)); + // Configure PA1 as AF output +#ifdef WS2812_EXTERNAL_PULLUP + palSetPadMode(PORT_WS2812, PIN_WS2812, PAL_MODE_ALTERNATE(WS2812_AF) | PAL_STM32_OTYPE_OPENDRAIN); +#else + palSetPadMode(PORT_WS2812, PIN_WS2812, PAL_MODE_ALTERNATE(WS2812_AF)); +#endif // PWM Configuration #pragma GCC diagnostic ignored "-Woverride-init" // Turn off override-init warning for this struct. We use the overriding ability to set a "default" channel config @@ -199,6 +204,8 @@ void ws2812_init(void) dmaStreamSetMode(WS2812_DMA_STREAM, STM32_DMA_CR_DIR_M2P | STM32_DMA_CR_PSIZE_WORD | STM32_DMA_CR_MSIZE_BYTE | STM32_DMA_CR_MINC | STM32_DMA_CR_CIRC | STM32_DMA_CR_PL(3)); + //STM32_DMA_CR_CHSEL(WS2812_DMA_CHANNEL) | STM32_DMA_CR_DIR_M2P | STM32_DMA_CR_PSIZE_WORD | STM32_DMA_CR_MSIZE_WORD | + //STM32_DMA_CR_MINC | STM32_DMA_CR_CIRC | STM32_DMA_CR_PL(3)); // Start DMA dmaStreamEnable(WS2812_DMA_STREAM); @@ -231,7 +238,6 @@ ws2812_err_t ws2812_write_led(uint32_t led_number, uint8_t r, uint8_t g, uint8_t /** @} addtogroup WS2812 */ void ws2812_setleds(LED_TYPE *ledarray, uint16_t number_of_leds) { - ws2812_init(); uint8_t i = 0; while (i < number_of_leds) { ws2812_write_led(i, ledarray[i].r, ledarray[i].g, ledarray[i].b); diff --git a/keyboards/planck/config.h b/keyboards/planck/config.h index 097bacd715..452a99d746 100644 --- a/keyboards/planck/config.h +++ b/keyboards/planck/config.h @@ -18,9 +18,7 @@ along with this program. If not, see . #ifndef CONFIG_H #define CONFIG_H -#ifdef __AVR__ #include "config_common.h" -#endif /* USB Device descriptor parameter */ #define VENDOR_ID 0xFEED diff --git a/keyboards/planck/rev6/boards/GENERIC_STM32_F303XC/board.h b/keyboards/planck/rev6/boards/GENERIC_STM32_F303XC/board.h index 7b8b826f68..77c1ee951d 100644 --- a/keyboards/planck/rev6/boards/GENERIC_STM32_F303XC/board.h +++ b/keyboards/planck/rev6/boards/GENERIC_STM32_F303XC/board.h @@ -25,7 +25,7 @@ * Board identifier. */ #define BOARD_GENERIC_STM32_F303XC -#define BOARD_NAME "Clueboard 60 PCB" +#define BOARD_NAME "Planck PCB" /* * Board oscillators-related settings. diff --git a/keyboards/planck/rev6/config.h b/keyboards/planck/rev6/config.h index 4fe91d963a..aaa49710c1 100644 --- a/keyboards/planck/rev6/config.h +++ b/keyboards/planck/rev6/config.h @@ -129,5 +129,10 @@ #define RGBLED_NUM WS2812_LED_N #define WS2812_TIM_N 1 #define WS2812_TIM_CH 1 +#define PORT_WS2812 GPIOA +#define PIN_WS2812 1 +#define WS2812_DMA_STREAM STM32_DMA1_STREAM2 // DMA stream for TIMx_UP (look up in reference manual under DMA Channel selection) +//#define WS2812_DMA_CHANNEL 7 // DMA channel for TIMx_UP +//#define WS2812_EXTERNAL_PULLUP #endif diff --git a/keyboards/planck/rev6/mcuconf.h b/keyboards/planck/rev6/mcuconf.h index b101957034..d30f08563e 100644 --- a/keyboards/planck/rev6/mcuconf.h +++ b/keyboards/planck/rev6/mcuconf.h @@ -184,7 +184,6 @@ #define STM32_PWM_USE_ADVANCED FALSE #define STM32_PWM_USE_TIM1 TRUE #define STM32_PWM_USE_TIM2 FALSE -#define STM32_PWM_USE_TIM3 FALSE #define STM32_PWM_USE_TIM4 FALSE #define STM32_PWM_USE_TIM8 FALSE #define STM32_PWM_TIM1_IRQ_PRIORITY 7 diff --git a/keyboards/planck/rev6/rev6.c b/keyboards/planck/rev6/rev6.c index 45bd12d606..6789ff5c05 100644 --- a/keyboards/planck/rev6/rev6.c +++ b/keyboards/planck/rev6/rev6.c @@ -17,6 +17,7 @@ #include "rgblight.h" void matrix_init_kb(void) { + ws2812_init(); rgblight_enable(); rgblight_mode(1); rgblight_setrgb(0xFF, 0xFF, 0xFF);