225 lines
		
	
	
		
			7.5 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			225 lines
		
	
	
		
			7.5 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| 
 | |
| #include "stm32f7xx_hal.h"
 | |
| #include "ext_led.h"
 | |
| #include <stdint.h>
 | |
| 
 | |
| 
 | |
| //------------------------------------------------------------------------------
 | |
| static const uint8_t cie1931[101] =
 | |
| {
 | |
| 	  0,   0,   1,   1,  1,    1,   2,   2,   2,   3,
 | |
| 	  3,   3,   4,   4,  4,    5,   5,   6,   6,   7,
 | |
| 	  8,   8,   9,  10,  10,  11,  12,  13,  14,  15,
 | |
| 	 16,  17,  18,  19,  20,  22,  23,  24,  26,  27,
 | |
| 	 29,  30,  32,  34,  35,  37,  39,  41,  43,  45,
 | |
| 	 47,  49,  51,  54,  56,  58,  61,  64,  66,  69,
 | |
| 	 72,  75,  78,  81,  84,  87,  90,  93,  97, 100,
 | |
| 	104, 108, 111, 115, 119, 123, 127, 131, 136, 140,
 | |
| 	145, 149, 154, 159, 163, 168, 173, 179, 184, 189,
 | |
| 	195, 200, 206, 212, 217, 223, 230, 236, 242, 248,
 | |
| 	255,
 | |
| };
 | |
| 
 | |
| #if LIGHTNESS_PWM_STEP != 100
 | |
| #error this cie1931 array supports only 100 steps, feel free to implement your own
 | |
| #endif
 | |
| 
 | |
| //------------------------------------------------------------------------------
 | |
| uint8_t lightness_to_pwm(uint8_t percentage)
 | |
| {
 | |
| 	if(percentage > (LIGHTNESS_PWM_STEP-1))
 | |
| 		percentage = (LIGHTNESS_PWM_STEP-1);
 | |
| 
 | |
| 	return cie1931[percentage];
 | |
| }
 | |
| 
 | |
| 
 | |
| //------------------------------------------------------------------------------
 | |
| //------------------------------------------------------------------------------
 | |
| int32_t Ext_LED_Init(void) {
 | |
|   GPIO_InitTypeDef GPIO_InitStruct;
 | |
| 	//----------------------------------------------------------------------------
 | |
|   // Configure GPIO pin: PA15 (LED0) 
 | |
|   __HAL_RCC_GPIOA_CLK_ENABLE();							// enable GPIO timer
 | |
| 	__HAL_RCC_TIM2_CLK_ENABLE();							// enable timer 2 clock
 | |
|   GPIO_InitStruct.Pin   = GPIO_PIN_15;			// used pin is PA15
 | |
|   GPIO_InitStruct.Mode  = GPIO_MODE_AF_PP;	// alternate function use
 | |
|   GPIO_InitStruct.Pull  = GPIO_NOPULL;			// no pullup
 | |
| 	GPIO_InitStruct.Alternate = GPIO_AF1_TIM2;// timer 2 is used
 | |
|   GPIO_InitStruct.Speed = GPIO_SPEED_FAST;	// speed is fast
 | |
|   HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
 | |
| 
 | |
| 	TIM2->CCER = TIM_CCER_CC1E;								// compare for PWM usage
 | |
|   TIM2->PSC = 16;														// timer prescaler 
 | |
| 	TIM2->ARR = 255;												  // max count value
 | |
|   TIM2->CCR1 = lightness_to_pwm(0);				// duty cycle
 | |
| 	TIM2->CCMR1 = TIM_CCMR1_OC1M_2 | TIM_CCMR1_OC1M_1 | TIM_CCMR1_OC1PE;
 | |
| 	TIM2->EGR |= TIM_EGR_UG;									// update register now
 | |
| 	TIM2->CR1 = TIM_CR1_ARPE | TIM_CR1_CEN;		// start the timer
 | |
| 	//----------------------------------------------------------------------------
 | |
|   // Configure GPIO pin: PH6 (LED1) 
 | |
|   __HAL_RCC_GPIOH_CLK_ENABLE();							// enable GPIO timer
 | |
| 	__HAL_RCC_TIM12_CLK_ENABLE();							// enable timer 12 clock
 | |
|   GPIO_InitStruct.Pin   = GPIO_PIN_6;				// used pin is PH6
 | |
|   GPIO_InitStruct.Mode  = GPIO_MODE_AF_PP;	// alternate function use
 | |
|   GPIO_InitStruct.Pull  = GPIO_NOPULL;			// no pullup
 | |
| 	GPIO_InitStruct.Alternate = GPIO_AF9_TIM12;// timer 12 is used
 | |
|   GPIO_InitStruct.Speed = GPIO_SPEED_FAST;	// speed is fast
 | |
|   HAL_GPIO_Init(GPIOH, &GPIO_InitStruct);
 | |
| 
 | |
| 	TIM12->CCER = TIM_CCER_CC1E;							// compare for PWM usage
 | |
|   TIM12->PSC = 16;													// timer prescaler 
 | |
| 	TIM12->ARR = 255;												  // max count value
 | |
|   TIM12->CCR1 = lightness_to_pwm(0);				// duty cycle
 | |
| 	TIM12->CCMR1 = TIM_CCMR1_OC1M_2 | TIM_CCMR1_OC1M_1 | TIM_CCMR1_OC1PE;
 | |
| 	TIM12->EGR |= TIM_EGR_UG;									// update register now
 | |
| 	TIM12->CR1 = TIM_CR1_ARPE | TIM_CR1_CEN;	// start the timer
 | |
| 	//----------------------------------------------------------------------------
 | |
|   // Configure GPIO pin: PA8 (LED2) 
 | |
|   __HAL_RCC_GPIOA_CLK_ENABLE();							// enable GPIO timer
 | |
| 	__HAL_RCC_TIM1_CLK_ENABLE();							// enable timer 1 clock
 | |
| 		
 | |
|   GPIO_InitStruct.Pin   = GPIO_PIN_8;				// used pin is PA8
 | |
|   GPIO_InitStruct.Mode  = GPIO_MODE_AF_PP;	// alternate function use
 | |
|   GPIO_InitStruct.Pull  = GPIO_NOPULL;			// no pullup
 | |
| 	GPIO_InitStruct.Alternate = GPIO_AF1_TIM1;// timer 5 is used
 | |
|   GPIO_InitStruct.Speed = GPIO_SPEED_FAST;	// speed is fast
 | |
|   HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
 | |
| 
 | |
|   TIM1->CCER = TIM_CCER_CC1E;								// compare for PWM usage
 | |
|   TIM1->PSC = 16;														// timer prescaler 
 | |
| 	TIM1->ARR = 255;												  // max count value
 | |
|   TIM1->CCR1 = lightness_to_pwm(0);				// duty cycle
 | |
| 	TIM1->CCMR1 = TIM_CCMR1_OC1M_2 | TIM_CCMR1_OC1M_1 | TIM_CCMR1_OC1PE;
 | |
| 	TIM1->EGR |= TIM_EGR_UG;									// update register now
 | |
| 	TIM1->CR1 = TIM_CR1_ARPE | TIM_CR1_CEN;		// start the timer	
 | |
| 	TIM1->BDTR = TIM_BDTR_MOE;								// master output enable
 | |
| 	//----------------------------------------------------------------------------
 | |
|   // Configure GPIO pin: PB4 (LED3) 
 | |
|   __HAL_RCC_GPIOB_CLK_ENABLE();							// enable GPIO timer
 | |
| 	__HAL_RCC_TIM3_CLK_ENABLE();							// enable timer 3 clock
 | |
|   GPIO_InitStruct.Pin   = GPIO_PIN_4;				// used pin is PB4
 | |
|   GPIO_InitStruct.Mode  = GPIO_MODE_AF_PP;	// alternate function use
 | |
|   GPIO_InitStruct.Pull  = GPIO_NOPULL;			// no pullup
 | |
| 	GPIO_InitStruct.Alternate = GPIO_AF2_TIM3;// timer 3 is used
 | |
|   GPIO_InitStruct.Speed = GPIO_SPEED_FAST;	// speed is fast
 | |
|   HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
 | |
| 
 | |
| 	TIM3->CCER = TIM_CCER_CC1E;								// compare for PWM usage
 | |
|   TIM3->PSC = 16;														// timer prescaler 
 | |
| 	TIM3->ARR = 255;												  // max count value
 | |
|   TIM3->CCR1 = lightness_to_pwm(0);				// duty cycle
 | |
| 	TIM3->CCMR1 = TIM_CCMR1_OC1M_2 | TIM_CCMR1_OC1M_1 | TIM_CCMR1_OC1PE;
 | |
| 	TIM3->EGR |= TIM_EGR_UG;									// update register now
 | |
| 	TIM3->CR1 = TIM_CR1_ARPE | TIM_CR1_CEN;		// start the timer	
 | |
|   return 0;
 | |
| }
 | |
| 
 | |
| //------------------------------------------------------------------------------
 | |
| //------------------------------------------------------------------------------
 | |
| int32_t Ext_LED_On (uint32_t num) {
 | |
| 
 | |
| 	if((num & 1) != 0)
 | |
| 	{
 | |
|       TIM2->CCR1 = lightness_to_pwm(LIGHTNESS_PWM_STEP);		
 | |
| 	}
 | |
| 	if((num & 2) != 0)
 | |
| 	{
 | |
|      TIM12->CCR1 = lightness_to_pwm(LIGHTNESS_PWM_STEP);		
 | |
| 	}
 | |
| 	if((num & 4) != 0)
 | |
| 	{
 | |
|      TIM1->CCR1 = lightness_to_pwm(LIGHTNESS_PWM_STEP);		
 | |
| 	}
 | |
| 	if((num & 8) != 0)
 | |
| 	{
 | |
|      TIM3->CCR1 = lightness_to_pwm(LIGHTNESS_PWM_STEP);		
 | |
| 	}
 | |
|   return 0;
 | |
| }
 | |
| 
 | |
| //------------------------------------------------------------------------------
 | |
| //------------------------------------------------------------------------------
 | |
| int32_t Ext_LED_Off (uint32_t num) {
 | |
| 
 | |
|  	if((num & 1) != 0)
 | |
| 	{
 | |
|      TIM2->CCR1 = lightness_to_pwm(0);			
 | |
| 	}
 | |
| 	if((num & 2) != 0)
 | |
| 	{
 | |
|      TIM12->CCR1 = lightness_to_pwm(0);		
 | |
| 	}
 | |
| 	if((num & 4) != 0)
 | |
| 	{
 | |
|      TIM1->CCR1 = lightness_to_pwm(0);		
 | |
| 	}
 | |
| 	if((num & 8) != 0)
 | |
| 	{
 | |
|      TIM3->CCR1 = lightness_to_pwm(0);		
 | |
| 	}
 | |
|   return 0;
 | |
| }
 | |
| 
 | |
| //------------------------------------------------------------------------------
 | |
| //------------------------------------------------------------------------------
 | |
| int32_t Ext_LED_PWM (uint32_t num, uint32_t duty) {
 | |
| 
 | |
| 	if((num & 1) != 0)
 | |
| 	{
 | |
|       TIM2->CCR1 = lightness_to_pwm(duty);		
 | |
| 	}
 | |
| 	if((num & 2) != 0)
 | |
| 	{
 | |
|      TIM12->CCR1 = lightness_to_pwm(duty);		
 | |
| 	}
 | |
| 	if((num & 4) != 0)
 | |
| 	{
 | |
|      TIM1->CCR1 = lightness_to_pwm(duty);		
 | |
| 	}
 | |
| 	if((num & 8) != 0)
 | |
| 	{
 | |
|      TIM3->CCR1 = lightness_to_pwm(duty);		
 | |
| 	}
 | |
|   return 0;
 | |
| }
 | |
| 
 | |
| //------------------------------------------------------------------------------
 | |
| //------------------------------------------------------------------------------
 | |
| int32_t Ext_LEDs(uint32_t num) {
 | |
| 
 | |
|   if((num & 1) != 0)
 | |
| 	{
 | |
|       TIM2->CCR1 = lightness_to_pwm(LIGHTNESS_PWM_STEP);		
 | |
| 	}
 | |
| 	else
 | |
| 	{
 | |
|       TIM2->CCR1 = lightness_to_pwm(0);		
 | |
| 	}
 | |
| 	if((num & 2) != 0)
 | |
| 	{
 | |
|      TIM12->CCR1 = lightness_to_pwm(LIGHTNESS_PWM_STEP);		
 | |
| 	}
 | |
| 	else
 | |
| 	{
 | |
|     TIM12->CCR1 = lightness_to_pwm(0);		
 | |
| 	}
 | |
| 	if((num & 4) != 0)
 | |
| 	{
 | |
|      TIM1->CCR1 = lightness_to_pwm(LIGHTNESS_PWM_STEP);	
 | |
| 	}
 | |
| 	else
 | |
| 	{
 | |
|      TIM1->CCR1 = lightness_to_pwm(0);			
 | |
| 	}
 | |
| 	if((num & 8) != 0)
 | |
| 	{
 | |
|      TIM3->CCR1 = lightness_to_pwm(LIGHTNESS_PWM_STEP);
 | |
| 	}
 | |
| 	else
 | |
| 	{
 | |
|      TIM3->CCR1 = lightness_to_pwm(0);			
 | |
| 	}
 | |
|   return 0;
 | |
| }
 |