Thomas Daede
12 years ago
2 changed files with 10 additions and 929 deletions
@ -1,928 +0,0 @@ |
|||
/*
|
|||
* This file is part of the libopencm3 project. |
|||
* |
|||
* Copyright (C) 2010 Edward Cheeseman <evbuilder@users.sourceforge.org> |
|||
* Copyright (C) 2011 Stephen Caudle <scaudle@doceme.com> |
|||
* |
|||
* This library is free software: you can redistribute it and/or modify |
|||
* it under the terms of the GNU Lesser General Public License as published by |
|||
* the Free Software Foundation, either version 3 of the License, or |
|||
* (at your option) any later version. |
|||
* |
|||
* This library is distributed in the hope that it will be useful, |
|||
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
|||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|||
* GNU Lesser General Public License for more details. |
|||
* |
|||
* You should have received a copy of the GNU Lesser General Public License |
|||
* along with this library. If not, see <http://www.gnu.org/licenses/>.
|
|||
*/ |
|||
|
|||
/*
|
|||
* Basic TIMER handling API. |
|||
* |
|||
* Examples: |
|||
* timer_set_mode(TIM1, TIM_CR1_CKD_CK_INT_MUL_2, |
|||
* TIM_CR1_CMS_CENTRE_3, TIM_CR1_DIR_UP); |
|||
*/ |
|||
|
|||
#include <libopencm3/stm32/f4/timer.h> |
|||
#include <libopencm3/stm32/f4/rcc.h> |
|||
|
|||
void timer_reset(u32 timer_peripheral) |
|||
{ |
|||
switch (timer_peripheral) { |
|||
case TIM1: |
|||
rcc_peripheral_reset(&RCC_APB2RSTR, RCC_APB2RSTR_TIM1RST); |
|||
rcc_peripheral_clear_reset(&RCC_APB2RSTR, RCC_APB2RSTR_TIM1RST); |
|||
break; |
|||
case TIM2: |
|||
rcc_peripheral_reset(&RCC_APB1RSTR, RCC_APB1RSTR_TIM2RST); |
|||
rcc_peripheral_clear_reset(&RCC_APB1RSTR, RCC_APB1RSTR_TIM2RST); |
|||
break; |
|||
case TIM3: |
|||
rcc_peripheral_reset(&RCC_APB1RSTR, RCC_APB1RSTR_TIM3RST); |
|||
rcc_peripheral_clear_reset(&RCC_APB1RSTR, RCC_APB1RSTR_TIM3RST); |
|||
break; |
|||
case TIM4: |
|||
rcc_peripheral_reset(&RCC_APB1RSTR, RCC_APB1RSTR_TIM4RST); |
|||
rcc_peripheral_clear_reset(&RCC_APB1RSTR, RCC_APB1RSTR_TIM4RST); |
|||
break; |
|||
case TIM5: |
|||
rcc_peripheral_reset(&RCC_APB1RSTR, RCC_APB1RSTR_TIM5RST); |
|||
rcc_peripheral_clear_reset(&RCC_APB1RSTR, RCC_APB1RSTR_TIM5RST); |
|||
break; |
|||
case TIM6: |
|||
rcc_peripheral_reset(&RCC_APB1RSTR, RCC_APB1RSTR_TIM6RST); |
|||
rcc_peripheral_clear_reset(&RCC_APB1RSTR, RCC_APB1RSTR_TIM6RST); |
|||
break; |
|||
case TIM7: |
|||
rcc_peripheral_reset(&RCC_APB1RSTR, RCC_APB1RSTR_TIM7RST); |
|||
rcc_peripheral_clear_reset(&RCC_APB1RSTR, RCC_APB1RSTR_TIM7RST); |
|||
break; |
|||
case TIM8: |
|||
rcc_peripheral_reset(&RCC_APB2RSTR, RCC_APB2RSTR_TIM8RST); |
|||
rcc_peripheral_clear_reset(&RCC_APB2RSTR, RCC_APB2RSTR_TIM8RST); |
|||
break; |
|||
/* These timers are not supported in libopencm3 yet */ |
|||
/*
|
|||
case TIM9: |
|||
rcc_peripheral_reset(&RCC_APB2RSTR, RCC_APB2RSTR_TIM9RST); |
|||
rcc_peripheral_clear_reset(&RCC_APB2RSTR, RCC_APB2RSTR_TIM9RST); |
|||
break; |
|||
case TIM10: |
|||
rcc_peripheral_reset(&RCC_APB2RSTR, RCC_APB2RSTR_TIM10RST); |
|||
rcc_peripheral_clear_reset(&RCC_APB2RSTR, RCC_APB2RSTR_TIM10RST); |
|||
break; |
|||
case TIM11: |
|||
rcc_peripheral_reset(&RCC_APB2RSTR, RCC_APB2RSTR_TIM11RST); |
|||
rcc_peripheral_clear_reset(&RCC_APB2RSTR, RCC_APB2RSTR_TIM11RST); |
|||
break; |
|||
case TIM12: |
|||
rcc_peripheral_reset(&RCC_APB1RSTR, RCC_APB1RSTR_TIM12RST); |
|||
rcc_peripheral_clear_reset(&RCC_APB1RSTR, RCC_APB1RSTR_TIM12RST); |
|||
break; |
|||
case TIM13: |
|||
rcc_peripheral_reset(&RCC_APB1RSTR, RCC_APB1RSTR_TIM13RST); |
|||
rcc_peripheral_clear_reset(&RCC_APB1RSTR, RCC_APB1RSTR_TIM13RST); |
|||
break; |
|||
case TIM14: |
|||
rcc_peripheral_reset(&RCC_APB1RSTR, RCC_APB1RSTR_TIM14RST); |
|||
rcc_peripheral_clear_reset(&RCC_APB1RSTR, RCC_APB1RSTR_TIM14RST); |
|||
break; |
|||
*/ |
|||
} |
|||
} |
|||
|
|||
void timer_enable_irq(u32 timer_peripheral, u32 irq) |
|||
{ |
|||
TIM_DIER(timer_peripheral) |= irq; |
|||
} |
|||
|
|||
void timer_disable_irq(u32 timer_peripheral, u32 irq) |
|||
{ |
|||
TIM_DIER(timer_peripheral) &= ~irq; |
|||
} |
|||
|
|||
bool timer_get_flag(u32 timer_peripheral, u32 flag) |
|||
{ |
|||
if (((TIM_SR(timer_peripheral) & flag) != 0) && |
|||
((TIM_DIER(timer_peripheral) & flag) != 0)) { |
|||
return true; |
|||
} |
|||
|
|||
return false; |
|||
} |
|||
|
|||
void timer_clear_flag(u32 timer_peripheral, u32 flag) |
|||
{ |
|||
TIM_SR(timer_peripheral) &= ~flag; |
|||
} |
|||
|
|||
void timer_set_mode(u32 timer_peripheral, u32 clock_div, |
|||
u32 alignment, u32 direction) |
|||
{ |
|||
u32 cr1; |
|||
|
|||
cr1 = TIM_CR1(timer_peripheral); |
|||
|
|||
cr1 &= ~(TIM_CR1_CKD_CK_INT_MASK | TIM_CR1_CMS_MASK | TIM_CR1_DIR_DOWN); |
|||
|
|||
cr1 |= clock_div | alignment | direction; |
|||
|
|||
TIM_CR1(timer_peripheral) = cr1; |
|||
} |
|||
|
|||
void timer_set_clock_division(u32 timer_peripheral, u32 clock_div) |
|||
{ |
|||
clock_div &= TIM_CR1_CKD_CK_INT_MASK; |
|||
TIM_CR1(timer_peripheral) &= ~TIM_CR1_CKD_CK_INT_MASK; |
|||
TIM_CR1(timer_peripheral) |= clock_div; |
|||
} |
|||
|
|||
void timer_enable_preload(u32 timer_peripheral) |
|||
{ |
|||
TIM_CR1(timer_peripheral) |= TIM_CR1_ARPE; |
|||
} |
|||
|
|||
void timer_disable_preload(u32 timer_peripheral) |
|||
{ |
|||
TIM_CR1(timer_peripheral) &= ~TIM_CR1_ARPE; |
|||
} |
|||
|
|||
void timer_set_alignment(u32 timer_peripheral, u32 alignment) |
|||
{ |
|||
alignment &= TIM_CR1_CMS_MASK; |
|||
TIM_CR1(timer_peripheral) &= ~TIM_CR1_CMS_MASK; |
|||
TIM_CR1(timer_peripheral) |= alignment; |
|||
} |
|||
|
|||
void timer_direction_up(u32 timer_peripheral) |
|||
{ |
|||
TIM_CR1(timer_peripheral) &= ~TIM_CR1_DIR_DOWN; |
|||
} |
|||
|
|||
void timer_direction_down(u32 timer_peripheral) |
|||
{ |
|||
TIM_CR1(timer_peripheral) |= TIM_CR1_DIR_DOWN; |
|||
} |
|||
|
|||
void timer_one_shot_mode(u32 timer_peripheral) |
|||
{ |
|||
TIM_CR1(timer_peripheral) |= TIM_CR1_OPM; |
|||
} |
|||
|
|||
void timer_continuous_mode(u32 timer_peripheral) |
|||
{ |
|||
TIM_CR1(timer_peripheral) &= ~TIM_CR1_OPM; |
|||
} |
|||
|
|||
void timer_update_on_any(u32 timer_peripheral) |
|||
{ |
|||
TIM_CR1(timer_peripheral) &= ~TIM_CR1_URS; |
|||
} |
|||
|
|||
void timer_update_on_overflow(u32 timer_peripheral) |
|||
{ |
|||
TIM_CR1(timer_peripheral) |= TIM_CR1_URS; |
|||
} |
|||
|
|||
void timer_enable_update_event(u32 timer_peripheral) |
|||
{ |
|||
TIM_CR1(timer_peripheral) &= ~TIM_CR1_UDIS; |
|||
} |
|||
|
|||
void timer_disable_update_event(u32 timer_peripheral) |
|||
{ |
|||
TIM_CR1(timer_peripheral) |= TIM_CR1_UDIS; |
|||
} |
|||
|
|||
void timer_enable_counter(u32 timer_peripheral) |
|||
{ |
|||
TIM_CR1(timer_peripheral) |= TIM_CR1_CEN; |
|||
} |
|||
|
|||
void timer_disable_counter(u32 timer_peripheral) |
|||
{ |
|||
TIM_CR1(timer_peripheral) &= ~TIM_CR1_CEN; |
|||
} |
|||
|
|||
void timer_set_output_idle_state(u32 timer_peripheral, u32 outputs) |
|||
{ |
|||
TIM_CR2(timer_peripheral) |= outputs & TIM_CR2_OIS_MASK; |
|||
} |
|||
|
|||
void timer_reset_output_idle_state(u32 timer_peripheral, u32 outputs) |
|||
{ |
|||
TIM_CR2(timer_peripheral) &= ~(outputs & TIM_CR2_OIS_MASK); |
|||
} |
|||
|
|||
void timer_set_ti1_ch123_xor(u32 timer_peripheral) |
|||
{ |
|||
TIM_CR2(timer_peripheral) |= TIM_CR2_TI1S; |
|||
} |
|||
|
|||
void timer_set_ti1_ch1(u32 timer_peripheral) |
|||
{ |
|||
TIM_CR2(timer_peripheral) &= ~TIM_CR2_TI1S; |
|||
} |
|||
|
|||
void timer_set_master_mode(u32 timer_peripheral, u32 mode) |
|||
{ |
|||
TIM_CR2(timer_peripheral) &= ~TIM_CR2_MMS_MASK; |
|||
TIM_CR2(timer_peripheral) |= mode; |
|||
} |
|||
|
|||
void timer_set_dma_on_compare_event(u32 timer_peripheral) |
|||
{ |
|||
TIM_CR2(timer_peripheral) &= ~TIM_CR2_CCDS; |
|||
} |
|||
|
|||
void timer_set_dma_on_update_event(u32 timer_peripheral) |
|||
{ |
|||
TIM_CR2(timer_peripheral) |= TIM_CR2_CCDS; |
|||
} |
|||
|
|||
void timer_enable_compare_control_update_on_trigger(u32 timer_peripheral) |
|||
{ |
|||
TIM_CR2(timer_peripheral) |= TIM_CR2_CCUS; |
|||
} |
|||
|
|||
void timer_disable_compare_control_update_on_trigger(u32 timer_peripheral) |
|||
{ |
|||
TIM_CR2(timer_peripheral) &= ~TIM_CR2_CCUS; |
|||
} |
|||
|
|||
void timer_enable_preload_complementry_enable_bits(u32 timer_peripheral) |
|||
{ |
|||
TIM_CR2(timer_peripheral) |= TIM_CR2_CCPC; |
|||
} |
|||
|
|||
void timer_disable_preload_complementry_enable_bits(u32 timer_peripheral) |
|||
{ |
|||
TIM_CR2(timer_peripheral) &= ~TIM_CR2_CCPC; |
|||
} |
|||
|
|||
void timer_set_prescaler(u32 timer_peripheral, u32 value) |
|||
{ |
|||
TIM_PSC(timer_peripheral) = value; |
|||
} |
|||
|
|||
void timer_set_repetition_counter(u32 timer_peripheral, u32 value) |
|||
{ |
|||
if ((timer_peripheral == TIM1) || (timer_peripheral == TIM8)) |
|||
TIM_RCR(timer_peripheral) = value; |
|||
} |
|||
|
|||
void timer_set_period(u32 timer_peripheral, u32 period) |
|||
{ |
|||
TIM_ARR(timer_peripheral) = period; |
|||
} |
|||
|
|||
void timer_enable_oc_clear(u32 timer_peripheral, enum tim_oc_id oc_id) |
|||
{ |
|||
switch (oc_id) { |
|||
case TIM_OC1: |
|||
TIM_CCMR1(timer_peripheral) |= TIM_CCMR1_OC1CE; |
|||
break; |
|||
case TIM_OC2: |
|||
TIM_CCMR1(timer_peripheral) |= TIM_CCMR1_OC2CE; |
|||
break; |
|||
case TIM_OC3: |
|||
TIM_CCMR2(timer_peripheral) |= TIM_CCMR2_OC3CE; |
|||
break; |
|||
case TIM_OC4: |
|||
TIM_CCMR2(timer_peripheral) |= TIM_CCMR2_OC4CE; |
|||
break; |
|||
case TIM_OC1N: |
|||
case TIM_OC2N: |
|||
case TIM_OC3N: |
|||
/* Ignoring as fast enable only applies to the whole channel. */ |
|||
break; |
|||
} |
|||
} |
|||
|
|||
void timer_disable_oc_clear(u32 timer_peripheral, enum tim_oc_id oc_id) |
|||
{ |
|||
switch (oc_id) { |
|||
case TIM_OC1: |
|||
TIM_CCMR1(timer_peripheral) &= ~TIM_CCMR1_OC1CE; |
|||
break; |
|||
case TIM_OC2: |
|||
TIM_CCMR1(timer_peripheral) &= ~TIM_CCMR1_OC2CE; |
|||
break; |
|||
case TIM_OC3: |
|||
TIM_CCMR2(timer_peripheral) &= ~TIM_CCMR2_OC3CE; |
|||
break; |
|||
case TIM_OC4: |
|||
TIM_CCMR2(timer_peripheral) &= ~TIM_CCMR2_OC4CE; |
|||
break; |
|||
case TIM_OC1N: |
|||
case TIM_OC2N: |
|||
case TIM_OC3N: |
|||
/* Ignoring as fast enable only applies to the whole channel. */ |
|||
break; |
|||
} |
|||
} |
|||
|
|||
void timer_set_oc_fast_mode(u32 timer_peripheral, enum tim_oc_id oc_id) |
|||
{ |
|||
switch (oc_id) { |
|||
case TIM_OC1: |
|||
TIM_CCMR1(timer_peripheral) |= TIM_CCMR1_OC1FE; |
|||
break; |
|||
case TIM_OC2: |
|||
TIM_CCMR1(timer_peripheral) |= TIM_CCMR1_OC2FE; |
|||
break; |
|||
case TIM_OC3: |
|||
TIM_CCMR2(timer_peripheral) |= TIM_CCMR2_OC3FE; |
|||
break; |
|||
case TIM_OC4: |
|||
TIM_CCMR2(timer_peripheral) |= TIM_CCMR2_OC4FE; |
|||
break; |
|||
case TIM_OC1N: |
|||
case TIM_OC2N: |
|||
case TIM_OC3N: |
|||
/* Ignoring as fast enable only applies to the whole channel. */ |
|||
break; |
|||
} |
|||
} |
|||
|
|||
void timer_set_oc_slow_mode(u32 timer_peripheral, enum tim_oc_id oc_id) |
|||
{ |
|||
switch (oc_id) { |
|||
case TIM_OC1: |
|||
TIM_CCMR1(timer_peripheral) &= ~TIM_CCMR1_OC1FE; |
|||
break; |
|||
case TIM_OC2: |
|||
TIM_CCMR1(timer_peripheral) &= ~TIM_CCMR1_OC2FE; |
|||
break; |
|||
case TIM_OC3: |
|||
TIM_CCMR2(timer_peripheral) &= ~TIM_CCMR2_OC3FE; |
|||
break; |
|||
case TIM_OC4: |
|||
TIM_CCMR2(timer_peripheral) &= ~TIM_CCMR2_OC4FE; |
|||
break; |
|||
case TIM_OC1N: |
|||
case TIM_OC2N: |
|||
case TIM_OC3N: |
|||
/* Ignoring as this option applies to the whole channel. */ |
|||
break; |
|||
} |
|||
} |
|||
|
|||
void timer_set_oc_mode(u32 timer_peripheral, enum tim_oc_id oc_id, |
|||
enum tim_oc_mode oc_mode) |
|||
{ |
|||
switch (oc_id) { |
|||
case TIM_OC1: |
|||
TIM_CCMR1(timer_peripheral) &= ~TIM_CCMR1_CC1S_MASK; |
|||
TIM_CCMR1(timer_peripheral) |= TIM_CCMR1_CC1S_OUT; |
|||
TIM_CCMR1(timer_peripheral) &= ~TIM_CCMR1_OC1M_MASK; |
|||
switch (oc_mode) { |
|||
case TIM_OCM_FROZEN: |
|||
TIM_CCMR1(timer_peripheral) |= TIM_CCMR1_OC1M_FROZEN; |
|||
break; |
|||
case TIM_OCM_ACTIVE: |
|||
TIM_CCMR1(timer_peripheral) |= TIM_CCMR1_OC1M_ACTIVE; |
|||
break; |
|||
case TIM_OCM_INACTIVE: |
|||
TIM_CCMR1(timer_peripheral) |= TIM_CCMR1_OC1M_INACTIVE; |
|||
break; |
|||
case TIM_OCM_TOGGLE: |
|||
TIM_CCMR1(timer_peripheral) |= TIM_CCMR1_OC1M_TOGGLE; |
|||
break; |
|||
case TIM_OCM_FORCE_LOW: |
|||
TIM_CCMR1(timer_peripheral) |= TIM_CCMR1_OC1M_FORCE_LOW; |
|||
break; |
|||
case TIM_OCM_FORCE_HIGH: |
|||
TIM_CCMR1(timer_peripheral) |= |
|||
TIM_CCMR1_OC1M_FORCE_HIGH; |
|||
break; |
|||
case TIM_OCM_PWM1: |
|||
TIM_CCMR1(timer_peripheral) |= TIM_CCMR1_OC1M_PWM1; |
|||
break; |
|||
case TIM_OCM_PWM2: |
|||
TIM_CCMR1(timer_peripheral) |= TIM_CCMR1_OC1M_PWM2; |
|||
break; |
|||
} |
|||
break; |
|||
case TIM_OC2: |
|||
TIM_CCMR1(timer_peripheral) &= ~TIM_CCMR1_CC2S_MASK; |
|||
TIM_CCMR1(timer_peripheral) |= TIM_CCMR1_CC2S_OUT; |
|||
TIM_CCMR1(timer_peripheral) &= ~TIM_CCMR1_OC2M_MASK; |
|||
switch (oc_mode) { |
|||
case TIM_OCM_FROZEN: |
|||
TIM_CCMR1(timer_peripheral) |= TIM_CCMR1_OC2M_FROZEN; |
|||
break; |
|||
case TIM_OCM_ACTIVE: |
|||
TIM_CCMR1(timer_peripheral) |= TIM_CCMR1_OC2M_ACTIVE; |
|||
break; |
|||
case TIM_OCM_INACTIVE: |
|||
TIM_CCMR1(timer_peripheral) |= TIM_CCMR1_OC2M_INACTIVE; |
|||
break; |
|||
case TIM_OCM_TOGGLE: |
|||
TIM_CCMR1(timer_peripheral) |= TIM_CCMR1_OC2M_TOGGLE; |
|||
break; |
|||
case TIM_OCM_FORCE_LOW: |
|||
TIM_CCMR1(timer_peripheral) |= TIM_CCMR1_OC2M_FORCE_LOW; |
|||
break; |
|||
case TIM_OCM_FORCE_HIGH: |
|||
TIM_CCMR1(timer_peripheral) |= |
|||
TIM_CCMR1_OC2M_FORCE_HIGH; |
|||
break; |
|||
case TIM_OCM_PWM1: |
|||
TIM_CCMR1(timer_peripheral) |= TIM_CCMR1_OC2M_PWM1; |
|||
break; |
|||
case TIM_OCM_PWM2: |
|||
TIM_CCMR1(timer_peripheral) |= TIM_CCMR1_OC2M_PWM2; |
|||
break; |
|||
} |
|||
break; |
|||
case TIM_OC3: |
|||
TIM_CCMR1(timer_peripheral) &= ~TIM_CCMR2_CC3S_MASK; |
|||
TIM_CCMR1(timer_peripheral) |= TIM_CCMR2_CC3S_OUT; |
|||
TIM_CCMR2(timer_peripheral) &= ~TIM_CCMR2_OC3M_MASK; |
|||
switch (oc_mode) { |
|||
case TIM_OCM_FROZEN: |
|||
TIM_CCMR2(timer_peripheral) |= TIM_CCMR2_OC3M_FROZEN; |
|||
break; |
|||
case TIM_OCM_ACTIVE: |
|||
TIM_CCMR1(timer_peripheral) |= TIM_CCMR2_OC3M_ACTIVE; |
|||
break; |
|||
case TIM_OCM_INACTIVE: |
|||
TIM_CCMR2(timer_peripheral) |= TIM_CCMR2_OC3M_INACTIVE; |
|||
break; |
|||
case TIM_OCM_TOGGLE: |
|||
TIM_CCMR2(timer_peripheral) |= TIM_CCMR2_OC3M_TOGGLE; |
|||
break; |
|||
case TIM_OCM_FORCE_LOW: |
|||
TIM_CCMR2(timer_peripheral) |= TIM_CCMR2_OC3M_FORCE_LOW; |
|||
break; |
|||
case TIM_OCM_FORCE_HIGH: |
|||
TIM_CCMR2(timer_peripheral) |= |
|||
TIM_CCMR2_OC3M_FORCE_HIGH; |
|||
break; |
|||
case TIM_OCM_PWM1: |
|||
TIM_CCMR2(timer_peripheral) |= TIM_CCMR2_OC3M_PWM1; |
|||
break; |
|||
case TIM_OCM_PWM2: |
|||
TIM_CCMR2(timer_peripheral) |= TIM_CCMR2_OC3M_PWM2; |
|||
break; |
|||
} |
|||
break; |
|||
case TIM_OC4: |
|||
TIM_CCMR1(timer_peripheral) &= ~TIM_CCMR2_CC4S_MASK; |
|||
TIM_CCMR1(timer_peripheral) |= TIM_CCMR2_CC4S_OUT; |
|||
TIM_CCMR2(timer_peripheral) &= ~TIM_CCMR2_OC4M_MASK; |
|||
switch (oc_mode) { |
|||
case TIM_OCM_FROZEN: |
|||
TIM_CCMR2(timer_peripheral) |= TIM_CCMR2_OC4M_FROZEN; |
|||
break; |
|||
case TIM_OCM_ACTIVE: |
|||
TIM_CCMR1(timer_peripheral) |= TIM_CCMR2_OC4M_ACTIVE; |
|||
break; |
|||
case TIM_OCM_INACTIVE: |
|||
TIM_CCMR2(timer_peripheral) |= TIM_CCMR2_OC4M_INACTIVE; |
|||
break; |
|||
case TIM_OCM_TOGGLE: |
|||
TIM_CCMR2(timer_peripheral) |= TIM_CCMR2_OC4M_TOGGLE; |
|||
break; |
|||
case TIM_OCM_FORCE_LOW: |
|||
TIM_CCMR2(timer_peripheral) |= TIM_CCMR2_OC4M_FORCE_LOW; |
|||
break; |
|||
case TIM_OCM_FORCE_HIGH: |
|||
TIM_CCMR2(timer_peripheral) |= |
|||
TIM_CCMR2_OC4M_FORCE_HIGH; |
|||
break; |
|||
case TIM_OCM_PWM1: |
|||
TIM_CCMR2(timer_peripheral) |= TIM_CCMR2_OC4M_PWM1; |
|||
break; |
|||
case TIM_OCM_PWM2: |
|||
TIM_CCMR2(timer_peripheral) |= TIM_CCMR2_OC4M_PWM2; |
|||
break; |
|||
} |
|||
break; |
|||
case TIM_OC1N: |
|||
case TIM_OC2N: |
|||
case TIM_OC3N: |
|||
/* Ignoring as this option applies to the whole channel. */ |
|||
break; |
|||
} |
|||
} |
|||
|
|||
void timer_enable_oc_preload(u32 timer_peripheral, enum tim_oc_id oc_id) |
|||
{ |
|||
switch (oc_id) { |
|||
case TIM_OC1: |
|||
TIM_CCMR1(timer_peripheral) |= TIM_CCMR1_OC1PE; |
|||
break; |
|||
case TIM_OC2: |
|||
TIM_CCMR1(timer_peripheral) |= TIM_CCMR1_OC2PE; |
|||
break; |
|||
case TIM_OC3: |
|||
TIM_CCMR2(timer_peripheral) |= TIM_CCMR2_OC3PE; |
|||
break; |
|||
case TIM_OC4: |
|||
TIM_CCMR2(timer_peripheral) |= TIM_CCMR2_OC4PE; |
|||
break; |
|||
case TIM_OC1N: |
|||
case TIM_OC2N: |
|||
case TIM_OC3N: |
|||
/* Ignoring as this option applies to the whole channel. */ |
|||
break; |
|||
} |
|||
} |
|||
|
|||
void timer_disable_oc_preload(u32 timer_peripheral, enum tim_oc_id oc_id) |
|||
{ |
|||
switch (oc_id) { |
|||
case TIM_OC1: |
|||
TIM_CCMR1(timer_peripheral) &= ~TIM_CCMR1_OC1PE; |
|||
break; |
|||
case TIM_OC2: |
|||
TIM_CCMR1(timer_peripheral) &= ~TIM_CCMR1_OC2PE; |
|||
break; |
|||
case TIM_OC3: |
|||
TIM_CCMR2(timer_peripheral) &= ~TIM_CCMR2_OC3PE; |
|||
break; |
|||
case TIM_OC4: |
|||
TIM_CCMR2(timer_peripheral) &= ~TIM_CCMR2_OC4PE; |
|||
break; |
|||
case TIM_OC1N: |
|||
case TIM_OC2N: |
|||
case TIM_OC3N: |
|||
/* Ignoring as this option applies to the whole channel. */ |
|||
break; |
|||
} |
|||
} |
|||
|
|||
void timer_set_oc_polarity_high(u32 timer_peripheral, enum tim_oc_id oc_id) |
|||
{ |
|||
switch (oc_id) { |
|||
case TIM_OC1: |
|||
TIM_CCER(timer_peripheral) &= ~TIM_CCER_CC1P; |
|||
break; |
|||
case TIM_OC2: |
|||
TIM_CCER(timer_peripheral) &= ~TIM_CCER_CC2P; |
|||
break; |
|||
case TIM_OC3: |
|||
TIM_CCER(timer_peripheral) &= ~TIM_CCER_CC3P; |
|||
break; |
|||
case TIM_OC4: |
|||
TIM_CCER(timer_peripheral) &= ~TIM_CCER_CC4P; |
|||
break; |
|||
case TIM_OC1N: |
|||
case TIM_OC2N: |
|||
case TIM_OC3N: |
|||
/* Ignoring as this option applies to TIM1 and TIM8 only. */ |
|||
break; |
|||
} |
|||
|
|||
/* Acting for TIM1 and TIM8 only from here onwards. */ |
|||
if ((timer_peripheral != TIM1) && (timer_peripheral != TIM8)) |
|||
return; |
|||
|
|||
switch (oc_id) { |
|||
case TIM_OC1N: |
|||
TIM_CCER(timer_peripheral) &= ~TIM_CCER_CC1NP; |
|||
break; |
|||
case TIM_OC2N: |
|||
TIM_CCER(timer_peripheral) &= ~TIM_CCER_CC2NP; |
|||
break; |
|||
case TIM_OC3N: |
|||
TIM_CCER(timer_peripheral) &= ~TIM_CCER_CC3NP; |
|||
break; |
|||
case TIM_OC1: |
|||
case TIM_OC2: |
|||
case TIM_OC3: |
|||
case TIM_OC4: |
|||
/* Ignoring as this option was already set above. */ |
|||
break; |
|||
} |
|||
} |
|||
|
|||
void timer_set_oc_polarity_low(u32 timer_peripheral, enum tim_oc_id oc_id) |
|||
{ |
|||
switch (oc_id) { |
|||
case TIM_OC1: |
|||
TIM_CCER(timer_peripheral) |= TIM_CCER_CC1P; |
|||
break; |
|||
case TIM_OC2: |
|||
TIM_CCER(timer_peripheral) |= TIM_CCER_CC2P; |
|||
break; |
|||
case TIM_OC3: |
|||
TIM_CCER(timer_peripheral) |= TIM_CCER_CC3P; |
|||
break; |
|||
case TIM_OC4: |
|||
TIM_CCER(timer_peripheral) |= TIM_CCER_CC4P; |
|||
break; |
|||
case TIM_OC1N: |
|||
case TIM_OC2N: |
|||
case TIM_OC3N: |
|||
/* Ignoring as this option applies to TIM1 and TIM8 only. */ |
|||
break; |
|||
} |
|||
|
|||
/* Acting for TIM1 and TIM8 only from here onwards. */ |
|||
if ((timer_peripheral != TIM1) && (timer_peripheral != TIM8)) |
|||
return; |
|||
|
|||
switch (oc_id) { |
|||
case TIM_OC1N: |
|||
TIM_CCER(timer_peripheral) |= TIM_CCER_CC1NP; |
|||
break; |
|||
case TIM_OC2N: |
|||
TIM_CCER(timer_peripheral) |= TIM_CCER_CC2NP; |
|||
break; |
|||
case TIM_OC3N: |
|||
TIM_CCER(timer_peripheral) |= TIM_CCER_CC3NP; |
|||
break; |
|||
case TIM_OC1: |
|||
case TIM_OC2: |
|||
case TIM_OC3: |
|||
case TIM_OC4: |
|||
/* Ignoring as this option was already set above. */ |
|||
break; |
|||
} |
|||
} |
|||
|
|||
void timer_enable_oc_output(u32 timer_peripheral, enum tim_oc_id oc_id) |
|||
{ |
|||
switch (oc_id) { |
|||
case TIM_OC1: |
|||
TIM_CCER(timer_peripheral) |= TIM_CCER_CC1E; |
|||
break; |
|||
case TIM_OC2: |
|||
TIM_CCER(timer_peripheral) |= TIM_CCER_CC2E; |
|||
break; |
|||
case TIM_OC3: |
|||
TIM_CCER(timer_peripheral) |= TIM_CCER_CC3E; |
|||
break; |
|||
case TIM_OC4: |
|||
TIM_CCER(timer_peripheral) |= TIM_CCER_CC4E; |
|||
break; |
|||
case TIM_OC1N: |
|||
case TIM_OC2N: |
|||
case TIM_OC3N: |
|||
/* Ignoring as this option applies to TIM1 and TIM8 only. */ |
|||
break; |
|||
} |
|||
|
|||
/* Acting for TIM1 and TIM8 only from here onwards. */ |
|||
if ((timer_peripheral != TIM1) && (timer_peripheral != TIM8)) |
|||
return; |
|||
|
|||
switch (oc_id) { |
|||
case TIM_OC1N: |
|||
TIM_CCER(timer_peripheral) |= TIM_CCER_CC1NE; |
|||
break; |
|||
case TIM_OC2N: |
|||
TIM_CCER(timer_peripheral) |= TIM_CCER_CC2NE; |
|||
break; |
|||
case TIM_OC3N: |
|||
TIM_CCER(timer_peripheral) |= TIM_CCER_CC3NE; |
|||
break; |
|||
case TIM_OC1: |
|||
case TIM_OC2: |
|||
case TIM_OC3: |
|||
case TIM_OC4: |
|||
/* Ignoring as this option was already set above. */ |
|||
break; |
|||
} |
|||
} |
|||
|
|||
void timer_disable_oc_output(u32 timer_peripheral, enum tim_oc_id oc_id) |
|||
{ |
|||
switch (oc_id) { |
|||
case TIM_OC1: |
|||
TIM_CCER(timer_peripheral) &= ~TIM_CCER_CC1E; |
|||
break; |
|||
case TIM_OC2: |
|||
TIM_CCER(timer_peripheral) &= ~TIM_CCER_CC2E; |
|||
break; |
|||
case TIM_OC3: |
|||
TIM_CCER(timer_peripheral) &= ~TIM_CCER_CC3E; |
|||
break; |
|||
case TIM_OC4: |
|||
TIM_CCER(timer_peripheral) &= ~TIM_CCER_CC4E; |
|||
break; |
|||
case TIM_OC1N: |
|||
case TIM_OC2N: |
|||
case TIM_OC3N: |
|||
/* Ignoring as this option applies to TIM1 and TIM8 only. */ |
|||
break; |
|||
} |
|||
|
|||
/* Acting for TIM1 and TIM8 only from here onwards. */ |
|||
if ((timer_peripheral != TIM1) && (timer_peripheral != TIM8)) |
|||
return; |
|||
|
|||
switch (oc_id) { |
|||
case TIM_OC1N: |
|||
TIM_CCER(timer_peripheral) &= ~TIM_CCER_CC1NE; |
|||
break; |
|||
case TIM_OC2N: |
|||
TIM_CCER(timer_peripheral) &= ~TIM_CCER_CC2NE; |
|||
break; |
|||
case TIM_OC3N: |
|||
TIM_CCER(timer_peripheral) &= ~TIM_CCER_CC3NE; |
|||
break; |
|||
case TIM_OC1: |
|||
case TIM_OC2: |
|||
case TIM_OC3: |
|||
case TIM_OC4: |
|||
/* Ignoring as this option was already set above. */ |
|||
break; |
|||
} |
|||
} |
|||
|
|||
void timer_set_oc_idle_state_set(u32 timer_peripheral, enum tim_oc_id oc_id) |
|||
{ |
|||
/* Acting for TIM1 and TIM8 only. */ |
|||
if ((timer_peripheral != TIM1) && (timer_peripheral != TIM8)) |
|||
return; |
|||
|
|||
switch (oc_id) { |
|||
case TIM_OC1: |
|||
TIM_CR2(timer_peripheral) |= TIM_CR2_OIS1; |
|||
break; |
|||
case TIM_OC1N: |
|||
TIM_CR2(timer_peripheral) |= TIM_CR2_OIS1N; |
|||
break; |
|||
case TIM_OC2: |
|||
TIM_CR2(timer_peripheral) |= TIM_CR2_OIS2; |
|||
break; |
|||
case TIM_OC2N: |
|||
TIM_CR2(timer_peripheral) |= TIM_CR2_OIS2N; |
|||
break; |
|||
case TIM_OC3: |
|||
TIM_CR2(timer_peripheral) |= TIM_CR2_OIS3; |
|||
break; |
|||
case TIM_OC3N: |
|||
TIM_CR2(timer_peripheral) |= TIM_CR2_OIS3N; |
|||
break; |
|||
case TIM_OC4: |
|||
TIM_CR2(timer_peripheral) |= TIM_CR2_OIS4; |
|||
break; |
|||
} |
|||
} |
|||
|
|||
void timer_set_oc_idle_state_unset(u32 timer_peripheral, enum tim_oc_id oc_id) |
|||
{ |
|||
/* Acting for TIM1 and TIM8 only. */ |
|||
if ((timer_peripheral != TIM1) && (timer_peripheral != TIM8)) |
|||
return; |
|||
|
|||
switch (oc_id) { |
|||
case TIM_OC1: |
|||
TIM_CR2(timer_peripheral) &= ~TIM_CR2_OIS1; |
|||
break; |
|||
case TIM_OC1N: |
|||
TIM_CR2(timer_peripheral) &= ~TIM_CR2_OIS1N; |
|||
break; |
|||
case TIM_OC2: |
|||
TIM_CR2(timer_peripheral) &= ~TIM_CR2_OIS2; |
|||
break; |
|||
case TIM_OC2N: |
|||
TIM_CR2(timer_peripheral) &= ~TIM_CR2_OIS2N; |
|||
break; |
|||
case TIM_OC3: |
|||
TIM_CR2(timer_peripheral) &= ~TIM_CR2_OIS3; |
|||
break; |
|||
case TIM_OC3N: |
|||
TIM_CR2(timer_peripheral) &= ~TIM_CR2_OIS3N; |
|||
break; |
|||
case TIM_OC4: |
|||
TIM_CR2(timer_peripheral) &= ~TIM_CR2_OIS4; |
|||
break; |
|||
} |
|||
} |
|||
|
|||
void timer_set_oc_value(u32 timer_peripheral, enum tim_oc_id oc_id, u32 value) |
|||
{ |
|||
switch (oc_id) { |
|||
case TIM_OC1: |
|||
TIM_CCR1(timer_peripheral) = value; |
|||
break; |
|||
case TIM_OC2: |
|||
TIM_CCR2(timer_peripheral) = value; |
|||
break; |
|||
case TIM_OC3: |
|||
TIM_CCR3(timer_peripheral) = value; |
|||
break; |
|||
case TIM_OC4: |
|||
TIM_CCR4(timer_peripheral) = value; |
|||
break; |
|||
case TIM_OC1N: |
|||
case TIM_OC2N: |
|||
case TIM_OC3N: |
|||
/* Ignoring as this option applies to the whole channel. */ |
|||
break; |
|||
} |
|||
} |
|||
|
|||
void timer_enable_break_main_output(u32 timer_peripheral) |
|||
{ |
|||
if ((timer_peripheral == TIM1) || (timer_peripheral == TIM8)) |
|||
TIM_BDTR(timer_peripheral) |= TIM_BDTR_MOE; |
|||
} |
|||
|
|||
void timer_disable_break_main_output(u32 timer_peripheral) |
|||
{ |
|||
if ((timer_peripheral == TIM1) || (timer_peripheral == TIM8)) |
|||
TIM_BDTR(timer_peripheral) &= ~TIM_BDTR_MOE; |
|||
} |
|||
|
|||
void timer_enable_break_automatic_output(u32 timer_peripheral) |
|||
{ |
|||
if ((timer_peripheral == TIM1) || (timer_peripheral == TIM8)) |
|||
TIM_BDTR(timer_peripheral) |= TIM_BDTR_AOE; |
|||
} |
|||
|
|||
void timer_disable_break_automatic_output(u32 timer_peripheral) |
|||
{ |
|||
if ((timer_peripheral == TIM1) || (timer_peripheral == TIM8)) |
|||
TIM_BDTR(timer_peripheral) &= ~TIM_BDTR_AOE; |
|||
} |
|||
|
|||
void timer_set_break_polarity_high(u32 timer_peripheral) |
|||
{ |
|||
if ((timer_peripheral == TIM1) || (timer_peripheral == TIM8)) |
|||
TIM_BDTR(timer_peripheral) |= TIM_BDTR_BKP; |
|||
} |
|||
|
|||
void timer_set_break_polarity_low(u32 timer_peripheral) |
|||
{ |
|||
if ((timer_peripheral == TIM1) || (timer_peripheral == TIM8)) |
|||
TIM_BDTR(timer_peripheral) &= ~TIM_BDTR_BKP; |
|||
} |
|||
|
|||
void timer_enable_break(u32 timer_peripheral) |
|||
{ |
|||
if ((timer_peripheral == TIM1) || (timer_peripheral == TIM8)) |
|||
TIM_BDTR(timer_peripheral) |= TIM_BDTR_BKE; |
|||
} |
|||
|
|||
void timer_disable_break(u32 timer_peripheral) |
|||
{ |
|||
if ((timer_peripheral == TIM1) || (timer_peripheral == TIM8)) |
|||
TIM_BDTR(timer_peripheral) &= ~TIM_BDTR_BKE; |
|||
} |
|||
|
|||
void timer_set_enabled_off_state_in_run_mode(u32 timer_peripheral) |
|||
{ |
|||
if ((timer_peripheral == TIM1) || (timer_peripheral == TIM8)) |
|||
TIM_BDTR(timer_peripheral) |= TIM_BDTR_OSSR; |
|||
} |
|||
|
|||
void timer_set_disabled_off_state_in_run_mode(u32 timer_peripheral) |
|||
{ |
|||
if ((timer_peripheral == TIM1) || (timer_peripheral == TIM8)) |
|||
TIM_BDTR(timer_peripheral) &= ~TIM_BDTR_OSSR; |
|||
} |
|||
|
|||
void timer_set_enabled_off_state_in_idle_mode(u32 timer_peripheral) |
|||
{ |
|||
if ((timer_peripheral == TIM1) || (timer_peripheral == TIM8)) |
|||
TIM_BDTR(timer_peripheral) |= TIM_BDTR_OSSI; |
|||
} |
|||
|
|||
void timer_set_disabled_off_state_in_idle_mode(u32 timer_peripheral) |
|||
{ |
|||
if ((timer_peripheral == TIM1) || (timer_peripheral == TIM8)) |
|||
TIM_BDTR(timer_peripheral) &= ~TIM_BDTR_OSSI; |
|||
} |
|||
|
|||
void timer_set_break_lock(u32 timer_peripheral, u32 lock) |
|||
{ |
|||
if ((timer_peripheral == TIM1) || (timer_peripheral == TIM8)) |
|||
TIM_BDTR(timer_peripheral) |= lock; |
|||
} |
|||
|
|||
void timer_set_deadtime(u32 timer_peripheral, u32 deadtime) |
|||
{ |
|||
if ((timer_peripheral == TIM1) || (timer_peripheral == TIM8)) |
|||
TIM_BDTR(timer_peripheral) |= deadtime; |
|||
} |
|||
|
|||
void timer_generate_event(u32 timer_peripheral, u32 event) |
|||
{ |
|||
TIM_EGR(timer_peripheral) |= event; |
|||
} |
|||
|
|||
u32 timer_get_counter(u32 timer_peripheral) |
|||
{ |
|||
return TIM_CNT(timer_peripheral); |
|||
} |
|||
|
|||
void timer_set_option(u32 timer_peripheral, u32 option) |
|||
{ |
|||
if (timer_peripheral == TIM2) { |
|||
TIM_OR(timer_peripheral) &= ~TIM2_OR_ITR1_RMP_MASK; |
|||
TIM_OR(timer_peripheral) |= option; |
|||
} else if (timer_peripheral == TIM5) { |
|||
TIM_OR(timer_peripheral) &= ~TIM5_OR_TI4_RMP_MASK; |
|||
TIM_OR(timer_peripheral) |= option; |
|||
} |
|||
} |
Loading…
Reference in new issue