окай, а так
Спойлер#include "main.h"
#include "math.h"
//---------- #define TIM17_ARR 209 //168000000 : 800000 = 210 #define T0 (TIM17_ARR/3) #define T1 ((TIM17_ARR/3)*2)
//---------- __IO static uint8_t pwm_buf[] = {T0, T0, T1, T0, 0};
__IO static uint8_t buf[25] = {0};
__IO static uint8_t g_buf[] = {T1, T0, T0, T0, T0, T0, T0, T0, T0, T0, T0, T0, T0, T0, T0, T0, T0, T0, T0, T0, T0, T0, T0, T0, 0}; __IO static uint8_t r_buf[] = {T0, T0, T0, T0, T0, T0, T0, T0, T1, T0, T0, T0, T0, T0, T0, T0, T0, T0, T0, T0, T0, T0, T0, T0, 0}; __IO static uint8_t b_buf[] = {T0, T0, T0, T0, T0, T0, T0, T0, T0, T0, T0, T0, T0, T0, T0, T0, T1, T0, T0, T0, T0, T0, T0, T0, 0};
typedef struct { uint8_t r; uint8_t g; uint8_t b; } RGB_t;
typedef struct { uint16_t h; uint8_t s; uint8_t v; } HSV_t;
typedef struct { int h; int s; int v; } HSV_v2_t;
typedef struct { uint16_t h; uint8_t s; uint8_t v; } HSV_v3_t;
static const uint8_t max_whiteness = 15; //static const uint8_t max_value = 17;
static const uint8_t sixth_hue = 16; static const uint8_t third_hue = sixth_hue * 2; static const uint8_t half_hue = sixth_hue * 3; static const uint8_t two_thirds_hue = sixth_hue * 4; static const uint8_t five_sixths_hue = sixth_hue * 5; static const uint8_t full_hue = sixth_hue * 6;
//static const RGB_t black = {0, 0, 0}; static HSV_t _hsv = {0, 0, 0}; static RGB_t _rgb = {0, 0, 0}; //static uint8_t rgb_v2[3]={0, 0, 0}; static HSV_v2_t _hsv_v2 = {0, 0, 0}; static HSV_v3_t _hsv_v3 = {0, 0, 0};
static const uint8_t dim_curve[256] = { 0, 1, 1, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 10, 10, 10, 10, 10, 11, 11, 11, 11, 11, 12, 12, 12, 12, 12, 13, 13, 13, 13, 14, 14, 14, 14, 15, 15, 15, 16, 16, 16, 16, 17, 17, 17, 18, 18, 18, 19, 19, 19, 20, 20, 20, 21, 21, 22, 22, 22, 23, 23, 24, 24, 25, 25, 25, 26, 26, 27, 27, 28, 28, 29, 29, 30, 30, 31, 32, 32, 33, 33, 34, 35, 35, 36, 36, 37, 38, 38, 39, 40, 40, 41, 42, 43, 43, 44, 45, 46, 47, 48, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 68, 69, 70, 71, 73, 74, 75, 76, 78, 79, 81, 82, 83, 85, 86, 88, 90, 91, 93, 94, 96, 98, 99, 101, 103, 105, 107, 109, 110, 112, 114, 116, 118, 121, 123, 125, 127, 129, 132, 134, 136, 139, 141, 144, 146, 149, 151, 154, 157, 159, 162, 165, 168, 171, 174, 177, 180, 183, 186, 190, 193, 196, 200, 203, 207, 211, 214, 218, 222, 226, 230, 234, 238, 242, 248, 255, };
static uint8_t status = 0;
//---------- void led_brd_ini(void); void rcc_ini(void); void tim_pwm_ini(void);
//inline RGB_t rgb(uint8_t r, uint8_t g, uint8_t b) { // return (RGB_t) {r, g, b}; //}
//inline HSV_t hsv(uint8_t h, uint8_t s, uint8_t v) { // return (HSV_t) {h, s, v}; //}
void rgb2buf(RGB_t grb);
void hsv2rgb(HSV_t hsv); void hsv2rgb_v2(int hue, int sat, int val, uint8_t * colors); void hsv2rgb_v3(HSV_v3_t hsv); void hsv2rgb_my(HSV_v3_t hsv); void arhiv(void);
void DMA1_Channel1_IRQHandler(void);
//---------- int main(void) { led_brd_ini(); rcc_ini(); tim_pwm_ini(); _hsv.h = 0; _hsv.s = 255; _hsv.v = 255; _hsv_v2.h = 0; _hsv_v2.s = 255; _hsv_v2.v = 255; _hsv_v3.h = 0; _hsv_v3.s = 255; _hsv_v3.v = 255; while(1) { hsv2rgb_my(_hsv_v3); //hsv2rgb_my(_hsv_v2); //hsv2rgb(_hsv); rgb2buf(_rgb); DMA1_Channel1->CCR &= ~DMA_CCR_EN; DMA1_Channel1->CPAR = (uint32_t)(&TIM17->CCR1); DMA1_Channel1->CMAR = (uint32_t)(buf); DMA1_Channel1->CNDTR = 25; DMA1_Channel1->CCR |= DMA_CCR_EN; for(__IO uint32_t i=0; i<2000000; i++) { } if(_hsv_v3.h<359) _hsv_v3.h++; else _hsv_v3.h = 0; } }
//---------- MAIN //---------- //---------- //---------- //---------- //---------- void DMA1_Channel1_IRQHandler(void) { if(((DMA1->ISR) & DMA_ISR_TCIF1) == DMA_ISR_TCIF1) { DMA1->IFCR = DMA_IFCR_CTCIF1; status = 0; } }
//---------- void arhiv(void) { }
//---------- void hsv2rgb_my(HSV_v3_t hsv) { int hue = (int)(hsv.h); double val = (double)(hsv.v); // float sat = (float)(hsv.s); double r = 0; double g = 0; double b = 0; int sector = (hue / 60) % 6; switch(sector) { case 0: r = (double)val; g = (((double)(hue) * (double)4.325) / (double)255) * (double)val; b = 0; break; case 1: r = (double)255 - (((((double)hue - (double)60) * (double)4.325) / (double)255) * (double)val); g = (double)val; b = 0; break; case 2: r = 0; g = (double)val; b = ((((double)hue - (double)120) * (double)4.325) / (double)255) * (double)val; break; case 3: r = 0; g = (double)255 - (((((double)hue - (double)180) * (double)4.325) / (double)255) * (double)val); b = (double)val; break; case 4: r = ((((double)hue - (double)240) * (double)4.325) / (double)255) * (double)val; g = 0; b = (double)val; break; case 5: r = (double)val; g = 0; b = (double)255 - (((((double)hue - (double)300) * (double)4.325) / (double)255) * (double)val); break; } _rgb.r = (uint8_t)(round(r)); _rgb.g = (uint8_t)(round(g)); _rgb.b = (uint8_t)(round(b)); }
//---------- void hsv2rgb_v3(HSV_v3_t hsv) { //int qdrt=(hsv.v - (255 - hsv.s)); //if(hsv.v<hsv.s) hsv.s=hsv.v; if((hsv.h>=0)&&(hsv.h<60)) { _rgb.r = hsv.v; _rgb.b = 255-hsv.s; _rgb.g = (uint8_t)(((hsv.v - (255 - hsv.s))/60)*hsv.h); } else if((hsv.h>59)&&(hsv.h<120)) { _rgb.g = hsv.v; _rgb.b = 0; _rgb.r = (uint8_t)(hsv.v-(((hsv.v - (255 - hsv.s))/60)*(hsv.h-60))); } }
//---------- void hsv2rgb_v2(int hue, int sat, int val, uint8_t * colors) { int base; if (sat == 0) { // Achromatic color (gray). colors[0] = (uint8_t)val; colors[1] = (uint8_t)val; colors[2] = (uint8_t)val; } else { base = ((255 - sat) * val) >> 8; switch (hue / 60) { case 0: colors[0] = (uint8_t)val; colors[1] = (uint8_t)((((val - base) * hue) / 60) + base); colors[2] = (uint8_t)base; break; case 1: colors[0] = (uint8_t)((((val - base) * (60 - (hue % 60))) / 60) + base); colors[1] = (uint8_t)val; colors[2] = (uint8_t)base; break; case 2: colors[0] = (uint8_t)base; colors[1] = (uint8_t)val; colors[2] = (uint8_t)((((val - base) * (hue % 60)) / 60) + base); break; case 3: colors[0] = (uint8_t)base; colors[1] = (uint8_t)((((val - base) * (60 - (hue % 60))) / 60) + base); colors[2] = (uint8_t)val; break; case 4: colors[0] = (uint8_t)((((val - base) * (hue % 60)) / 60) + base); colors[1] = (uint8_t)base; colors[2] = (uint8_t)val; break; case 5: colors[0] = (uint8_t)val; colors[1] = (uint8_t)base; colors[2] = (uint8_t)((((val - base) * (60 - (hue % 60))) / 60) + base); break; } } }
//---------- void rgb2buf(RGB_t grb) { for(__IO uint8_t i=0; i<8; i++) { if((grb.g & (0x80>>i)) == 0) buf[i] = T0; else buf[i] = T1; if((grb.r & (0x80>>i)) == 0) buf[i+8] = T0; else buf[i+8] = T1; if((grb.b & (0x80>>i)) == 0) buf[i+16] = T0; else buf[i+16] = T1; } }
//---------- void hsv2rgb(HSV_t hsv) { uint8_t high = hsv.v * max_whiteness; uint8_t W; uint8_t low; uint8_t rising; uint8_t falling; uint8_t h_after_sixth; uint8_t z; uint16_t H; //if(hsv.v == 0) return black; //if(hsv.s == 0) return rgb(high, high, high); W = max_whiteness - hsv.s; low = hsv.v * W; rising = low; falling = high; h_after_sixth = hsv.h % sixth_hue; if (h_after_sixth > 0) {//not at primary color? ok, h_after_sixth = 1..sixth_hue - 1 z = hsv.s * (uint8_t)(hsv.v * h_after_sixth) / sixth_hue; rising += z; falling -= z + 1;//it's never 255, so ok } H = hsv.h; while (H >= full_hue) H -= full_hue; if (H < sixth_hue) {_rgb.r=high; _rgb.g=rising; _rgb.b=low;} else if (H < third_hue) {_rgb.r=falling; _rgb.g=high; _rgb.b=low;} else if (H < half_hue) {_rgb.r=low; _rgb.g=high; _rgb.b=rising;} else if (H < two_thirds_hue) {_rgb.r=low; _rgb.g=falling; _rgb.b=high;} else if (H < five_sixths_hue) {_rgb.r=rising; _rgb.g=low; _rgb.b=high;} else {_rgb.r=high; _rgb.g=low; _rgb.b=falling;} //return buf_1(high, low, falling); }
//---------- void tim_pwm_ini(void) { /* PB9 AF1 is TIM17 channel_1 */ //Clk PB9 RCC->AHB2ENR |= RCC_AHB2ENR_GPIOBEN; MODIFY_REG(GPIOB->MODER, GPIO_MODER_MODE9, GPIO_MODER_MODE9_1); GPIOB->OTYPER &= ~GPIO_OTYPER_OT9; GPIOB->OSPEEDR |= GPIO_OSPEEDER_OSPEEDR9; GPIOB->PUPDR &= ~GPIO_PUPDR_PUPD9; GPIOB->AFR[1] |= (1<<1*4); //Clk TIM17 RCC->APB2ENR |= RCC_APB2ENR_TIM17EN; TIM17->CR1 |= TIM_CR1_ARPE; //preload enable MODIFY_REG(TIM17->CCMR1, TIM_CCMR1_OC1M, TIM_CCMR1_OC1M_1 | TIM_CCMR1_OC1M_2 //PWM mode | TIM_CCMR1_OC1PE //CCR preload enable ); TIM17->CCER |= TIM_CCER_CC1E; //channel 1 output is enable TIM17->BDTR |= TIM_BDTR_MOE; TIM17->ARR = 209; //168000000:800000=210 TIM17->CCR1 = 0; //((TIM17->ARR)/3); TIM17->DIER |= TIM_DIER_CC1DE; TIM17->DIER |= TIM_DIER_UDE; TIM17->CR1 |= TIM_CR1_CEN; //Clk DMA1 enable RCC->AHB1ENR |= RCC_AHB1ENR_DMA1EN; DMA1_Channel1->CCR &= ~DMA_CCR_EN; MODIFY_REG(DMA1_Channel1->CCR, DMA_CCR_MEM2MEM | DMA_CCR_MSIZE | DMA_CCR_PSIZE | DMA_CCR_PINC, DMA_CCR_MINC | DMA_CCR_PSIZE_0 | DMA_CCR_DIR //| DMA_CCR_TCIE //| DMA_CCR_CIRC ); //DMA1_Channel1->CPAR = (uint32_t)(&TIM17->CCR1); //DMA1_Channel1->CMAR = (uint32_t)(pwm_buf); //DMA1_Channel1->CNDTR = 5; //NVIC_EnableIRQ(DMA1_Channel1_IRQn); RCC->AHB1ENR |= RCC_AHB1ENR_DMAMUX1EN; DMAMUX1_Channel0->CCR = (84<<DMAMUX_CxCR_DMAREQ_ID_Pos); //DMA1_Channel1->CCR |= DMA_CCR_EN; }
//---------- void rcc_ini(void) { MODIFY_REG(FLASH->ACR, FLASH_ACR_LATENCY, FLASH_ACR_LATENCY_4WS); while(((FLASH->ACR) & FLASH_ACR_LATENCY) != FLASH_ACR_LATENCY_4WS) { } CLEAR_BIT(PWR->CR5, PWR_CR5_R1MODE); SET_BIT(RCC->CR, RCC_CR_HSEON); while(((RCC->CR) & RCC_CR_HSEON) == 0) { } MODIFY_REG(RCC->PLLCFGR, RCC_PLLCFGR_PLLSRC | RCC_PLLCFGR_PLLM | RCC_PLLCFGR_PLLN | RCC_PLLCFGR_PLLR, RCC_PLLCFGR_PLLSRC_HSE | (42 << RCC_PLLCFGR_PLLN_Pos)); SET_BIT(RCC->PLLCFGR, RCC_PLLCFGR_PLLREN); SET_BIT(RCC->CR, RCC_CR_PLLON); while(((RCC->CR) & RCC_CR_PLLRDY) != RCC_CR_PLLRDY) { } MODIFY_REG(RCC->CFGR, RCC_CFGR_SW, RCC_CFGR_SW_PLL); MODIFY_REG(RCC->CFGR, RCC_CFGR_HPRE, RCC_CFGR_HPRE_DIV2); while(((RCC->CFGR) & RCC_CFGR_SWS) != RCC_CFGR_SWS_PLL) { } for (__IO uint32_t i = (170 >> 1); i !=0; i--); MODIFY_REG(RCC->CFGR, RCC_CFGR_HPRE, RCC_CFGR_HPRE_DIV1); MODIFY_REG(RCC->CFGR, RCC_CFGR_PPRE1, RCC_CFGR_PPRE1_DIV1); MODIFY_REG(RCC->CFGR, RCC_CFGR_PPRE2, RCC_CFGR_PPRE2_DIV1); /* Configure the SysTick to have interrupt in 1ms time base */ SysTick->LOAD = (uint32_t)((168000000 / 1000) - 1UL); /* set reload register */ SysTick->VAL = 0UL; /* Load the SysTick Counter Value */ SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | SysTick_CTRL_ENABLE_Msk; /* Enable the Systick Timer */ SystemCoreClock = 168000000; }
//---------- void led_brd_ini(void) { RCC->AHB2ENR |= RCC_AHB2ENR_GPIOCEN; MODIFY_REG(GPIOC->MODER, GPIO_MODER_MODE6, GPIO_MODER_MODE6_0); GPIOC->OTYPER &= ~GPIO_OTYPER_OT6; GPIOC->OSPEEDR |= GPIO_OSPEEDER_OSPEEDR6; MODIFY_REG(GPIOC->PUPDR, GPIO_PUPDR_PUPD6, GPIO_PUPDR_PUPD6_1); GPIOC->BSRR = GPIO_BSRR_BR6; }
//----------
|