diff options
Diffstat (limited to 'libmaple/stm32f1/timer.c')
| -rw-r--r-- | libmaple/stm32f1/timer.c | 83 | 
1 files changed, 80 insertions, 3 deletions
| diff --git a/libmaple/stm32f1/timer.c b/libmaple/stm32f1/timer.c index 7506cb6..899abbc 100644 --- a/libmaple/stm32f1/timer.c +++ b/libmaple/stm32f1/timer.c @@ -30,14 +30,30 @@   * @brief  STM32F1 timer support.   */ +/* Notes: + * + * - We use STM32F1 density test macros throughout to avoid defining + *   symbols or linking in code that would use timers that are + *   unavailable in a given density. For example, TIM5 doesn't exist + *   on medium-density, and TIM9 doesn't exist on high-density, so we + *   don't define or use TIM5 when being compiled for medium-density, + *   and similarly for TIM9 and high-density. + * + *   This makes a mess, but helps avoid bloat and ensures backwards + *   compatibility. Since the mess is manageable and there don't seem + *   to be any plans on ST's part to add new STM32F1 lines or + *   densities, we'll live with it. + */ +  #include <libmaple/timer.h>  #include "timer_private.h"  /*   * Devices + * + * Defer to the timer_private API.   */ -/* Use timer_private macros to save typing. */  static DECLARE_ADVANCED_TIMER(timer1, 1);  static DECLARE_GENERAL_TIMER(timer2, 2);  static DECLARE_GENERAL_TIMER(timer3, 3); @@ -66,7 +82,35 @@ timer_dev *TIMER6 = &timer6;  timer_dev *TIMER7 = &timer7;  /** Timer 8 device (advanced) */  timer_dev *TIMER8 = &timer8; -#endif +#endif  /* defined(STM32_HIGH_DENSITY) || defined(STM32_XL_DENSITY) */ + +#ifdef STM32_XL_DENSITY +/* TIM9 has UIE, CC1IE, CC2IE, TIE bits in DIER. */ +static DECLARE_RESTRICTED_GENERAL_TIMER(timer9, 9, TIMER_DIER_TIE_BIT); +/* TIM10 has UIE, CC1IE. */ +static DECLARE_RESTRICTED_GENERAL_TIMER(timer10, 10, TIMER_DIER_CC1IE_BIT); +/* TIM11 has UIE, CC1IE. */ +static DECLARE_RESTRICTED_GENERAL_TIMER(timer11, 11, TIMER_DIER_CC1IE_BIT); +/* TIM12 has UIE, CC1IE, CC2IE, TIE. */ +static DECLARE_RESTRICTED_GENERAL_TIMER(timer12, 12, TIMER_DIER_TIE_BIT); +/* TIM13 has UIE, CC1IE. */ +static DECLARE_RESTRICTED_GENERAL_TIMER(timer13, 13, TIMER_DIER_CC1IE_BIT); +/* TIM14 has UIE, CC1IE. */ +static DECLARE_RESTRICTED_GENERAL_TIMER(timer14, 14, TIMER_DIER_CC1IE_BIT); + +/** Timer 9 device (general-purpose) */ +timer_dev *TIMER9 = &timer9; +/** Timer 10 device (general-purpose) */ +timer_dev *TIMER10 = &timer10; +/** Timer 11 device (general-purpose) */ +timer_dev *TIMER11 = &timer11; +/** Timer 12 device (general-purpose) */ +timer_dev *TIMER12 = &timer12; +/** Timer 13 device (general-purpose) */ +timer_dev *TIMER13 = &timer13; +/** Timer 14 device (general-purpose) */ +timer_dev *TIMER14 = &timer14; +#endif  /* STM32_XL_DENSITY */  /*   * Routines @@ -87,22 +131,46 @@ void timer_foreach(void (*fn)(timer_dev*)) {      fn(TIMER7);      fn(TIMER8);  #endif +#ifdef STM32_XL_DENSITY +    fn(TIMER9); +    fn(TIMER10); +    fn(TIMER11); +    fn(TIMER12); +    fn(TIMER13); +    fn(TIMER14); +#endif  }  /*   * IRQ handlers + * + * Defer to the timer_private dispatch API. + * + * FIXME: The names of these handlers are inaccurate since XL-density + * devices came out. Update these to match the STM32F2 names, maybe + * using some weak symbol magic to preserve backwards compatibility if + * possible.   */  void __irq_tim1_brk(void) {      dispatch_adv_brk(TIMER1); +#ifdef STM32_XL_DENSITY +    dispatch_tim_9_12(TIMER9); +#endif  }  void __irq_tim1_up(void) {      dispatch_adv_up(TIMER1); +#ifdef STM32_XL_DENSITY +    dispatch_tim_10_11_13_14(TIMER10); +#endif  }  void __irq_tim1_trg_com(void) {      dispatch_adv_trg_com(TIMER1); +#ifdef STM32_XL_DENSITY +    dispatch_tim_10_11_13_14(TIMER11); +#endif  }  void __irq_tim1_cc(void) { @@ -136,17 +204,26 @@ void __irq_tim7(void) {  void __irq_tim8_brk(void) {      dispatch_adv_brk(TIMER8); +#ifdef STM32_XL_DENSITY +    dispatch_tim_9_12(TIMER12); +#endif  }  void __irq_tim8_up(void) {      dispatch_adv_up(TIMER8); +#ifdef STM32_XL_DENSITY +    dispatch_tim_10_11_13_14(TIMER13); +#endif  }  void __irq_tim8_trg_com(void) {      dispatch_adv_trg_com(TIMER8); +#ifdef STM32_XL_DENSITY +    dispatch_tim_10_11_13_14(TIMER14); +#endif  }  void __irq_tim8_cc(void) {      dispatch_adv_cc(TIMER8);  } -#endif +#endif  /* defined(STM32_HIGH_DENSITY) || defined(STM32_XL_DENSITY) */ | 
