cpu/stm32f3: adapted to PWM interface changes
This commit is contained in:
parent
41cbc35b73
commit
cf7299c09e
@ -22,13 +22,16 @@
|
||||
#include <string.h>
|
||||
|
||||
#include "cpu.h"
|
||||
#include "periph/pwm.h"
|
||||
#include "periph_conf.h"
|
||||
|
||||
/* ignore file in case no PWM devices are defined */
|
||||
#if PWM_0_EN || PWM_1_EN
|
||||
/* guard file in case no PWM device is defined */
|
||||
#if (PWM_0_EN || PWM_1_EN)
|
||||
|
||||
int pwm_init(pwm_t dev, pwm_mode_t mode, unsigned int frequency, unsigned int resolution)
|
||||
/* pull the PWM header inside the guards for now. Guards will be removed on
|
||||
* adapting this driver implementation... */
|
||||
#include "periph/pwm.h"
|
||||
|
||||
uint32_t pwm_init(pwm_t dev, pwm_mode_t mode, uint32_t freq, uint16_t res)
|
||||
{
|
||||
TIM_TypeDef *tim = NULL;
|
||||
GPIO_TypeDef *port = NULL;
|
||||
@ -70,7 +73,7 @@ int pwm_init(pwm_t dev, pwm_mode_t mode, unsigned int frequency, unsigned int re
|
||||
#endif
|
||||
default:
|
||||
pwm_poweroff(dev);
|
||||
return -1;
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* setup pins: alternate function */
|
||||
@ -94,12 +97,12 @@ int pwm_init(pwm_t dev, pwm_mode_t mode, unsigned int frequency, unsigned int re
|
||||
tim->CCMR2 = 0;
|
||||
|
||||
/* set prescale and auto-reload registers to matching values for resolution and frequency */
|
||||
if ((resolution > 0xffff) || ((resolution * frequency) > pwm_clk)) {
|
||||
return -2;
|
||||
if ((res > 0xffff) || ((res * freq) > pwm_clk)) {
|
||||
return 0;
|
||||
}
|
||||
tim->PSC = (pwm_clk / (resolution * frequency)) - 1;
|
||||
tim->ARR = resolution - 1;
|
||||
frequency = (pwm_clk / (resolution * (tim->PSC + 1)));
|
||||
tim->PSC = (pwm_clk / (res * freq)) - 1;
|
||||
tim->ARR = res - 1;
|
||||
freq = (pwm_clk / (res * (tim->PSC + 1)));
|
||||
|
||||
/* set PWM mode */
|
||||
switch (mode) {
|
||||
@ -126,10 +129,26 @@ int pwm_init(pwm_t dev, pwm_mode_t mode, unsigned int frequency, unsigned int re
|
||||
/* enable PWM generation */
|
||||
pwm_start(dev);
|
||||
|
||||
return frequency;
|
||||
return freq;
|
||||
}
|
||||
|
||||
int pwm_set(pwm_t dev, int channel, unsigned int value)
|
||||
uint8_t pwm_channels(pwm_t dev)
|
||||
{
|
||||
switch (dev) {
|
||||
#if PWM_0_EN
|
||||
case PWM_0:
|
||||
return PWM_0_CHANNELS;
|
||||
#endif
|
||||
#if PWM_1_EN
|
||||
case PWM_1:
|
||||
return PWM_1_CHANNELS;
|
||||
#endif
|
||||
default:
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
void pwm_set(pwm_t dev, uint8_t channel, uint16_t value)
|
||||
{
|
||||
TIM_TypeDef *tim = NULL;
|
||||
|
||||
@ -145,14 +164,7 @@ int pwm_set(pwm_t dev, int channel, unsigned int value)
|
||||
break;
|
||||
#endif
|
||||
default:
|
||||
return -1;
|
||||
}
|
||||
|
||||
/* norm value to maximum possible value
|
||||
* Caution! A duty cycle exceeding the period length can lead to unexpected
|
||||
* behaviour on other MCUs. */
|
||||
if (value > 0xffff) {
|
||||
value = 0xffff;
|
||||
return;
|
||||
}
|
||||
|
||||
switch (channel) {
|
||||
@ -169,10 +181,8 @@ int pwm_set(pwm_t dev, int channel, unsigned int value)
|
||||
tim->CCR4 = value;
|
||||
break;
|
||||
default:
|
||||
return -2;
|
||||
return;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
void pwm_start(pwm_t dev)
|
||||
@ -239,4 +249,4 @@ void pwm_poweroff(pwm_t dev)
|
||||
}
|
||||
}
|
||||
|
||||
#endif /* PWM_0_EN || PWM_1_EN */
|
||||
#endif /* (PWM_0_EN || PWM_1_EN) */
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user