parent
0fb4d67cce
commit
5730538c5f
@ -0,0 +1,13 @@ |
|||||||
|
#pragma once |
||||||
|
|
||||||
|
#include <libopencm3/stm32/timer.h> |
||||||
|
|
||||||
|
struct buzzer { |
||||||
|
uint32_t timer; |
||||||
|
enum tim_oc_id channel; |
||||||
|
}; |
||||||
|
|
||||||
|
void buzzer_init(struct buzzer *buzzer); |
||||||
|
void buzzer_enable(struct buzzer *buzzer); |
||||||
|
void buzzer_disable(struct buzzer *buzzer); |
||||||
|
void buzzer_set_freq(struct buzzer *buzzer, uint32_t freq); |
@ -0,0 +1,51 @@ |
|||||||
|
#include <libopencm3/stm32/gpio.h> |
||||||
|
#include <libopencm3/stm32/rcc.h> |
||||||
|
#include <libopencm3/stm32/timer.h> |
||||||
|
|
||||||
|
#include <buzzer.h> |
||||||
|
#include <macros.h> |
||||||
|
|
||||||
|
struct buzzer buzzers[] = { |
||||||
|
{ TIM1, TIM_OC1 }, |
||||||
|
{ TIM2, TIM_OC2 }, |
||||||
|
{ TIM3, TIM_OC1 }, |
||||||
|
{ TIM14, TIM_OC1 }, |
||||||
|
}; |
||||||
|
|
||||||
|
size_t nbuzzers = count_of(buzzers); |
||||||
|
|
||||||
|
void buzzer_init(struct buzzer *buzzer) |
||||||
|
{ |
||||||
|
timer_reset(buzzer->timer); |
||||||
|
|
||||||
|
timer_set_mode(buzzer->timer, TIM_CR1_CKD_CK_INT, TIM_CR1_CMS_EDGE, TIM_CR1_DIR_UP); |
||||||
|
|
||||||
|
timer_set_prescaler(buzzer->timer, 48); |
||||||
|
timer_set_repetition_counter(buzzer->timer, 0); |
||||||
|
timer_enable_preload(buzzer->timer); |
||||||
|
timer_enable_break_main_output(buzzer->timer); |
||||||
|
timer_continuous_mode(buzzer->timer); |
||||||
|
|
||||||
|
timer_disable_oc_output(buzzer->timer, buzzer->channel); |
||||||
|
timer_set_oc_mode(buzzer->timer, buzzer->channel, TIM_OCM_PWM1); |
||||||
|
timer_set_oc_value(buzzer->timer, buzzer->channel, 0); |
||||||
|
timer_enable_oc_output(buzzer->timer, buzzer->channel); |
||||||
|
} |
||||||
|
|
||||||
|
void buzzer_enable(struct buzzer *buzzer) |
||||||
|
{ |
||||||
|
timer_enable_counter(buzzer->timer); |
||||||
|
} |
||||||
|
|
||||||
|
void buzzer_disable(struct buzzer *buzzer) |
||||||
|
{ |
||||||
|
timer_disable_counter(buzzer->timer); |
||||||
|
} |
||||||
|
|
||||||
|
void buzzer_set_freq(struct buzzer *buzzer, uint32_t freq) |
||||||
|
{ |
||||||
|
uint32_t period = 1000000 / freq; |
||||||
|
|
||||||
|
timer_set_period(buzzer->timer, period); |
||||||
|
timer_set_oc_value(buzzer->timer, buzzer->channel, period / 2); |
||||||
|
} |
@ -0,0 +1,49 @@ |
|||||||
|
#include <libopencm3/stm32/gpio.h> |
||||||
|
#include <libopencm3/stm32/rcc.h> |
||||||
|
#include <libopencm3/stm32/timer.h> |
||||||
|
|
||||||
|
#include <buzzer.h> |
||||||
|
#include <macros.h> |
||||||
|
|
||||||
|
struct buzzer buzzers[] = { |
||||||
|
{ TIM2, TIM_OC3 }, |
||||||
|
{ TIM2, TIM_OC4 }, |
||||||
|
}; |
||||||
|
size_t nbuzzers = count_of(buzzers); |
||||||
|
|
||||||
|
void buzzer_init(struct buzzer *buzzer) |
||||||
|
{ |
||||||
|
timer_reset(buzzer->timer); |
||||||
|
|
||||||
|
timer_set_mode(buzzer->timer, TIM_CR1_CKD_CK_INT, TIM_CR1_CMS_EDGE, |
||||||
|
TIM_CR1_DIR_UP); |
||||||
|
|
||||||
|
timer_set_prescaler(buzzer->timer, 72); |
||||||
|
timer_set_repetition_counter(buzzer->timer, 0); |
||||||
|
timer_enable_preload(buzzer->timer); |
||||||
|
timer_enable_break_main_output(buzzer->timer); |
||||||
|
timer_continuous_mode(buzzer->timer); |
||||||
|
|
||||||
|
timer_disable_oc_output(buzzer->timer, buzzer->channel); |
||||||
|
timer_set_oc_mode(buzzer->timer, buzzer->channel, TIM_OCM_PWM1); |
||||||
|
timer_set_oc_value(buzzer->timer, buzzer->channel, 0); |
||||||
|
timer_enable_oc_output(buzzer->timer, buzzer->channel); |
||||||
|
} |
||||||
|
|
||||||
|
void buzzer_enable(struct buzzer *buzzer) |
||||||
|
{ |
||||||
|
timer_enable_counter(buzzer->timer); |
||||||
|
} |
||||||
|
|
||||||
|
void buzzer_disable(struct buzzer *buzzer) |
||||||
|
{ |
||||||
|
timer_disable_counter(buzzer->timer); |
||||||
|
} |
||||||
|
|
||||||
|
void buzzer_set_freq(struct buzzer *buzzer, uint32_t freq) |
||||||
|
{ |
||||||
|
uint32_t period = 1000000 / freq; |
||||||
|
|
||||||
|
timer_set_period(buzzer->timer, period); |
||||||
|
timer_set_oc_value(buzzer->timer, buzzer->channel, period / 2); |
||||||
|
} |
Loading…
Reference in new issue