瀏覽代碼

Add support for DMAMUX-capable MCU configuration with WS2812 PWM driver. (#9471)

Nick Brassel 4 年之前
父節點
當前提交
c6b7a0d386
共有 2 個文件被更改,包括 10 次插入1 次删除
  1. 2 1
      docs/ws2812_driver.md
  2. 8 0
      drivers/chibios/ws2812_pwm.c

+ 2 - 1
docs/ws2812_driver.md

@@ -92,6 +92,7 @@ Configure the hardware via your config.h:
 #define WS2812_PWM_PAL_MODE 2  // Pin "alternate function", see the respective datasheet for the appropriate values for your MCU. default: 2
 #define WS2812_DMA_STREAM STM32_DMA1_STREAM2  // DMA Stream for TIMx_UP, see the respective reference manual for the appropriate values for your MCU.
 #define WS2812_DMA_CHANNEL 2  // DMA Channel for TIMx_UP, see the respective reference manual for the appropriate values for your MCU.
+#define WS2812_DMAMUX_ID STM32_DMAMUX1_TIM2_UP // DMAMUX configuration for TIMx_UP -- only required if your MCU has a DMAMUX peripheral, see the respective reference manual for the appropriate values for your MCU.
 ```
 
 You must also turn on the PWM feature in your halconf.h and mcuconf.h
@@ -117,5 +118,5 @@ Note: This only applies to STM32 boards.
 
  To configure the `RGB_DI_PIN` to open drain configuration add this to your config.h file: 
 ```c
- #define WS2812_EXTERNAL_PULLUP 
+#define WS2812_EXTERNAL_PULLUP
 ```

+ 8 - 0
drivers/chibios/ws2812_pwm.c

@@ -23,6 +23,9 @@
 #ifndef WS2812_DMA_CHANNEL
 #    define WS2812_DMA_CHANNEL 2  // DMA Channel for TIMx_UP
 #endif
+#if (STM32_DMA_SUPPORTS_DMAMUX == TRUE) && !defined(WS2812_DMAMUX_ID)
+#    error "please consult your MCU's datasheet and specify in your config.h: #define WS2812_DMAMUX_ID STM32_DMAMUX1_TIM?_UP"
+#endif
 
 // Push Pull or Open Drain Configuration
 // Default Push Pull
@@ -184,6 +187,11 @@ void ws2812_init(void) {
     dmaStreamSetMode(WS2812_DMA_STREAM, 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));
     // M2P: Memory 2 Periph; PL: Priority Level
 
+#if (STM32_DMA_SUPPORTS_DMAMUX == TRUE)
+    // If the MCU has a DMAMUX we need to assign the correct resource
+    dmaSetRequestSource(WS2812_DMA_STREAM, WS2812_DMAMUX_ID);
+#endif
+
     // Start DMA
     dmaStreamEnable(WS2812_DMA_STREAM);