void up_leds(int r, int g ,int b, int freqs) { long fosc = 72000000; long prescale = 2048; long p1s = fosc/prescale; long p0p5s = p1s/2; long p; static struct stm32_tim_dev_s *tim1 = 0; if (tim1 == 0) { tim1 = stm32_tim_init(1); STM32_TIM_SETMODE(tim1, STM32_TIM_MODE_UP); STM32_TIM_SETCLOCK(tim1, p1s-8); STM32_TIM_SETPERIOD(tim1, p1s); STM32_TIM_SETCOMPARE(tim1, 1, 0); STM32_TIM_SETCOMPARE(tim1, 2, 0); STM32_TIM_SETCOMPARE(tim1, 3, 0); STM32_TIM_SETCHANNEL(tim1, 1, STM32_TIM_CH_OUTPWM | STM32_TIM_CH_POLARITY_NEG); STM32_TIM_SETCHANNEL(tim1, 2, STM32_TIM_CH_OUTPWM | STM32_TIM_CH_POLARITY_NEG); STM32_TIM_SETCHANNEL(tim1, 3, STM32_TIM_CH_OUTPWM | STM32_TIM_CH_POLARITY_NEG); } p = freqs == 0 ? p1s : p1s / freqs; STM32_TIM_SETPERIOD(tim1, p); p = freqs == 0 ? p1s + 1 : p0p5s / freqs; STM32_TIM_SETCOMPARE(tim1, 2, (r * p) / 255); STM32_TIM_SETCOMPARE(tim1, 1, (b * p) / 255); STM32_TIM_SETCOMPARE(tim1, 3, (g * p) / 255); }
int sif_anout_init(void) { vsn_sif.tim3 = stm32_tim_init(3); vsn_sif.tim8 = stm32_tim_init(8); if (!vsn_sif.tim3 || !vsn_sif.tim8) return ERROR; // Use the TIM3 as PWM modulated analogue output STM32_TIM_SETPERIOD(vsn_sif.tim3, 5); STM32_TIM_SETCOMPARE(vsn_sif.tim3, GPIO_OUT_PWM_TIM3_CH, 3); STM32_TIM_SETCLOCK(vsn_sif.tim3, 36e6); STM32_TIM_SETMODE(vsn_sif.tim3, STM32_TIM_MODE_UP); STM32_TIM_SETCHANNEL(vsn_sif.tim3, GPIO_OUT_PWM_TIM3_CH, STM32_TIM_CH_OUTPWM | STM32_TIM_CH_POLARITY_NEG); // Use the TIM8 to drive the upper power mosfet STM32_TIM_SETISR(vsn_sif.tim8, sif_anout_isr, 0); STM32_TIM_ENABLEINT(vsn_sif.tim8, 0); STM32_TIM_SETPERIOD(vsn_sif.tim8, 4096); STM32_TIM_SETCOMPARE(vsn_sif.tim8, GPIO_OUT_PWRPWM_TIM8_CH, 5000); STM32_TIM_SETCLOCK(vsn_sif.tim8, 36e6); STM32_TIM_SETMODE(vsn_sif.tim8, STM32_TIM_MODE_UP); //STM32_TIM_SETCHANNEL(vsn_sif.tim8, GPIO_OUT_PWRPWM_TIM8_CH, STM32_TIM_CH_OUTPWM | STM32_TIM_CH_POLARITY_NEG); vsn_sif.i2c1 = up_i2cinitialize(1); vsn_sif.i2c2 = up_i2cinitialize(2); vsn_sif.spi2 = up_spiinitialize(2); return OK; }