@@ -143,7 +143,11 @@ typedef struct _pyb_timer_obj_t {
143
143
144
144
TIM_HandleTypeDef TIM3_Handle ;
145
145
TIM_HandleTypeDef TIM5_Handle ;
146
+ #if !defined(STM32F401xE )
146
147
TIM_HandleTypeDef TIM6_Handle ;
148
+ #else
149
+ TIM_HandleTypeDef TIM9_Handle ;
150
+ #endif
147
151
148
152
// Used to divide down TIM3 and periodically call the flash storage IRQ
149
153
STATIC uint32_t tim3_counter = 0 ;
@@ -221,7 +225,7 @@ void timer_tim5_init(void) {
221
225
222
226
HAL_TIM_PWM_Init (& TIM5_Handle );
223
227
}
224
-
228
+ #if !defined( STM32F401xE )
225
229
// Init TIM6 with a counter-overflow at the given frequency (given in Hz)
226
230
// TIM6 is used by the DAC and ADC for auto sampling at a given frequency
227
231
// This function inits but does not start the timer
@@ -246,11 +250,40 @@ void timer_tim6_init(uint freq) {
246
250
TIM6_Handle .Init .CounterMode = TIM_COUNTERMODE_UP ; // unused for TIM6
247
251
HAL_TIM_Base_Init (& TIM6_Handle );
248
252
}
253
+ #else
254
+ // Init TIM9 with a counter-overflow at the given frequency (given in Hz)
255
+ // TIM9 is used by ADC for auto sampling at a given frequency
256
+ // This function inits but does not start the timer
257
+ void timer_tim9_init (uint freq ) {
258
+ // TIM9 clock enable
259
+ __TIM9_CLK_ENABLE ();
260
+
261
+ // Timer runs at SystemCoreClock / 2
262
+ // Compute the prescaler value so TIM9 triggers at freq-Hz
263
+ uint32_t period = MAX (1 , timer_get_source_freq (9 ) / freq );
264
+ uint32_t prescaler = 1 ;
265
+ while (period > 0xffff ) {
266
+ period >>= 1 ;
267
+ prescaler <<= 1 ;
268
+ }
269
+
270
+ // Time base clock configuration
271
+ TIM9_Handle .Instance = TIM9 ;
272
+ TIM9_Handle .Init .Period = period - 1 ;
273
+ TIM9_Handle .Init .Prescaler = prescaler - 1 ;
274
+ TIM9_Handle .Init .ClockDivision = TIM_CLOCKDIVISION_DIV1 ; // unused for TIM9
275
+ TIM9_Handle .Init .CounterMode = TIM_COUNTERMODE_UP ; // unused for TIM9
276
+ HAL_TIM_Base_Init (& TIM9_Handle );
277
+ }
278
+
279
+ #endif
249
280
250
281
// Interrupt dispatch
251
282
void HAL_TIM_PeriodElapsedCallback (TIM_HandleTypeDef * htim ) {
252
283
if (htim == & TIM3_Handle ) {
284
+ #if !defined(STM32F401xE )
253
285
USBD_CDC_HAL_TIM_PeriodElapsedCallback ();
286
+ #endif
254
287
255
288
// Periodically raise a flash IRQ for the flash storage controller
256
289
if (tim3_counter ++ >= 500 / USBD_CDC_POLLING_INTERVAL ) {
@@ -585,15 +618,19 @@ STATIC mp_obj_t pyb_timer_init_helper(pyb_timer_obj_t *self, mp_uint_t n_args, c
585
618
case 3 : __TIM3_CLK_ENABLE (); break ;
586
619
case 4 : __TIM4_CLK_ENABLE (); break ;
587
620
case 5 : __TIM5_CLK_ENABLE (); break ;
621
+ #if !defined(STM32F401xE )
588
622
case 6 : __TIM6_CLK_ENABLE (); break ;
589
623
case 7 : __TIM7_CLK_ENABLE (); break ;
590
624
case 8 : __TIM8_CLK_ENABLE (); break ;
625
+ #endif
591
626
case 9 : __TIM9_CLK_ENABLE (); break ;
592
627
case 10 : __TIM10_CLK_ENABLE (); break ;
593
628
case 11 : __TIM11_CLK_ENABLE (); break ;
629
+ #if !defined(STM32F401xE )
594
630
case 12 : __TIM12_CLK_ENABLE (); break ;
595
631
case 13 : __TIM13_CLK_ENABLE (); break ;
596
632
case 14 : __TIM14_CLK_ENABLE (); break ;
633
+ #endif
597
634
}
598
635
599
636
// set IRQ priority (if not a special timer)
@@ -641,15 +678,19 @@ STATIC mp_obj_t pyb_timer_make_new(mp_obj_t type_in, mp_uint_t n_args, mp_uint_t
641
678
case 3 : nlr_raise (mp_obj_new_exception_msg (& mp_type_ValueError , "Timer 3 is for internal use only" )); // TIM3 used for low-level stuff; go via regs if necessary
642
679
case 4 : tim -> tim .Instance = TIM4 ; tim -> irqn = TIM4_IRQn ; break ;
643
680
case 5 : tim -> tim .Instance = TIM5 ; tim -> irqn = TIM5_IRQn ; tim -> is_32bit = true; break ;
681
+ #if !defined(STM32F401xE )
644
682
case 6 : tim -> tim .Instance = TIM6 ; tim -> irqn = TIM6_DAC_IRQn ; break ;
645
683
case 7 : tim -> tim .Instance = TIM7 ; tim -> irqn = TIM7_IRQn ; break ;
646
684
case 8 : tim -> tim .Instance = TIM8 ; tim -> irqn = TIM8_UP_TIM13_IRQn ; break ;
685
+ #endif
647
686
case 9 : tim -> tim .Instance = TIM9 ; tim -> irqn = TIM1_BRK_TIM9_IRQn ; break ;
648
687
case 10 : tim -> tim .Instance = TIM10 ; tim -> irqn = TIM1_UP_TIM10_IRQn ; break ;
649
688
case 11 : tim -> tim .Instance = TIM11 ; tim -> irqn = TIM1_TRG_COM_TIM11_IRQn ; break ;
689
+ #if !defined(STM32F401xE )
650
690
case 12 : tim -> tim .Instance = TIM12 ; tim -> irqn = TIM8_BRK_TIM12_IRQn ; break ;
651
691
case 13 : tim -> tim .Instance = TIM13 ; tim -> irqn = TIM8_UP_TIM13_IRQn ; break ;
652
692
case 14 : tim -> tim .Instance = TIM14 ; tim -> irqn = TIM8_TRG_COM_TIM14_IRQn ; break ;
693
+ #endif
653
694
default : nlr_raise (mp_obj_new_exception_msg_varg (& mp_type_ValueError , "Timer %d does not exist" , tim -> tim_id ));
654
695
}
655
696
0 commit comments