mirror of
				https://github.com/mfulz/qmk_firmware.git
				synced 2025-11-04 15:22:41 +01:00 
			
		
		
		
	Add support for complementary outputs to the WS2812 PWM driver (#11988)
This commit is contained in:
		
							parent
							
								
									8f5d2e546e
								
							
						
					
					
						commit
						18a333ec6b
					
				@ -102,11 +102,14 @@ Configure the hardware via your config.h:
 | 
				
			|||||||
#define WS2812_PWM_DRIVER PWMD2  // default: PWMD2
 | 
					#define WS2812_PWM_DRIVER PWMD2  // default: PWMD2
 | 
				
			||||||
#define WS2812_PWM_CHANNEL 2  // default: 2
 | 
					#define WS2812_PWM_CHANNEL 2  // default: 2
 | 
				
			||||||
#define WS2812_PWM_PAL_MODE 2  // Pin "alternate function", see the respective datasheet for the appropriate values for your MCU. default: 2
 | 
					#define WS2812_PWM_PAL_MODE 2  // Pin "alternate function", see the respective datasheet for the appropriate values for your MCU. default: 2
 | 
				
			||||||
 | 
					//#define WS2812_PWM_COMPLEMENTARY_OUTPUT // Define for a complementary timer output (TIMx_CHyN); omit for a normal timer output (TIMx_CHy).
 | 
				
			||||||
#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_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_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.
 | 
					#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.
 | 
				
			||||||
```
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Note that using a complementary timer output (TIMx_CHyN) is possible only for advanced-control timers (TIM1, TIM8, TIM20 on STM32), and the `STM32_PWM_USE_ADVANCED` option in mcuconf.h must be set to `TRUE`.  Complementary outputs of general-purpose timers are not supported due to ChibiOS limitations.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
You must also turn on the PWM feature in your halconf.h and mcuconf.h
 | 
					You must also turn on the PWM feature in your halconf.h and mcuconf.h
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#### Testing Notes
 | 
					#### Testing Notes
 | 
				
			||||||
 | 
				
			|||||||
@ -27,6 +27,15 @@
 | 
				
			|||||||
#    error "please consult your MCU's datasheet and specify in your config.h: #define WS2812_DMAMUX_ID STM32_DMAMUX1_TIM?_UP"
 | 
					#    error "please consult your MCU's datasheet and specify in your config.h: #define WS2812_DMAMUX_ID STM32_DMAMUX1_TIM?_UP"
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifndef WS2812_PWM_COMPLEMENTARY_OUTPUT
 | 
				
			||||||
 | 
					#    define WS2812_PWM_OUTPUT_MODE PWM_OUTPUT_ACTIVE_HIGH
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
					#    if !STM32_PWM_USE_ADVANCED
 | 
				
			||||||
 | 
					#        error "WS2812_PWM_COMPLEMENTARY_OUTPUT requires STM32_PWM_USE_ADVANCED == TRUE"
 | 
				
			||||||
 | 
					#    endif
 | 
				
			||||||
 | 
					#    define WS2812_PWM_OUTPUT_MODE PWM_COMPLEMENTARY_OUTPUT_ACTIVE_HIGH
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Push Pull or Open Drain Configuration
 | 
					// Push Pull or Open Drain Configuration
 | 
				
			||||||
// Default Push Pull
 | 
					// Default Push Pull
 | 
				
			||||||
#ifndef WS2812_EXTERNAL_PULLUP
 | 
					#ifndef WS2812_EXTERNAL_PULLUP
 | 
				
			||||||
@ -247,7 +256,7 @@ void ws2812_init(void) {
 | 
				
			|||||||
        .channels =
 | 
					        .channels =
 | 
				
			||||||
            {
 | 
					            {
 | 
				
			||||||
                [0 ... 3]                = {.mode = PWM_OUTPUT_DISABLED, .callback = NULL},     // Channels default to disabled
 | 
					                [0 ... 3]                = {.mode = PWM_OUTPUT_DISABLED, .callback = NULL},     // Channels default to disabled
 | 
				
			||||||
                [WS2812_PWM_CHANNEL - 1] = {.mode = PWM_OUTPUT_ACTIVE_HIGH, .callback = NULL},  // Turn on the channel we care about
 | 
					                [WS2812_PWM_CHANNEL - 1] = {.mode = WS2812_PWM_OUTPUT_MODE, .callback = NULL},  // Turn on the channel we care about
 | 
				
			||||||
            },
 | 
					            },
 | 
				
			||||||
        .cr2  = 0,
 | 
					        .cr2  = 0,
 | 
				
			||||||
        .dier = TIM_DIER_UDE,  // DMA on update event for next period
 | 
					        .dier = TIM_DIER_UDE,  // DMA on update event for next period
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user