50 static void timer1_input_capture(
void);
51 static void (*tim1_up_handler)(void);
52 static void (*tim1_cc_handler)(void);
55 static volatile uint8_t t1_status;
56 static volatile uint16_t t1c1_rise;
57 static volatile uint16_t t1c2_rise;
58 static volatile uint16_t t1c3_rise;
59 static volatile uint16_t t1c4_rise;
60 static volatile uint16_t t1c1_cap;
61 static volatile uint16_t t1c2_cap;
62 static volatile uint16_t t1c3_cap;
63 static volatile uint16_t t1c4_cap;
73 static void timer2_input_capture(
void);
74 static void (*tim2_up_handler)(void);
77 static volatile uint8_t t2_stat_reg;
78 static volatile uint8_t t2_status;
79 static volatile uint16_t t2c1_rise;
80 static volatile uint16_t t2c2_rise;
81 static volatile uint16_t t2c3_rise;
82 static volatile uint16_t t2c4_rise;
83 static volatile uint16_t t2c1_cap;
84 static volatile uint16_t t2c2_cap;
85 static volatile uint16_t t2c3_cap;
86 static volatile uint16_t t2c4_cap;
96 static void timer3_input_capture(
void);
97 static void (*tim3_up_handler)(void);
100 static volatile uint8_t t3_status;
101 static volatile uint16_t t3c1_rise;
102 static volatile uint16_t t3c2_rise;
103 static volatile uint16_t t3c3_rise;
104 static volatile uint16_t t3c4_rise;
105 static volatile uint16_t t3c1_cap;
106 static volatile uint16_t t3c2_cap;
107 static volatile uint16_t t3c3_cap;
108 static volatile uint16_t t3c4_cap;
118 static void timer4_input_capture(
void);
119 static void (*tim4_up_handler)(void);
122 static volatile uint8_t t4_status;
123 static volatile uint16_t t4c1_rise;
124 static volatile uint16_t t4c2_rise;
125 static volatile uint16_t t4c3_rise;
126 static volatile uint16_t t4c4_rise;
127 static volatile uint16_t t4c1_cap;
128 static volatile uint16_t t4c2_cap;
129 static volatile uint16_t t4c3_cap;
130 static volatile uint16_t t4c4_cap;
136 static void timer1_input_capture(
void){
138 if((TIM_SR(TIM1) & TIM_SR_UIF)){
143 if(!(t1_status & T1C1_STAT)){
147 if(!(t1_status & T1C2_STAT)){
151 if(!(t1_status & T1C3_STAT)){
155 if(!(t1_status & T1C4_STAT)){
163 if((TIM_SR(TIM1) & TIM_SR_CC1IF)){
166 if(TIM_CCER(TIM1) & TIM_CCER_CC1P){
168 t1c1_cap = TIM_CCR1(TIM1) - t1c1_rise;
171 TIM_CCER(TIM1) &= ~TIM_CCER_CC1P;
174 t1_status |= T1C1_STAT;
180 t1c1_rise = TIM_CCR1(TIM1);
183 TIM_CCER(TIM1) |= TIM_CCER_CC1P;
186 t1_status |= T1C1_STAT;
190 if((TIM_SR(TIM1) & TIM_SR_CC2IF)){
193 if(TIM_CCER(TIM1) & TIM_CCER_CC2P){
196 t1c2_cap = TIM_CCR2(TIM1) - t1c2_rise;
199 TIM_CCER(TIM1) &= ~TIM_CCER_CC2P;
202 t1_status |= T1C2_STAT;
207 t1c2_rise = TIM_CCR2(TIM1);
210 TIM_CCER(TIM1) |= TIM_CCER_CC2P;
213 t1_status |= T1C2_STAT;
217 if((TIM_SR(TIM1) &TIM_SR_CC3IF)){
220 if(TIM_CCER(TIM1) & TIM_CCER_CC3P){
224 t1c3_cap = TIM_CCR3(TIM1) - t1c3_rise;
227 TIM_CCER(TIM1) &= ~TIM_CCER_CC3P;
230 t1_status |= T1C3_STAT;
235 t1c3_rise = TIM_CCR3(TIM1);
238 TIM_CCER(TIM1) |= TIM_CCER_CC3P;
241 t1_status |= T1C3_STAT;
245 if((TIM_SR(TIM1) & TIM_SR_CC4IF)){
248 if(TIM_CCER(TIM1) & TIM_CCER_CC4P){
251 t1c4_cap = TIM_CCR4(TIM1) - t1c4_rise;
254 TIM_CCER(TIM1) &= ~TIM_CCER_CC4P;
257 t1_status |= T1C4_STAT;
262 t1c4_rise = TIM_CCR4(TIM1);
265 TIM_CCER(TIM1) |= TIM_CCER_CC4P;
268 t1_status |= T1C4_STAT;
275 static void timer2_input_capture(
void){
282 if(!(t2_status & T2C1_STAT)){
286 if(!(t2_status & T2C2_STAT)){
290 if(!(t2_status & T2C3_STAT)){
294 if(!(t2_status & T2C4_STAT)){
302 if((TIM_SR(TIM2) & TIM_SR_CC1IF)){
305 if(TIM_CCER(TIM2) & TIM_CCER_CC1P){
307 t2c1_cap = TIM_CCR1(TIM2) - t2c1_rise;
310 TIM_CCER(TIM2) &= ~TIM_CCER_CC1P;
313 t2_status |= T2C1_STAT;
319 t2c1_rise = TIM_CCR1(TIM2);
322 TIM_CCER(TIM2) |= TIM_CCER_CC1P;
325 t2_status |= T2C1_STAT;
329 if((TIM_SR(TIM2) & TIM_SR_CC2IF)){
332 if(TIM_CCER(TIM2) & TIM_CCER_CC2P){
336 t2c2_cap = TIM_CCR2(TIM2) - t2c2_rise;
339 TIM_CCER(TIM2) &= ~TIM_CCER_CC2P;
342 t2_status |= T2C2_STAT;
347 t2c2_rise = TIM_CCR2(TIM2);
350 TIM_CCER(TIM2) |= TIM_CCER_CC2P;
353 t2_status |= T2C2_STAT;
357 if((TIM_SR(TIM2) &TIM_SR_CC3IF)){
360 if(TIM_CCER(TIM2) & TIM_CCER_CC3P){
364 t2c3_cap = TIM_CCR3(TIM2) - t2c3_rise;
367 TIM_CCER(TIM2) &= ~TIM_CCER_CC3P;
370 t2_status |= T2C3_STAT;
375 t2c3_rise = TIM_CCR3(TIM2);
378 TIM_CCER(TIM2) |= TIM_CCER_CC3P;
381 t2_status |= T2C3_STAT;
385 if((TIM_SR(TIM2) & TIM_SR_CC4IF)){
388 if(TIM_CCER(TIM2) & TIM_CCER_CC4P){
391 t2c4_cap = TIM_CCR4(TIM2) - t2c4_rise;
394 TIM_CCER(TIM2) &= ~TIM_CCER_CC4P;
397 t2_status |= T2C4_STAT;
402 t2c4_rise = TIM_CCR4(TIM2);
405 TIM_CCER(TIM2) |= TIM_CCER_CC4P;
408 t2_status |= T2C4_STAT;
416 static void timer3_input_capture(
void){
418 if((TIM_SR(TIM3) & TIM_SR_UIF)){
423 if(!(t3_status & T3C1_STAT)){
427 if(!(t3_status & T3C2_STAT)){
431 if(!(t3_status & T3C3_STAT)){
435 if(!(t3_status & T3C4_STAT)){
443 if((TIM_SR(TIM3) & TIM_SR_CC1IF)){
446 if(TIM_CCER(TIM3) & TIM_CCER_CC1P){
448 t3c1_cap = TIM_CCR1(TIM3) - t3c1_rise;
451 TIM_CCER(TIM3) &= ~TIM_CCER_CC1P;
454 t3_status |= T3C1_STAT;
460 t3c1_rise = TIM_CCR1(TIM3);
463 TIM_CCER(TIM3) |= TIM_CCER_CC1P;
466 t3_status |= T3C1_STAT;
470 if((TIM_SR(TIM3) & TIM_SR_CC2IF)){
473 if(TIM_CCER(TIM3) & TIM_CCER_CC2P){
477 t3c2_cap = TIM_CCR2(TIM3) - t3c2_rise;
480 TIM_CCER(TIM3) &= ~TIM_CCER_CC2P;
483 t3_status |= T3C2_STAT;
488 t3c2_rise = TIM_CCR2(TIM3);
491 TIM_CCER(TIM3) |= TIM_CCER_CC2P;
494 t3_status |= T3C2_STAT;
498 if((TIM_SR(TIM3) &TIM_SR_CC3IF)){
501 if(TIM_CCER(TIM3) & TIM_CCER_CC3P){
505 t3c3_cap = TIM_CCR3(TIM3) - t3c3_rise;
508 TIM_CCER(TIM3) &= ~TIM_CCER_CC3P;
511 t3_status |= T2C3_STAT;
516 t3c3_rise = TIM_CCR3(TIM3);
519 TIM_CCER(TIM3) |= TIM_CCER_CC3P;
522 t3_status |= T3C3_STAT;
526 if((TIM_SR(TIM3) & TIM_SR_CC4IF)){
529 if(TIM_CCER(TIM3) & TIM_CCER_CC4P){
532 t3c4_cap = TIM_CCR4(TIM3) - t3c4_rise;
535 TIM_CCER(TIM3) &= ~TIM_CCER_CC4P;
538 t3_status |= T3C4_STAT;
543 t3c4_rise = TIM_CCR4(TIM3);
546 TIM_CCER(TIM3) |= TIM_CCER_CC4P;
549 t3_status |= T3C4_STAT;
556 static void timer4_input_capture(
void){
558 if((TIM_SR(TIM4) & TIM_SR_UIF)){
563 if(!(t4_status & T4C1_STAT)){
567 if(!(t4_status & T4C2_STAT)){
571 if(!(t4_status & T4C3_STAT)){
575 if(!(t4_status & T4C4_STAT)){
583 if((TIM_SR(TIM4) & TIM_SR_CC1IF)){
586 if(TIM_CCER(TIM4) & TIM_CCER_CC1P){
588 t4c1_cap = TIM_CCR1(TIM4) - t4c1_rise;
591 TIM_CCER(TIM4) &= ~TIM_CCER_CC1P;
594 t4_status |= T4C1_STAT;
600 t4c1_rise = TIM_CCR1(TIM4);
603 TIM_CCER(TIM4) |= TIM_CCER_CC1P;
606 t4_status |= T4C1_STAT;
610 if((TIM_SR(TIM4) & TIM_SR_CC2IF)){
613 if(TIM_CCER(TIM4) & TIM_CCER_CC2P){
617 t4c2_cap = TIM_CCR2(TIM4) - t4c2_rise;
620 TIM_CCER(TIM4) &= ~TIM_CCER_CC2P;
623 t4_status |= T4C2_STAT;
628 t4c2_rise = TIM_CCR2(TIM4);
631 TIM_CCER(TIM4) |= TIM_CCER_CC2P;
634 t4_status |= T4C2_STAT;
638 if((TIM_SR(TIM4) &TIM_SR_CC3IF)){
641 if(TIM_CCER(TIM4) & TIM_CCER_CC3P){
645 t4c3_cap = TIM_CCR3(TIM4) - t4c3_rise;
648 TIM_CCER(TIM4) &= ~TIM_CCER_CC3P;
651 t4_status |= T2C3_STAT;
656 t4c3_rise = TIM_CCR3(TIM4);
659 TIM_CCER(TIM4) |= TIM_CCER_CC3P;
662 t4_status |= T4C3_STAT;
666 if((TIM_SR(TIM4) & TIM_SR_CC4IF)){
669 if(TIM_CCER(TIM4) & TIM_CCER_CC4P){
672 t4c4_cap = TIM_CCR4(TIM4) - t4c4_rise;
675 TIM_CCER(TIM4) &= ~TIM_CCER_CC4P;
678 t4_status |= T4C4_STAT;
683 t4c4_rise = TIM_CCR4(TIM4);
686 TIM_CCER(TIM4) |= TIM_CCER_CC4P;
689 t4_status |= T4C4_STAT;
704 nvic_disable_irq(NVIC_TIM1_UP_IRQ);
705 timer_disable_irq(TIM1,TIM_DIER_UIE);
706 tim1_up_handler = handler;
707 timer_enable_irq(TIM1,TIM_DIER_UIE);
708 nvic_enable_irq(NVIC_TIM1_UP_IRQ);
713 nvic_disable_irq(NVIC_TIM2_IRQ);
714 timer_disable_irq(TIM2,TIM_DIER_UIE);
715 tim2_up_handler = handler;
716 timer_enable_irq(TIM2,TIM_DIER_UIE);
717 nvic_enable_irq(NVIC_TIM2_IRQ);
722 nvic_disable_irq(NVIC_TIM3_IRQ);
723 timer_disable_irq(TIM3,TIM_DIER_UIE);
724 tim3_up_handler = handler;
725 timer_enable_irq(TIM3,TIM_DIER_UIE);
726 nvic_enable_irq(NVIC_TIM3_IRQ);
731 nvic_disable_irq(NVIC_TIM4_IRQ);
732 timer_disable_irq(TIM4,TIM_DIER_UIE);
733 tim4_up_handler = handler;
734 timer_enable_irq(TIM4,TIM_DIER_UIE);
735 nvic_enable_irq(NVIC_TIM4_IRQ);
759 nvic_disable_irq(NVIC_TIM1_UP_IRQ);
760 timer_disable_irq(TIM1,TIM_DIER_UIE);
765 nvic_disable_irq(NVIC_TIM2_IRQ);
766 timer_disable_irq(TIM2,TIM_DIER_UIE);
770 nvic_disable_irq(NVIC_TIM3_IRQ);
771 timer_disable_irq(TIM3,TIM_DIER_UIE);
775 nvic_disable_irq(NVIC_TIM4_IRQ);
776 timer_disable_irq(TIM4,TIM_DIER_UIE);
791 void tim1_cc_isr(
void){
794 timer_clear_flag(TIM1,TIM_SR_UIF);
797 void tim1_up_isr(
void){
800 timer_clear_flag(TIM1,TIM_SR_UIF);
805 t2_stat_reg = TIM_SR(TIM2) & TIM_SR_UIF;
806 timer_clear_flag(TIM2,TIM_SR_UIF);
812 timer_clear_flag(TIM3,TIM_SR_UIF);
818 timer_clear_flag(TIM4,TIM_SR_UIF);
833 timer_disable_counter(TIM1);
837 timer_disable_counter(TIM2);
841 timer_disable_counter(TIM3);
845 timer_disable_counter(TIM4);
867 timer_enable_counter(TIM1);
871 timer_enable_counter(TIM2);
875 timer_enable_counter(TIM3);
879 timer_enable_counter(TIM4);
905 error = timer1_setupIC(timerChannel);
909 error = timer2_setupIC(timerChannel);
914 error = timer3_setupIC(timerChannel);
919 error = timer4_setupIC(timerChannel);
942 error = timer1_setupPWM(timerChannel,frequency,duty);
946 error = timer2_setupPWM(timerChannel,frequency,duty);
950 error = timer3_setupPWM(timerChannel,frequency,duty);
954 error = timer4_setupPWM(timerChannel,frequency,duty);
975 error = timer1_setupPulse(timerChannel,frequency,pulse);
979 error = timer2_setupPulse(timerChannel,frequency,pulse);
983 error = timer3_setupPulse(timerChannel,frequency,pulse);
987 error = timer4_setupPulse(timerChannel,frequency,pulse);
1005 switch(timerNumber){
1010 rcc_periph_clock_enable(RCC_TIM1);
1013 timer_disable_counter(TIM1);
1015 timer_set_mode(TIM1, TIM_CR1_CKD_CK_INT, TIM_CR1_CMS_EDGE,TIM_CR1_DIR_UP);
1020 timer_enable_counter(TIM1);
1026 rcc_periph_clock_enable(RCC_TIM2);
1029 timer_disable_counter(TIM2);
1031 timer_set_mode(TIM2, TIM_CR1_CKD_CK_INT, TIM_CR1_CMS_EDGE,TIM_CR1_DIR_UP);
1036 timer_enable_counter(TIM2);
1042 rcc_periph_clock_enable(RCC_TIM3);
1045 timer_disable_counter(TIM3);
1047 timer_set_mode(TIM3, TIM_CR1_CKD_CK_INT, TIM_CR1_CMS_EDGE,TIM_CR1_DIR_UP);
1052 timer_enable_counter(TIM3);
1058 rcc_periph_clock_enable(RCC_TIM4);
1061 timer_disable_counter(TIM4);
1063 timer_set_mode(TIM4, TIM_CR1_CKD_CK_INT, TIM_CR1_CMS_EDGE,TIM_CR1_DIR_UP);
1068 timer_enable_counter(TIM4);
1090 rcc_periph_clock_enable(RCC_TIM1);
1093 timer_disable_counter(TIM1);
1094 timer_set_mode(TIM1, TIM_CR1_CKD_CK_INT, TIM_CR1_CMS_EDGE,TIM_CR1_DIR_UP);
1097 switch(timerChannel){
1103 TIM_CCMR1(TIM1) |= TIM_CCMR1_CC1S_IN_TI1;
1104 TIM_CCER(TIM1) |= TIM_CCER_CC1E;
1107 TIM_CCER(TIM1) &= ~TIM_CCER_CC1P;
1110 nvic_disable_irq(NVIC_TIM1_CC_IRQ);
1111 timer_enable_irq(TIM1,TIM_DIER_CC1IE);
1112 tim1_cc_handler = timer1_input_capture;
1113 nvic_enable_irq(NVIC_TIM1_CC_IRQ);
1115 timer_enable_counter(TIM1);
1122 TIM_CCMR1(TIM1) |= TIM_CCMR1_CC2S_IN_TI2;
1123 TIM_CCER(TIM1) |= TIM_CCER_CC2E;
1126 TIM_CCER(TIM1) &= ~TIM_CCER_CC2P;
1129 nvic_disable_irq(NVIC_TIM1_CC_IRQ);
1130 timer_enable_irq(TIM1,TIM_DIER_CC2IE);
1131 tim1_cc_handler = timer1_input_capture;
1132 nvic_enable_irq(NVIC_TIM1_CC_IRQ);
1134 timer_enable_counter(TIM1);
1141 TIM_CCMR2(TIM1) |= TIM_CCMR2_CC3S_IN_TI3;
1142 TIM_CCER(TIM1) |= TIM_CCER_CC3E;
1145 TIM_CCER(TIM1) &= ~TIM_CCER_CC3P;
1148 nvic_disable_irq(NVIC_TIM1_CC_IRQ);
1149 timer_enable_irq(TIM1,TIM_DIER_CC3IE);
1150 tim1_cc_handler = timer1_input_capture;
1151 nvic_enable_irq(NVIC_TIM1_CC_IRQ);
1153 timer_enable_counter(TIM1);
1160 TIM_CCMR2(TIM1) |= TIM_CCMR2_CC4S_IN_TI4;
1161 TIM_CCER(TIM1) |= TIM_CCER_CC4E;
1164 TIM_CCER(TIM1) &= ~TIM_CCER_CC4P;
1167 nvic_disable_irq(NVIC_TIM1_CC_IRQ);
1168 timer_enable_irq(TIM1,TIM_DIER_CC4IE);
1169 tim1_cc_handler = timer1_input_capture;
1170 nvic_enable_irq(NVIC_TIM1_CC_IRQ);
1172 timer_enable_counter(TIM1);
1191 rcc_periph_clock_enable(RCC_TIM2);
1194 timer_disable_counter(TIM2);
1195 timer_set_mode(TIM2, TIM_CR1_CKD_CK_INT, TIM_CR1_CMS_EDGE,TIM_CR1_DIR_UP);
1198 switch(timerChannel){
1204 TIM_CCMR1(TIM2) |= TIM_CCMR1_CC1S_IN_TI1;
1205 TIM_CCER(TIM2) |= TIM_CCER_CC1E;
1208 TIM_CCER(TIM2) &= ~TIM_CCER_CC1P;
1210 timer_enable_irq(TIM2,TIM_DIER_CC1IE);
1212 timer_enable_counter(TIM2);
1219 TIM_CCMR1(TIM2) |= TIM_CCMR1_CC2S_IN_TI2;
1220 TIM_CCER(TIM2) |= TIM_CCER_CC2E;
1223 TIM_CCER(TIM2) &= ~TIM_CCER_CC2P;
1225 timer_enable_irq(TIM2,TIM_DIER_CC2IE);
1227 timer_enable_counter(TIM2);
1234 TIM_CCMR2(TIM2) |= TIM_CCMR2_CC3S_IN_TI3;
1235 TIM_CCER(TIM2) |= TIM_CCER_CC3E;
1238 TIM_CCER(TIM2) &= ~TIM_CCER_CC3P;
1240 timer_enable_irq(TIM2,TIM_DIER_CC3IE);
1242 timer_enable_counter(TIM2);
1249 TIM_CCMR2(TIM2) |= TIM_CCMR2_CC4S_IN_TI4;
1250 TIM_CCER(TIM2) |= TIM_CCER_CC4E;
1253 TIM_CCER(TIM2) &= ~TIM_CCER_CC4P;
1255 timer_enable_irq(TIM2,TIM_DIER_CC4IE);
1257 timer_enable_counter(TIM2);
1276 rcc_periph_clock_enable(RCC_TIM3);
1279 timer_disable_counter(TIM3);
1280 timer_set_mode(TIM3, TIM_CR1_CKD_CK_INT, TIM_CR1_CMS_EDGE,TIM_CR1_DIR_UP);
1283 switch(timerChannel){
1289 TIM_CCMR1(TIM3) |= TIM_CCMR1_CC1S_IN_TI1;
1290 TIM_CCER(TIM3) |= TIM_CCER_CC1E;
1293 TIM_CCER(TIM3) &= ~TIM_CCER_CC1P;
1295 timer_enable_irq(TIM3,TIM_DIER_CC1IE);
1297 timer_enable_counter(TIM3);
1304 TIM_CCMR1(TIM3) |= TIM_CCMR1_CC2S_IN_TI2;
1305 TIM_CCER(TIM3) |= TIM_CCER_CC2E;
1308 TIM_CCER(TIM3) &= ~TIM_CCER_CC2P;
1310 timer_enable_irq(TIM3,TIM_DIER_CC2IE);
1312 timer_enable_counter(TIM3);
1319 TIM_CCMR2(TIM3) |= TIM_CCMR2_CC3S_IN_TI3;
1320 TIM_CCER(TIM3) |= TIM_CCER_CC3E;
1323 TIM_CCER(TIM3) &= ~TIM_CCER_CC3P;
1325 timer_enable_irq(TIM3,TIM_DIER_CC3IE);
1327 timer_enable_counter(TIM3);
1334 TIM_CCMR2(TIM3) |= TIM_CCMR2_CC4S_IN_TI4;
1335 TIM_CCER(TIM3) |= TIM_CCER_CC4E;
1338 TIM_CCER(TIM3) &= ~TIM_CCER_CC4P;
1340 timer_enable_irq(TIM3,TIM_DIER_CC4IE);
1342 timer_enable_counter(TIM3);
1361 rcc_periph_clock_enable(RCC_TIM4);
1364 timer_disable_counter(TIM4);
1365 timer_set_mode(TIM4, TIM_CR1_CKD_CK_INT, TIM_CR1_CMS_EDGE,TIM_CR1_DIR_UP);
1368 switch(timerChannel){
1374 TIM_CCMR1(TIM4) |= TIM_CCMR1_CC1S_IN_TI1;
1375 TIM_CCER(TIM4) |= TIM_CCER_CC1E;
1378 TIM_CCER(TIM4) &= ~TIM_CCER_CC1P;
1380 timer_enable_irq(TIM4,TIM_DIER_CC1IE);
1382 timer_enable_counter(TIM4);
1389 TIM_CCMR1(TIM4) |= TIM_CCMR1_CC2S_IN_TI2;
1390 TIM_CCER(TIM4) |= TIM_CCER_CC2E;
1393 TIM_CCER(TIM4) &= ~TIM_CCER_CC2P;
1395 timer_enable_irq(TIM4,TIM_DIER_CC2IE);
1397 timer_enable_counter(TIM4);
1404 TIM_CCMR2(TIM4) |= TIM_CCMR2_CC3S_IN_TI3;
1405 TIM_CCER(TIM4) |= TIM_CCER_CC3E;
1408 TIM_CCER(TIM4) &= ~TIM_CCER_CC3P;
1410 timer_enable_irq(TIM4,TIM_DIER_CC3IE);
1412 timer_enable_counter(TIM4);
1419 TIM_CCMR2(TIM4) |= TIM_CCMR2_CC4S_IN_TI4;
1420 TIM_CCER(TIM4) |= TIM_CCER_CC4E;
1423 TIM_CCER(TIM4) &= ~TIM_CCER_CC4P;
1425 timer_enable_irq(TIM4,TIM_DIER_CC4IE);
1427 timer_enable_counter(TIM4);
1444 switch(timerNumber){
1568 rcc_periph_clock_enable(RCC_TIM1);
1571 timer_disable_counter(TIM1);
1572 timer_set_mode(TIM1, TIM_CR1_CKD_CK_INT, TIM_CR1_CMS_EDGE,TIM_CR1_DIR_DOWN);
1573 timer_enable_break_main_output(TIM1);
1575 switch(timerChannel){
1581 timer_set_oc_mode(TIM1, TIM_OC1, TIM_OCM_PWM1);
1582 timer_enable_oc_output(TIM1, TIM_OC1);
1585 timer_enable_counter(TIM1);
1592 timer_set_oc_mode(TIM1, TIM_OC2, TIM_OCM_PWM1);
1593 timer_enable_oc_output(TIM1, TIM_OC2);
1596 timer_enable_counter(TIM1);
1602 timer_set_oc_mode(TIM1, TIM_OC3, TIM_OCM_PWM1);
1603 timer_enable_oc_output(TIM1, TIM_OC3);
1606 timer_enable_counter(TIM1);
1612 timer_set_oc_mode(TIM1, TIM_OC4, TIM_OCM_PWM1);
1613 timer_enable_oc_output(TIM1, TIM_OC4);
1616 timer_enable_counter(TIM1);
1637 rcc_periph_clock_enable(RCC_TIM2);
1640 timer_disable_counter(TIM2);
1641 timer_set_mode(TIM2, TIM_CR1_CKD_CK_INT, TIM_CR1_CMS_EDGE,TIM_CR1_DIR_DOWN);
1643 switch(timerChannel){
1649 timer_set_oc_mode(TIM2, TIM_OC1, TIM_OCM_PWM1);
1650 timer_enable_oc_output(TIM2, TIM_OC1);
1653 timer_enable_counter(TIM2);
1660 timer_set_oc_mode(TIM2, TIM_OC2, TIM_OCM_PWM1);
1661 timer_enable_oc_output(TIM2, TIM_OC2);
1664 timer_enable_counter(TIM2);
1671 timer_set_oc_mode(TIM2, TIM_OC3, TIM_OCM_PWM1);
1672 timer_enable_oc_output(TIM2, TIM_OC3);
1675 timer_enable_counter(TIM2);
1681 timer_set_oc_mode(TIM2, TIM_OC4, TIM_OCM_PWM1);
1682 timer_enable_oc_output(TIM2, TIM_OC4);
1685 timer_enable_counter(TIM2);
1704 rcc_periph_clock_enable(RCC_TIM3);
1707 timer_disable_counter(TIM3);
1708 timer_set_mode(TIM3, TIM_CR1_CKD_CK_INT, TIM_CR1_CMS_EDGE,TIM_CR1_DIR_DOWN);
1710 switch(timerChannel){
1716 timer_set_oc_mode(TIM3, TIM_OC1, TIM_OCM_PWM1);
1717 timer_enable_oc_output(TIM3, TIM_OC1);
1720 timer_enable_counter(TIM3);
1727 timer_set_oc_mode(TIM3, TIM_OC2, TIM_OCM_PWM1);
1728 timer_enable_oc_output(TIM3, TIM_OC2);
1731 timer_enable_counter(TIM3);
1738 timer_set_oc_mode(TIM3, TIM_OC3, TIM_OCM_PWM1);
1739 timer_enable_oc_output(TIM3, TIM_OC3);
1742 timer_enable_counter(TIM3);
1749 timer_set_oc_mode(TIM3, TIM_OC4, TIM_OCM_PWM1);
1750 timer_enable_oc_output(TIM3, TIM_OC4);
1753 timer_enable_counter(TIM3);
1773 rcc_periph_clock_enable(RCC_TIM4);
1776 timer_disable_counter(TIM4);
1777 timer_set_mode(TIM4, TIM_CR1_CKD_CK_INT, TIM_CR1_CMS_EDGE,TIM_CR1_DIR_DOWN);
1779 switch(timerChannel){
1785 timer_set_oc_mode(TIM4, TIM_OC1, TIM_OCM_PWM1);
1786 timer_enable_oc_output(TIM4, TIM_OC1);
1789 timer_enable_counter(TIM4);
1796 timer_set_oc_mode(TIM4, TIM_OC2, TIM_OCM_PWM1);
1797 timer_enable_oc_output(TIM4, TIM_OC2);
1800 timer_enable_counter(TIM4);
1807 timer_set_oc_mode(TIM4, TIM_OC3, TIM_OCM_PWM1);
1808 timer_enable_oc_output(TIM4, TIM_OC3);
1811 timer_enable_counter(TIM4);
1818 timer_set_oc_mode(TIM4, TIM_OC4, TIM_OCM_PWM1);
1819 timer_enable_oc_output(TIM4, TIM_OC4);
1822 timer_enable_counter(TIM4);
1842 rcc_periph_clock_enable(RCC_TIM1);
1845 timer_disable_counter(TIM1);
1846 timer_set_mode(TIM1, TIM_CR1_CKD_CK_INT, TIM_CR1_CMS_EDGE,TIM_CR1_DIR_DOWN);
1847 timer_enable_break_main_output(TIM1);
1849 switch(timerChannel){
1855 timer_set_oc_mode(TIM1, TIM_OC1, TIM_OCM_PWM1);
1856 timer_enable_oc_output(TIM1, TIM_OC1);
1859 timer_enable_counter(TIM1);
1866 timer_set_oc_mode(TIM1, TIM_OC2, TIM_OCM_PWM1);
1867 timer_enable_oc_output(TIM1, TIM_OC2);
1870 timer_enable_counter(TIM1);
1876 timer_set_oc_mode(TIM1, TIM_OC3, TIM_OCM_PWM1);
1877 timer_enable_oc_output(TIM1, TIM_OC3);
1880 timer_enable_counter(TIM1);
1887 timer_set_oc_mode(TIM1, TIM_OC4, TIM_OCM_PWM1);
1888 timer_enable_oc_output(TIM1, TIM_OC4);
1891 timer_enable_counter(TIM1);
1910 rcc_periph_clock_enable(RCC_TIM2);
1913 timer_disable_counter(TIM2);
1914 timer_set_mode(TIM2, TIM_CR1_CKD_CK_INT, TIM_CR1_CMS_EDGE,TIM_CR1_DIR_DOWN);
1916 switch(timerChannel){
1922 timer_set_oc_mode(TIM2, TIM_OC1, TIM_OCM_PWM1);
1923 timer_enable_oc_output(TIM2, TIM_OC1);
1926 timer_enable_counter(TIM2);
1933 timer_set_oc_mode(TIM2, TIM_OC2, TIM_OCM_PWM1);
1934 timer_enable_oc_output(TIM2, TIM_OC2);
1937 timer_enable_counter(TIM2);
1944 timer_set_oc_mode(TIM2, TIM_OC3, TIM_OCM_PWM1);
1945 timer_enable_oc_output(TIM2, TIM_OC3);
1948 timer_enable_counter(TIM2);
1956 timer_set_oc_mode(TIM2, TIM_OC4, TIM_OCM_PWM1);
1957 timer_enable_oc_output(TIM2, TIM_OC4);
1960 timer_enable_counter(TIM2);
1980 rcc_periph_clock_enable(RCC_TIM3);
1983 timer_disable_counter(TIM3);
1984 timer_set_mode(TIM3, TIM_CR1_CKD_CK_INT, TIM_CR1_CMS_EDGE,TIM_CR1_DIR_DOWN);
1986 switch(timerChannel){
1992 timer_set_oc_mode(TIM3, TIM_OC1, TIM_OCM_PWM1);
1993 timer_enable_oc_output(TIM3, TIM_OC1);
1996 timer_enable_counter(TIM3);
2003 timer_set_oc_mode(TIM3, TIM_OC2, TIM_OCM_PWM1);
2004 timer_enable_oc_output(TIM3, TIM_OC2);
2007 timer_enable_counter(TIM3);
2014 timer_set_oc_mode(TIM3, TIM_OC3, TIM_OCM_PWM1);
2015 timer_enable_oc_output(TIM3, TIM_OC3);
2018 timer_enable_counter(TIM3);
2026 timer_set_oc_mode(TIM3, TIM_OC4, TIM_OCM_PWM1);
2027 timer_enable_oc_output(TIM3, TIM_OC4);
2030 timer_enable_counter(TIM3);
2050 rcc_periph_clock_enable(RCC_TIM4);
2053 timer_disable_counter(TIM4);
2054 timer_set_mode(TIM4, TIM_CR1_CKD_CK_INT, TIM_CR1_CMS_EDGE,TIM_CR1_DIR_DOWN);
2056 switch(timerChannel){
2062 timer_set_oc_mode(TIM4, TIM_OC1, TIM_OCM_PWM1);
2063 timer_enable_oc_output(TIM4, TIM_OC1);
2066 timer_enable_counter(TIM4);
2073 timer_set_oc_mode(TIM4, TIM_OC2, TIM_OCM_PWM1);
2074 timer_enable_oc_output(TIM4, TIM_OC2);
2077 timer_enable_counter(TIM4);
2084 timer_set_oc_mode(TIM4, TIM_OC3, TIM_OCM_PWM1);
2085 timer_enable_oc_output(TIM4, TIM_OC3);
2088 timer_enable_counter(TIM4);
2096 timer_set_oc_mode(TIM4, TIM_OC4, TIM_OCM_PWM1);
2097 timer_enable_oc_output(TIM4, TIM_OC4);
2100 timer_enable_counter(TIM4);
2121 switch(timerNumber){
2125 return TIM_CNT(TIM1);
2129 return TIM_CNT(TIM2);
2134 return TIM_CNT(TIM3);
2139 return TIM_CNT(TIM4);
2156 switch(timerNumber){
2160 TIM_CNT(TIM1) = count;
2164 TIM_CNT(TIM2) = count;
2169 TIM_CNT(TIM3) = count;
2174 TIM_CNT(TIM4) = count;
2197 switch(timerNumber){
2204 if(period <= 0xFFFF){
2206 timer_set_prescaler(TIM1,prescaler-1);
2207 timer_set_period(TIM1, period-1);
2210 else if(period <= 655350){
2213 timer_set_prescaler(TIM1,prescaler-1);
2214 timer_set_period(TIM1, (period/10.0) - 1);
2216 else if(period <= 6553500){
2219 timer_set_prescaler(TIM1,prescaler-1);
2220 timer_set_period(TIM1, (period/100.0) -1);
2238 if(period <= 0xFFFF){
2240 timer_set_prescaler(TIM2,prescaler-1);
2241 timer_set_period(TIM2, period-1);
2244 else if(period < 655350){
2247 timer_set_prescaler(TIM2,prescaler-1);
2248 timer_set_period(TIM2, (period/10.0) - 1);
2250 else if(period < 6553500){
2253 timer_set_prescaler(TIM2,prescaler-1);
2254 timer_set_period(TIM2, (period/100.0) -1);
2271 if(period <= 0xFFFF){
2273 timer_set_prescaler(TIM3,prescaler-1);
2274 timer_set_period(TIM3, period-1);
2277 else if(period < 655350){
2280 timer_set_prescaler(TIM3,prescaler-1);
2281 timer_set_period(TIM3, (period/10.0) - 1);
2283 else if(period < 6553500){
2286 timer_set_prescaler(TIM3,prescaler-1);
2287 timer_set_period(TIM3, (period/100.0) -1);
2303 if(period <= 0xFFFF){
2305 timer_set_prescaler(TIM4,prescaler-1);
2306 timer_set_period(TIM4, period-1);
2309 else if(period < 655350){
2312 timer_set_prescaler(TIM4,prescaler-1);
2313 timer_set_period(TIM4, (period/10.0) - 1);
2315 else if(period < 6553500){
2318 timer_set_prescaler(TIM4,prescaler-1);
2319 timer_set_period(TIM4, (period/100.0) -1);
2347 switch(timerNumber){
2390 switch(timerNumber){
2401 TIM_CCER(TIM1) &= ~TIM_CCER_CC1E;
2404 TIM_CCER(TIM1) |= TIM_CCER_CC1E;
2405 timer_set_oc_value(TIM1, TIM_OC1, TIM_ARR(TIM1)*((
float)(duty)/100.0f));
2416 TIM_CCER(TIM1) &= ~TIM_CCER_CC2E;
2419 TIM_CCER(TIM1) |= TIM_CCER_CC2E;
2420 timer_set_oc_value(TIM1, TIM_OC2, TIM_ARR(TIM1)*((
float)(duty)/100.0f));
2430 TIM_CCER(TIM1) &= ~TIM_CCER_CC3E;
2433 TIM_CCER(TIM1) |= TIM_CCER_CC3E;
2434 timer_set_oc_value(TIM1, TIM_OC3, TIM_ARR(TIM1)*((
float)(duty)/100.0f));
2444 TIM_CCER(TIM1) &= ~TIM_CCER_CC4E;
2447 TIM_CCER(TIM1) |= TIM_CCER_CC4E;
2448 timer_set_oc_value(TIM1, TIM_OC4, TIM_ARR(TIM1)*((
float)(duty)/100.0f));
2464 TIM_CCER(TIM2) &= ~TIM_CCER_CC1E;
2467 TIM_CCER(TIM2) |= TIM_CCER_CC1E;
2468 timer_set_oc_value(TIM2, TIM_OC1, TIM_ARR(TIM2)*((
float)(duty)/100.0f));
2479 TIM_CCER(TIM2) &= ~TIM_CCER_CC2E;
2482 TIM_CCER(TIM2) |= TIM_CCER_CC2E;
2483 timer_set_oc_value(TIM2, TIM_OC2, TIM_ARR(TIM2)*((
float)(duty)/100.0f));
2493 TIM_CCER(TIM2) &= ~TIM_CCER_CC3E;
2496 TIM_CCER(TIM2) |= TIM_CCER_CC3E;
2497 timer_set_oc_value(TIM2, TIM_OC3, TIM_ARR(TIM2)*((
float)(duty)/100.0f));
2507 TIM_CCER(TIM2) &= ~TIM_CCER_CC4E;
2510 TIM_CCER(TIM2) |= TIM_CCER_CC4E;
2511 timer_set_oc_value(TIM2, TIM_OC4, TIM_ARR(TIM2)*((
float)(duty)/100.0f));
2526 TIM_CCER(TIM3) &= ~TIM_CCER_CC1E;
2529 TIM_CCER(TIM3) |= TIM_CCER_CC1E;
2530 timer_set_oc_value(TIM3, TIM_OC1, TIM_ARR(TIM3)*((
float)(duty)/100.0f));
2541 TIM_CCER(TIM3) &= ~TIM_CCER_CC2E;
2544 TIM_CCER(TIM3) |= TIM_CCER_CC2E;
2545 timer_set_oc_value(TIM3, TIM_OC2, TIM_ARR(TIM3)*((
float)(duty)/100.0f));
2555 TIM_CCER(TIM3) &= ~TIM_CCER_CC3E;
2558 TIM_CCER(TIM3) |= TIM_CCER_CC3E;
2559 timer_set_oc_value(TIM3, TIM_OC3, TIM_ARR(TIM3)*((
float)(duty)/100.0f));
2569 TIM_CCER(TIM3) &= ~TIM_CCER_CC4E;
2572 TIM_CCER(TIM3) |= TIM_CCER_CC4E;
2573 timer_set_oc_value(TIM3, TIM_OC4, TIM_ARR(TIM3)*((
float)(duty)/100.0f));
2588 TIM_CCER(TIM4) &= ~TIM_CCER_CC1E;
2591 TIM_CCER(TIM4) |= TIM_CCER_CC1E;
2592 timer_set_oc_value(TIM4, TIM_OC1, TIM_ARR(TIM4)*((
float)(duty)/100.0f));
2603 TIM_CCER(TIM4) &= ~TIM_CCER_CC2E;
2606 TIM_CCER(TIM4) |= TIM_CCER_CC2E;
2607 timer_set_oc_value(TIM4, TIM_OC2, TIM_ARR(TIM4)*((
float)(duty)/100.0f));
2617 TIM_CCER(TIM4) &= ~TIM_CCER_CC3E;
2620 TIM_CCER(TIM4) |= TIM_CCER_CC3E;
2621 timer_set_oc_value(TIM4, TIM_OC3, TIM_ARR(TIM4)*((
float)(duty)/100.0f));
2631 TIM_CCER(TIM4) &= ~TIM_CCER_CC4E;
2634 TIM_CCER(TIM4) |= TIM_CCER_CC4E;
2635 timer_set_oc_value(TIM4, TIM_OC4, TIM_ARR(TIM4)*((
float)(duty)/100.0f));
2657 switch(timerNumber){
2668 TIM_CCER(TIM1) &= ~TIM_CCER_CC1E;
2673 if(pulse > TIM_ARR(TIM1)){
2676 pulse = TIM_ARR(TIM1);
2683 TIM_CCER(TIM1) |= TIM_CCER_CC1E;
2684 timer_set_oc_value(TIM1, TIM_OC1, pulse-1);
2694 TIM_CCER(TIM1) &= ~TIM_CCER_CC2E;
2699 if(pulse > TIM_ARR(TIM1)){
2702 pulse = TIM_ARR(TIM1);
2709 TIM_CCER(TIM1) |= TIM_CCER_CC2E;
2710 timer_set_oc_value(TIM1, TIM_OC2, pulse-1);
2718 TIM_CCER(TIM1) &= ~TIM_CCER_CC3E;
2723 if(pulse > TIM_ARR(TIM1)){
2726 pulse = TIM_ARR(TIM1);
2733 TIM_CCER(TIM1) |= TIM_CCER_CC3E;
2734 timer_set_oc_value(TIM1, TIM_OC3, pulse-1);
2743 TIM_CCER(TIM1) &= ~TIM_CCER_CC4E;
2748 if(pulse > TIM_ARR(TIM1)){
2751 pulse = TIM_ARR(TIM1);
2758 TIM_CCER(TIM1) |= TIM_CCER_CC4E;
2759 timer_set_oc_value(TIM1, TIM_OC4, pulse-1);
2774 TIM_CCER(TIM2) &= ~TIM_CCER_CC1E;
2779 if(pulse > TIM_ARR(TIM2)){
2782 pulse = TIM_ARR(TIM2);
2789 TIM_CCER(TIM2) |= TIM_CCER_CC1E;
2790 timer_set_oc_value(TIM2, TIM_OC1, pulse-1);
2800 TIM_CCER(TIM2) &= ~TIM_CCER_CC2E;
2805 if(pulse > TIM_ARR(TIM2)){
2808 pulse = TIM_ARR(TIM2);
2815 TIM_CCER(TIM2) |= TIM_CCER_CC2E;
2816 timer_set_oc_value(TIM2, TIM_OC2, pulse-1);
2824 TIM_CCER(TIM2) &= ~TIM_CCER_CC3E;
2829 if(pulse > TIM_ARR(TIM2)){
2832 pulse = TIM_ARR(TIM2);
2839 TIM_CCER(TIM2) |= TIM_CCER_CC3E;
2840 timer_set_oc_value(TIM2, TIM_OC3, pulse-1);
2849 TIM_CCER(TIM2) &= ~TIM_CCER_CC4E;
2854 if(pulse > TIM_ARR(TIM2)){
2857 pulse = TIM_ARR(TIM2);
2864 TIM_CCER(TIM2) |= TIM_CCER_CC4E;
2865 timer_set_oc_value(TIM2, TIM_OC4, pulse-1);
2880 TIM_CCER(TIM3) &= ~TIM_CCER_CC1E;
2885 if(pulse > TIM_ARR(TIM3)){
2888 pulse = TIM_ARR(TIM3);
2895 TIM_CCER(TIM3) |= TIM_CCER_CC1E;
2896 timer_set_oc_value(TIM3, TIM_OC1, pulse-1);
2906 TIM_CCER(TIM3) &= ~TIM_CCER_CC2E;
2911 if(pulse > TIM_ARR(TIM3)){
2914 pulse = TIM_ARR(TIM3);
2921 TIM_CCER(TIM3) |= TIM_CCER_CC2E;
2922 timer_set_oc_value(TIM3, TIM_OC2, pulse-1);
2930 TIM_CCER(TIM3) &= ~TIM_CCER_CC3E;
2935 if(pulse > TIM_ARR(TIM3)){
2938 pulse = TIM_ARR(TIM3);
2945 TIM_CCER(TIM3) |= TIM_CCER_CC3E;
2946 timer_set_oc_value(TIM3, TIM_OC3, pulse-1);
2955 TIM_CCER(TIM3) &= ~TIM_CCER_CC4E;
2960 if(pulse > TIM_ARR(TIM3)){
2963 pulse = TIM_ARR(TIM3);
2970 TIM_CCER(TIM3) |= TIM_CCER_CC4E;
2971 timer_set_oc_value(TIM3, TIM_OC4, pulse-1);
2986 TIM_CCER(TIM4) &= ~TIM_CCER_CC1E;
2991 if(pulse > TIM_ARR(TIM4)){
2994 pulse = TIM_ARR(TIM4);
3001 TIM_CCER(TIM4) |= TIM_CCER_CC1E;
3002 timer_set_oc_value(TIM4, TIM_OC1, pulse-1);
3012 TIM_CCER(TIM4) &= ~TIM_CCER_CC2E;
3017 if(pulse > TIM_ARR(TIM4)){
3020 pulse = TIM_ARR(TIM4);
3027 TIM_CCER(TIM4) |= TIM_CCER_CC2E;
3028 timer_set_oc_value(TIM4, TIM_OC2, pulse-1);
3036 TIM_CCER(TIM4) &= ~TIM_CCER_CC3E;
3041 if(pulse > TIM_ARR(TIM4)){
3044 pulse = TIM_ARR(TIM4);
3051 TIM_CCER(TIM4) |= TIM_CCER_CC3E;
3052 timer_set_oc_value(TIM4, TIM_OC3, pulse-1);
3061 TIM_CCER(TIM4) &= ~TIM_CCER_CC4E;
3066 if(pulse > TIM_ARR(TIM4)){
3069 pulse = TIM_ARR(TIM4);
3076 TIM_CCER(TIM4) |= TIM_CCER_CC4E;
3077 timer_set_oc_value(TIM4, TIM_OC4, pulse-1);
mcu_error TIMER_setupPulse(timer_main timerNumber, timer_channel timerChannel, uint32_t frequency, uint32_t pulse)
Initialize given timer for Pulse mode.
Error timer: Pulse too long.
mcu_error TIMER_setFrequency(timer_main timerNumber, uint32_t frequency)
Set the frequency for the timer. (in hertz)
Error timer: Timer doesn't exist.
mcu_error TIMER_resume(timer_main timerNumber)
Resume a paused timer.
mcu_error TIMER_pause(timer_main timerNumber)
Pause an already running timer.
mcu_error TIMER_setCount(timer_main timerNumber, uint16_t count)
Set the current value of a running timer.
mcu_error TIMER_setupCount(timer_main timerNumber, uint32_t frequency, void(*handler)(void))
Initialize given timer for standard count with interrupt on timeout.
void MCU_printError(mcu_error errorNum)
Print a given error number as a character stream.
mcu_error TIMER_enableISR(timer_main timerNumber, void(*handler)(void))
Set the ISR target for timeout.
mcu_error TIMER_setPeriod(timer_main timerNumber, uint32_t period)
Set the period for the timer. (in microseconds)
uint8_t MCU_debugIsEnabled(void)
Checks if debug is enabled.
timer_main
Main timers available on the MCU.
mcu_error TIMER_disableISR(timer_main timerNumber)
Disable the timeout IRQ.
uint32_t CLOCK_getSpeed(void)
Get the current clock speed of the device.
mcu_error TIMER_setupPWM(timer_main timerNumber, timer_channel timerChannel, uint32_t frequency, uint8_t duty)
Initialize given timer for PWM mode.
timer_channel
Timers channels available for each timer.
mcu_error TIMER_setDuty(timer_main timerNumber, timer_channel channel, uint8_t duty)
Set the duty cycle for the waveform (PWM only, 0 - 100%).
mcu_error pinSetup(gpio_mode mode, gpio_port port, gpio_pin pin)
Setup a GPIO pin for a given function.
Setup the port for output PWM.
mcu_error TIMER_setPulse(timer_main timerNumber, timer_channel channel, uint32_t pulse)
Set the pulse width for the output. (in microseconds)
uint16_t TIMER_getCount(timer_main timerNumber)
Get the current value of a running timer.
Header file for stm32f103cb timers.
Error timer: Period too long / frequency too high.
mcu_error TIMER_setupIC(timer_main timerNumber, timer_channel timerChannel)
Initialize given timer for input capture.
Setup the port for input capture.
Error timer: Channel doesn't exist.
mcu_error
Error enumerators for the Debug peripheral.
uint16_t TIMER_getIC(timer_main timerNumber, timer_channel channel)
Get the last input capture time from a channel of a timer.