@@ -26,16 +26,6 @@ typedef struct _machine_timer_obj_t {
26
26
27
27
static machine_timer_obj_t timer_root ;
28
28
29
- void __attribute__((interrupt ("IRQ" ))) irq_timer (void ) {
30
- if (IRQ_PEND1 & IRQ_SYSTIMER (SYST_NUM )) {
31
- if (timer_root .callback ) {
32
- mp_sched_schedule (timer_root .callback , & timer_root );
33
- }
34
- systimer -> C [SYST_NUM ] += timer_root .period ;
35
- systimer -> CS |= (1 << SYST_NUM );
36
- }
37
- }
38
-
39
29
static void timer_enable (void ) {
40
30
if ((IRQ_ENABLE1 & IRQ_SYSTIMER (3 )) == 0 ) {
41
31
IRQ_ENABLE1 = IRQ_SYSTIMER (3 );
@@ -47,6 +37,20 @@ static void timer_disable(void) {
47
37
IRQ_DISABLE1 = IRQ_SYSTIMER (3 );
48
38
}
49
39
40
+ void __attribute__((interrupt ("IRQ" ))) irq_timer (void ) {
41
+ if (IRQ_PEND1 & IRQ_SYSTIMER (SYST_NUM )) {
42
+ if (timer_root .callback ) {
43
+ mp_sched_schedule (timer_root .callback , & timer_root );
44
+ }
45
+ if (timer_root .mode == PERIODIC ) {
46
+ systimer -> C [SYST_NUM ] += timer_root .period ;
47
+ } else {
48
+ timer_disable ();
49
+ }
50
+ systimer -> CS |= (1 << SYST_NUM );
51
+ }
52
+ }
53
+
50
54
STATIC mp_obj_t machine_timer_make_new (const mp_obj_type_t * type , size_t n_args , size_t n_kw , const mp_obj_t * args ) {
51
55
mp_arg_check_num (n_args , n_kw , 1 , 1 , false);
52
56
// machine_timer_obj_t *tim = m_new_obj(machine_timer_obj_t);
0 commit comments