global: add function to control LED blinking using PWM

This commit is contained in:
King Kévin 2017-12-12 13:55:38 +01:00
parent f34a8e9244
commit 57556ba19c
2 changed files with 56 additions and 0 deletions

View File

@ -61,6 +61,10 @@ char* b2s(uint64_t binary, uint8_t rjust)
/** switch on board LED */
void led_on(void)
{
#if defined(BUSVOODOO)
timer_disable_counter(TIM1); // disable timer for PWM
gpio_set_mode(GPIO(LED_PORT), GPIO_MODE_OUTPUT_2_MHZ, GPIO_CNF_OUTPUT_PUSHPULL, GPIO(LED_PIN)); // set LED pin to 'output push-pull'
#endif
#if defined(LED_ON) && LED_ON
gpio_set(GPIO(LED_PORT), GPIO(LED_PIN));
#else
@ -71,19 +75,52 @@ void led_on(void)
/** switch off board LED */
void led_off(void)
{
#if defined(BUSVOODOO)
timer_disable_counter(TIM1); // disable timer for PWM
gpio_set_mode(GPIO(LED_PORT), GPIO_MODE_INPUT, GPIO_CNF_INPUT_FLOAT, GPIO(LED_PIN)); // set LED pin to 'output push-pull'
#else
#if defined(LED_ON) && LED_ON
gpio_clear(GPIO(LED_PORT), GPIO(LED_PIN));
#else
gpio_set(GPIO(LED_PORT), GPIO(LED_PIN));
#endif
#endif
}
/** toggle board LED */
void led_toggle(void)
{
#if defined(BUSVOODOO)
timer_disable_counter(TIM1); // disable timer for PWM
gpio_set_mode(GPIO(LED_PORT), GPIO_MODE_OUTPUT_2_MHZ, GPIO_CNF_OUTPUT_PUSHPULL, GPIO(LED_PIN)); // set LED pin to 'output push-pull'
#endif
gpio_toggle(GPIO(LED_PORT), GPIO(LED_PIN));
}
#if defined(BUSVOODOO)
void led_blink(double period, double duty)
{
if (period<0.0 || period>6.0 || duty<0.0 || duty>1.0) { // input argument out of bounds
return; // do nothing
}
timer_disable_counter(TIM1); // disable timer for PWM before resetting it
if (0.0==period) { // no blinking
gpio_set_mode(GPIO(LED_PORT), GPIO_MODE_OUTPUT_2_MHZ, GPIO_CNF_OUTPUT_PUSHPULL, GPIO(LED_PIN)); // set LED pin as normal output
if (duty>0.5) { // LED should be on
gpio_set(GPIO(LED_PORT), GPIO(LED_PIN)); // switch LED on
} else { // LED should be off
gpio_clear(GPIO(LED_PORT), GPIO(LED_PIN)); // switch LED off
}
} else {
gpio_set_mode(GPIO(LED_PORT), GPIO_MODE_OUTPUT_2_MHZ, GPIO_CNF_OUTPUT_ALTFN_PUSHPULL, GPIO(LED_PIN)); // set LED pin to alternate function for PWM
timer_set_counter(TIM1, 0); // reset counter
timer_set_period(TIM1, 0xffff*(period/6.0)); // set period
timer_set_oc_value(TIM1, TIM_OC1, 0xffff*(period/6.0)*duty); // PWM duty cycle
timer_enable_counter(TIM1); // enable timer to start blinking
}
}
#endif
void sleep_us(uint32_t duration)
{
systick_counter_disable(); // disable SysTick to reconfigure it
@ -126,7 +163,18 @@ void board_setup(void)
{
// setup LED
rcc_periph_clock_enable(RCC_GPIO(LED_PORT)); // enable clock for LED
#if defined(BUSVOODOO)
// LED is connected to TIM1_CH1, allowing to used the PWM output so to display patterns
rcc_periph_clock_enable(RCC_TIM1); // enable clock for timer domain
timer_reset(TIM1); // reset timer configuration
timer_set_mode(TIM1, TIM_CR1_CKD_CK_INT, TIM_CR1_CMS_CENTER_1, TIM_CR1_DIR_UP); // configure timer to up counting mode (center aligned for more precise duty cycle control)
timer_set_oc_mode(TIM1, TIM_OC1, TIM_OCM_PWM1); // use PWM output compare mode
timer_enable_oc_output(TIM1, TIM_OC1); // enable output compare output
timer_enable_break_main_output(TIM1); // required to enable timer, even when no dead time is used
timer_set_prescaler(TIM1, 3296-1); // set prescaler to allow 3/3 seconds PWM output (72MHz/2^16/3296=0.33Hz)
#else
gpio_set_mode(GPIO(LED_PORT), GPIO_MODE_OUTPUT_2_MHZ, GPIO_CNF_OUTPUT_PUSHPULL, GPIO(LED_PIN)); // set LED pin to 'output push-pull'
#endif
led_off(); // switch off LED per default
// setup button

View File

@ -397,6 +397,14 @@ void led_off(void);
/** toggle board LED */
void led_toggle(void);
#if defined(BUSVOODOO)
/** set LED blinking pattern
* @param[in] period blue+red pattern duration in seconds (up to 3+3)
* @param[in] duty blue LED on duty cycle, before switching to red (0-1)
*/
void led_blink(double period, double duty);
#endif
/** go to sleep for some microseconds
* @param[in] duration sleep duration in us
*/