Browse Source

Allow pins override of *_TIMER_NUM and HAL_*_TIMER_ISR (#18128)

Co-authored-by: Scott Lahteine <github@thinkyhead.com>
ellensp 4 years ago
parent
commit
33d1e77e2e
No account linked to committer's email address
43 changed files with 459 additions and 336 deletions
  1. 0
    217
      Marlin/src/HAL/AVR/HAL.h
  2. 259
    0
      Marlin/src/HAL/AVR/timers.h
  3. 0
    1
      Marlin/src/HAL/DUE/HAL.h
  4. 0
    1
      Marlin/src/HAL/DUE/Tone.cpp
  5. 0
    2
      Marlin/src/HAL/DUE/timers.cpp
  6. 16
    6
      Marlin/src/HAL/DUE/timers.h
  7. 2
    4
      Marlin/src/HAL/ESP32/HAL.cpp
  8. 0
    2
      Marlin/src/HAL/ESP32/HAL.h
  9. 3
    4
      Marlin/src/HAL/ESP32/HAL_SPI.cpp
  10. 1
    3
      Marlin/src/HAL/ESP32/timers.cpp
  11. 21
    7
      Marlin/src/HAL/ESP32/timers.h
  12. 0
    1
      Marlin/src/HAL/LINUX/HAL.h
  13. 0
    1
      Marlin/src/HAL/LINUX/timers.cpp
  14. 15
    5
      Marlin/src/HAL/LINUX/timers.h
  15. 0
    1
      Marlin/src/HAL/LPC1768/HAL.h
  16. 0
    2
      Marlin/src/HAL/LPC1768/main.cpp
  17. 0
    1
      Marlin/src/HAL/LPC1768/timers.cpp
  18. 18
    6
      Marlin/src/HAL/LPC1768/timers.h
  19. 0
    1
      Marlin/src/HAL/SAMD51/HAL.h
  20. 0
    1
      Marlin/src/HAL/SAMD51/Servo.cpp
  21. 0
    1
      Marlin/src/HAL/SAMD51/timers.cpp
  22. 17
    9
      Marlin/src/HAL/SAMD51/timers.h
  23. 0
    1
      Marlin/src/HAL/STM32/HAL.h
  24. 2
    1
      Marlin/src/HAL/STM32/SoftwareSerial.cpp
  25. 0
    2
      Marlin/src/HAL/STM32/timers.cpp
  26. 16
    5
      Marlin/src/HAL/STM32/timers.h
  27. 0
    1
      Marlin/src/HAL/STM32F1/HAL.h
  28. 0
    1
      Marlin/src/HAL/STM32F1/Servo.cpp
  29. 0
    2
      Marlin/src/HAL/STM32F1/timers.cpp
  30. 19
    9
      Marlin/src/HAL/STM32F1/timers.h
  31. 0
    1
      Marlin/src/HAL/STM32_F4_F7/HAL.h
  32. 1
    2
      Marlin/src/HAL/STM32_F4_F7/STM32F4/timers.cpp
  33. 19
    11
      Marlin/src/HAL/STM32_F4_F7/STM32F4/timers.h
  34. 1
    2
      Marlin/src/HAL/STM32_F4_F7/STM32F7/timers.cpp
  35. 15
    5
      Marlin/src/HAL/STM32_F4_F7/STM32F7/timers.h
  36. 0
    1
      Marlin/src/HAL/TEENSY31_32/HAL.h
  37. 1
    2
      Marlin/src/HAL/TEENSY31_32/timers.cpp
  38. 15
    5
      Marlin/src/HAL/TEENSY31_32/timers.h
  39. 0
    2
      Marlin/src/HAL/TEENSY35_36/HAL.h
  40. 1
    2
      Marlin/src/HAL/TEENSY35_36/timers.cpp
  41. 15
    5
      Marlin/src/HAL/TEENSY35_36/timers.h
  42. 1
    0
      Marlin/src/inc/MarlinConfig.h
  43. 1
    0
      Marlin/src/pins/sam/pins_ARCHIM1.h

+ 0
- 217
Marlin/src/HAL/AVR/HAL.h View File

@@ -68,9 +68,6 @@
68 68
 // Types
69 69
 // ------------------------
70 70
 
71
-typedef uint16_t hal_timer_t;
72
-#define HAL_TIMER_TYPE_MAX 0xFFFF
73
-
74 71
 typedef int8_t pin_t;
75 72
 
76 73
 #define SHARED_SERVOS HAS_SERVOS
@@ -143,220 +140,6 @@ extern "C" {
143 140
 }
144 141
 #pragma GCC diagnostic pop
145 142
 
146
-// timers
147
-#define HAL_TIMER_RATE          ((F_CPU) / 8)    // i.e., 2MHz or 2.5MHz
148
-
149
-#define STEP_TIMER_NUM          1
150
-#define TEMP_TIMER_NUM          0
151
-#define PULSE_TIMER_NUM         STEP_TIMER_NUM
152
-
153
-#define TEMP_TIMER_FREQUENCY    ((F_CPU) / 64.0 / 256.0)
154
-
155
-#define STEPPER_TIMER_RATE      HAL_TIMER_RATE
156
-#define STEPPER_TIMER_PRESCALE  8
157
-#define STEPPER_TIMER_TICKS_PER_US ((STEPPER_TIMER_RATE) / 1000000) // Cannot be of type double
158
-
159
-#define PULSE_TIMER_RATE       STEPPER_TIMER_RATE   // frequency of pulse timer
160
-#define PULSE_TIMER_PRESCALE   STEPPER_TIMER_PRESCALE
161
-#define PULSE_TIMER_TICKS_PER_US STEPPER_TIMER_TICKS_PER_US
162
-
163
-#define ENABLE_STEPPER_DRIVER_INTERRUPT()  SBI(TIMSK1, OCIE1A)
164
-#define DISABLE_STEPPER_DRIVER_INTERRUPT() CBI(TIMSK1, OCIE1A)
165
-#define STEPPER_ISR_ENABLED()             TEST(TIMSK1, OCIE1A)
166
-
167
-#define ENABLE_TEMPERATURE_INTERRUPT()     SBI(TIMSK0, OCIE0B)
168
-#define DISABLE_TEMPERATURE_INTERRUPT()    CBI(TIMSK0, OCIE0B)
169
-#define TEMPERATURE_ISR_ENABLED()         TEST(TIMSK0, OCIE0B)
170
-
171
-FORCE_INLINE void HAL_timer_start(const uint8_t timer_num, const uint32_t) {
172
-  switch (timer_num) {
173
-    case STEP_TIMER_NUM:
174
-      // waveform generation = 0100 = CTC
175
-      SET_WGM(1, CTC_OCRnA);
176
-
177
-      // output mode = 00 (disconnected)
178
-      SET_COMA(1, NORMAL);
179
-
180
-      // Set the timer pre-scaler
181
-      // Generally we use a divider of 8, resulting in a 2MHz timer
182
-      // frequency on a 16MHz MCU. If you are going to change this, be
183
-      // sure to regenerate speed_lookuptable.h with
184
-      // create_speed_lookuptable.py
185
-      SET_CS(1, PRESCALER_8);  //  CS 2 = 1/8 prescaler
186
-
187
-      // Init Stepper ISR to 122 Hz for quick starting
188
-      // (F_CPU) / (STEPPER_TIMER_PRESCALE) / frequency
189
-      OCR1A = 0x4000;
190
-      TCNT1 = 0;
191
-      break;
192
-
193
-    case TEMP_TIMER_NUM:
194
-      // Use timer0 for temperature measurement
195
-      // Interleave temperature interrupt with millies interrupt
196
-      OCR0B = 128;
197
-      break;
198
-  }
199
-}
200
-
201
-#define TIMER_OCR_1             OCR1A
202
-#define TIMER_COUNTER_1         TCNT1
203
-
204
-#define TIMER_OCR_0             OCR0A
205
-#define TIMER_COUNTER_0         TCNT0
206
-
207
-#define _CAT(a,V...) a##V
208
-#define HAL_timer_set_compare(timer, compare) (_CAT(TIMER_OCR_, timer) = compare)
209
-#define HAL_timer_get_compare(timer) _CAT(TIMER_OCR_, timer)
210
-#define HAL_timer_get_count(timer) _CAT(TIMER_COUNTER_, timer)
211
-
212
-/**
213
- * On AVR there is no hardware prioritization and preemption of
214
- * interrupts, so this emulates it. The UART has first priority
215
- * (otherwise, characters will be lost due to UART overflow).
216
- * Then: Stepper, Endstops, Temperature, and -finally- all others.
217
- */
218
-#define HAL_timer_isr_prologue(TIMER_NUM)
219
-#define HAL_timer_isr_epilogue(TIMER_NUM)
220
-
221
-/* 18 cycles maximum latency */
222
-#define HAL_STEP_TIMER_ISR() \
223
-extern "C" void TIMER1_COMPA_vect() __attribute__ ((signal, naked, used, externally_visible)); \
224
-extern "C" void TIMER1_COMPA_vect_bottom() asm ("TIMER1_COMPA_vect_bottom") __attribute__ ((used, externally_visible, noinline)); \
225
-void TIMER1_COMPA_vect() { \
226
-  __asm__ __volatile__ ( \
227
-    A("push r16")                      /* 2 Save R16 */ \
228
-    A("in r16, __SREG__")              /* 1 Get SREG */ \
229
-    A("push r16")                      /* 2 Save SREG into stack */ \
230
-    A("lds r16, %[timsk0]")            /* 2 Load into R0 the Temperature timer Interrupt mask register */ \
231
-    A("push r16")                      /* 2 Save TIMSK0 into the stack */ \
232
-    A("andi r16,~%[msk0]")             /* 1 Disable the temperature ISR */ \
233
-    A("sts %[timsk0], r16")            /* 2 And set the new value */ \
234
-    A("lds r16, %[timsk1]")            /* 2 Load into R0 the stepper timer Interrupt mask register [TIMSK1] */ \
235
-    A("andi r16,~%[msk1]")             /* 1 Disable the stepper ISR */ \
236
-    A("sts %[timsk1], r16")            /* 2 And set the new value */ \
237
-    A("push r16")                      /* 2 Save TIMSK1 into stack */ \
238
-    A("in r16, 0x3B")                  /* 1 Get RAMPZ register */ \
239
-    A("push r16")                      /* 2 Save RAMPZ into stack */ \
240
-    A("in r16, 0x3C")                  /* 1 Get EIND register */ \
241
-    A("push r0")                       /* C runtime can modify all the following registers without restoring them */ \
242
-    A("push r1")                       \
243
-    A("push r18")                      \
244
-    A("push r19")                      \
245
-    A("push r20")                      \
246
-    A("push r21")                      \
247
-    A("push r22")                      \
248
-    A("push r23")                      \
249
-    A("push r24")                      \
250
-    A("push r25")                      \
251
-    A("push r26")                      \
252
-    A("push r27")                      \
253
-    A("push r30")                      \
254
-    A("push r31")                      \
255
-    A("clr r1")                        /* C runtime expects this register to be 0 */ \
256
-    A("call TIMER1_COMPA_vect_bottom") /* Call the bottom handler - No inlining allowed, otherwise registers used are not saved */   \
257
-    A("pop r31")                       \
258
-    A("pop r30")                       \
259
-    A("pop r27")                       \
260
-    A("pop r26")                       \
261
-    A("pop r25")                       \
262
-    A("pop r24")                       \
263
-    A("pop r23")                       \
264
-    A("pop r22")                       \
265
-    A("pop r21")                       \
266
-    A("pop r20")                       \
267
-    A("pop r19")                       \
268
-    A("pop r18")                       \
269
-    A("pop r1")                        \
270
-    A("pop r0")                        \
271
-    A("out 0x3C, r16")                 /* 1 Restore EIND register */ \
272
-    A("pop r16")                       /* 2 Get the original RAMPZ register value */ \
273
-    A("out 0x3B, r16")                 /* 1 Restore RAMPZ register to its original value */ \
274
-    A("pop r16")                       /* 2 Get the original TIMSK1 value but with stepper ISR disabled */ \
275
-    A("ori r16,%[msk1]")               /* 1 Reenable the stepper ISR */ \
276
-    A("cli")                           /* 1 Disable global interrupts - Reenabling Stepper ISR can reenter amd temperature can reenter, and we want that, if it happens, after this ISR has ended */ \
277
-    A("sts %[timsk1], r16")            /* 2 And restore the old value - This reenables the stepper ISR */ \
278
-    A("pop r16")                       /* 2 Get the temperature timer Interrupt mask register [TIMSK0] */ \
279
-    A("sts %[timsk0], r16")            /* 2 And restore the old value - This reenables the temperature ISR */ \
280
-    A("pop r16")                       /* 2 Get the old SREG value */ \
281
-    A("out __SREG__, r16")             /* 1 And restore the SREG value */ \
282
-    A("pop r16")                       /* 2 Restore R16 value */ \
283
-    A("reti")                          /* 4 Return from interrupt */ \
284
-    :                                   \
285
-    : [timsk0] "i" ((uint16_t)&TIMSK0), \
286
-      [timsk1] "i" ((uint16_t)&TIMSK1), \
287
-      [msk0] "M" ((uint8_t)(1<<OCIE0B)),\
288
-      [msk1] "M" ((uint8_t)(1<<OCIE1A)) \
289
-    : \
290
-  ); \
291
-} \
292
-void TIMER1_COMPA_vect_bottom()
293
-
294
-/* 14 cycles maximum latency */
295
-#define HAL_TEMP_TIMER_ISR() \
296
-extern "C" void TIMER0_COMPB_vect() __attribute__ ((signal, naked, used, externally_visible)); \
297
-extern "C" void TIMER0_COMPB_vect_bottom()  asm ("TIMER0_COMPB_vect_bottom") __attribute__ ((used, externally_visible, noinline)); \
298
-void TIMER0_COMPB_vect() { \
299
-  __asm__ __volatile__ ( \
300
-    A("push r16")                       /* 2 Save R16 */ \
301
-    A("in r16, __SREG__")               /* 1 Get SREG */ \
302
-    A("push r16")                       /* 2 Save SREG into stack */ \
303
-    A("lds r16, %[timsk0]")             /* 2 Load into R0 the Temperature timer Interrupt mask register */ \
304
-    A("andi r16,~%[msk0]")              /* 1 Disable the temperature ISR */ \
305
-    A("sts %[timsk0], r16")             /* 2 And set the new value */ \
306
-    A("sei")                            /* 1 Enable global interrupts - It is safe, as the temperature ISR is disabled, so we cannot reenter it */    \
307
-    A("push r16")                       /* 2 Save TIMSK0 into stack */ \
308
-    A("in r16, 0x3B")                   /* 1 Get RAMPZ register */ \
309
-    A("push r16")                       /* 2 Save RAMPZ into stack */ \
310
-    A("in r16, 0x3C")                   /* 1 Get EIND register */ \
311
-    A("push r0")                        /* C runtime can modify all the following registers without restoring them */ \
312
-    A("push r1")                        \
313
-    A("push r18")                       \
314
-    A("push r19")                       \
315
-    A("push r20")                       \
316
-    A("push r21")                       \
317
-    A("push r22")                       \
318
-    A("push r23")                       \
319
-    A("push r24")                       \
320
-    A("push r25")                       \
321
-    A("push r26")                       \
322
-    A("push r27")                       \
323
-    A("push r30")                       \
324
-    A("push r31")                       \
325
-    A("clr r1")                         /* C runtime expects this register to be 0 */ \
326
-    A("call TIMER0_COMPB_vect_bottom")  /* Call the bottom handler - No inlining allowed, otherwise registers used are not saved */   \
327
-    A("pop r31")                        \
328
-    A("pop r30")                        \
329
-    A("pop r27")                        \
330
-    A("pop r26")                        \
331
-    A("pop r25")                        \
332
-    A("pop r24")                        \
333
-    A("pop r23")                        \
334
-    A("pop r22")                        \
335
-    A("pop r21")                        \
336
-    A("pop r20")                        \
337
-    A("pop r19")                        \
338
-    A("pop r18")                        \
339
-    A("pop r1")                         \
340
-    A("pop r0")                         \
341
-    A("out 0x3C, r16")                  /* 1 Restore EIND register */ \
342
-    A("pop r16")                        /* 2 Get the original RAMPZ register value */ \
343
-    A("out 0x3B, r16")                  /* 1 Restore RAMPZ register to its original value */ \
344
-    A("pop r16")                        /* 2 Get the original TIMSK0 value but with temperature ISR disabled */ \
345
-    A("ori r16,%[msk0]")                /* 1 Enable temperature ISR */ \
346
-    A("cli")                            /* 1 Disable global interrupts - We must do this, as we will reenable the temperature ISR, and we don't want to reenter this handler until the current one is done */ \
347
-    A("sts %[timsk0], r16")             /* 2 And restore the old value */ \
348
-    A("pop r16")                        /* 2 Get the old SREG */ \
349
-    A("out __SREG__, r16")              /* 1 And restore the SREG value */ \
350
-    A("pop r16")                        /* 2 Restore R16 */ \
351
-    A("reti")                           /* 4 Return from interrupt */ \
352
-    :                                   \
353
-    : [timsk0] "i"((uint16_t)&TIMSK0),  \
354
-      [msk0] "M" ((uint8_t)(1<<OCIE0B)) \
355
-    : \
356
-  ); \
357
-} \
358
-void TIMER0_COMPB_vect_bottom()
359
-
360 143
 // ADC
361 144
 #ifdef DIDR2
362 145
   #define HAL_ANALOG_SELECT(ind) do{ if (ind < 8) SBI(DIDR0, ind); else SBI(DIDR2, ind & 0x07); }while(0)

+ 259
- 0
Marlin/src/HAL/AVR/timers.h View File

@@ -0,0 +1,259 @@
1
+/**
2
+ * Marlin 3D Printer Firmware
3
+ * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
4
+ * Copyright (c) 2016 Bob Cousins bobcousins42@googlemail.com
5
+ *
6
+ * This program is free software: you can redistribute it and/or modify
7
+ * it under the terms of the GNU General Public License as published by
8
+ * the Free Software Foundation, either version 3 of the License, or
9
+ * (at your option) any later version.
10
+ *
11
+ * This program is distributed in the hope that it will be useful,
12
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
13
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14
+ * GNU General Public License for more details.
15
+ *
16
+ * You should have received a copy of the GNU General Public License
17
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
18
+ */
19
+#pragma once
20
+
21
+#include <stdint.h>
22
+
23
+// ------------------------
24
+// Types
25
+// ------------------------
26
+
27
+typedef uint16_t hal_timer_t;
28
+#define HAL_TIMER_TYPE_MAX 0xFFFF
29
+
30
+// ------------------------
31
+// Defines
32
+// ------------------------
33
+
34
+#define HAL_TIMER_RATE          ((F_CPU) / 8)    // i.e., 2MHz or 2.5MHz
35
+
36
+#ifndef STEP_TIMER_NUM
37
+  #define STEP_TIMER_NUM        1
38
+#endif
39
+#ifndef PULSE_TIMER_NUM
40
+  #define PULSE_TIMER_NUM       STEP_TIMER_NUM
41
+#endif
42
+#ifndef TEMP_TIMER_NUM
43
+  #define TEMP_TIMER_NUM        0
44
+#endif
45
+
46
+#define TEMP_TIMER_FREQUENCY    ((F_CPU) / 64.0 / 256.0)
47
+
48
+#define STEPPER_TIMER_RATE      HAL_TIMER_RATE
49
+#define STEPPER_TIMER_PRESCALE  8
50
+#define STEPPER_TIMER_TICKS_PER_US ((STEPPER_TIMER_RATE) / 1000000) // Cannot be of type double
51
+
52
+#define PULSE_TIMER_RATE       STEPPER_TIMER_RATE   // frequency of pulse timer
53
+#define PULSE_TIMER_PRESCALE   STEPPER_TIMER_PRESCALE
54
+#define PULSE_TIMER_TICKS_PER_US STEPPER_TIMER_TICKS_PER_US
55
+
56
+#define ENABLE_STEPPER_DRIVER_INTERRUPT()  SBI(TIMSK1, OCIE1A)
57
+#define DISABLE_STEPPER_DRIVER_INTERRUPT() CBI(TIMSK1, OCIE1A)
58
+#define STEPPER_ISR_ENABLED()             TEST(TIMSK1, OCIE1A)
59
+
60
+#define ENABLE_TEMPERATURE_INTERRUPT()     SBI(TIMSK0, OCIE0B)
61
+#define DISABLE_TEMPERATURE_INTERRUPT()    CBI(TIMSK0, OCIE0B)
62
+#define TEMPERATURE_ISR_ENABLED()         TEST(TIMSK0, OCIE0B)
63
+
64
+FORCE_INLINE void HAL_timer_start(const uint8_t timer_num, const uint32_t) {
65
+  switch (timer_num) {
66
+    case STEP_TIMER_NUM:
67
+      // waveform generation = 0100 = CTC
68
+      SET_WGM(1, CTC_OCRnA);
69
+
70
+      // output mode = 00 (disconnected)
71
+      SET_COMA(1, NORMAL);
72
+
73
+      // Set the timer pre-scaler
74
+      // Generally we use a divider of 8, resulting in a 2MHz timer
75
+      // frequency on a 16MHz MCU. If you are going to change this, be
76
+      // sure to regenerate speed_lookuptable.h with
77
+      // create_speed_lookuptable.py
78
+      SET_CS(1, PRESCALER_8);  //  CS 2 = 1/8 prescaler
79
+
80
+      // Init Stepper ISR to 122 Hz for quick starting
81
+      // (F_CPU) / (STEPPER_TIMER_PRESCALE) / frequency
82
+      OCR1A = 0x4000;
83
+      TCNT1 = 0;
84
+      break;
85
+
86
+    case TEMP_TIMER_NUM:
87
+      // Use timer0 for temperature measurement
88
+      // Interleave temperature interrupt with millies interrupt
89
+      OCR0B = 128;
90
+      break;
91
+  }
92
+}
93
+
94
+#define TIMER_OCR_1             OCR1A
95
+#define TIMER_COUNTER_1         TCNT1
96
+
97
+#define TIMER_OCR_0             OCR0A
98
+#define TIMER_COUNTER_0         TCNT0
99
+
100
+#define _CAT(a,V...) a##V
101
+#define HAL_timer_set_compare(timer, compare) (_CAT(TIMER_OCR_, timer) = compare)
102
+#define HAL_timer_get_compare(timer) _CAT(TIMER_OCR_, timer)
103
+#define HAL_timer_get_count(timer) _CAT(TIMER_COUNTER_, timer)
104
+
105
+/**
106
+ * On AVR there is no hardware prioritization and preemption of
107
+ * interrupts, so this emulates it. The UART has first priority
108
+ * (otherwise, characters will be lost due to UART overflow).
109
+ * Then: Stepper, Endstops, Temperature, and -finally- all others.
110
+ */
111
+#define HAL_timer_isr_prologue(TIMER_NUM)
112
+#define HAL_timer_isr_epilogue(TIMER_NUM)
113
+
114
+/* 18 cycles maximum latency */
115
+#ifndef HAL_STEP_TIMER_ISR
116
+
117
+#define HAL_STEP_TIMER_ISR() \
118
+extern "C" void TIMER1_COMPA_vect() __attribute__ ((signal, naked, used, externally_visible)); \
119
+extern "C" void TIMER1_COMPA_vect_bottom() asm ("TIMER1_COMPA_vect_bottom") __attribute__ ((used, externally_visible, noinline)); \
120
+void TIMER1_COMPA_vect() { \
121
+  __asm__ __volatile__ ( \
122
+    A("push r16")                      /* 2 Save R16 */ \
123
+    A("in r16, __SREG__")              /* 1 Get SREG */ \
124
+    A("push r16")                      /* 2 Save SREG into stack */ \
125
+    A("lds r16, %[timsk0]")            /* 2 Load into R0 the Temperature timer Interrupt mask register */ \
126
+    A("push r16")                      /* 2 Save TIMSK0 into the stack */ \
127
+    A("andi r16,~%[msk0]")             /* 1 Disable the temperature ISR */ \
128
+    A("sts %[timsk0], r16")            /* 2 And set the new value */ \
129
+    A("lds r16, %[timsk1]")            /* 2 Load into R0 the stepper timer Interrupt mask register [TIMSK1] */ \
130
+    A("andi r16,~%[msk1]")             /* 1 Disable the stepper ISR */ \
131
+    A("sts %[timsk1], r16")            /* 2 And set the new value */ \
132
+    A("push r16")                      /* 2 Save TIMSK1 into stack */ \
133
+    A("in r16, 0x3B")                  /* 1 Get RAMPZ register */ \
134
+    A("push r16")                      /* 2 Save RAMPZ into stack */ \
135
+    A("in r16, 0x3C")                  /* 1 Get EIND register */ \
136
+    A("push r0")                       /* C runtime can modify all the following registers without restoring them */ \
137
+    A("push r1")                       \
138
+    A("push r18")                      \
139
+    A("push r19")                      \
140
+    A("push r20")                      \
141
+    A("push r21")                      \
142
+    A("push r22")                      \
143
+    A("push r23")                      \
144
+    A("push r24")                      \
145
+    A("push r25")                      \
146
+    A("push r26")                      \
147
+    A("push r27")                      \
148
+    A("push r30")                      \
149
+    A("push r31")                      \
150
+    A("clr r1")                        /* C runtime expects this register to be 0 */ \
151
+    A("call TIMER1_COMPA_vect_bottom") /* Call the bottom handler - No inlining allowed, otherwise registers used are not saved */   \
152
+    A("pop r31")                       \
153
+    A("pop r30")                       \
154
+    A("pop r27")                       \
155
+    A("pop r26")                       \
156
+    A("pop r25")                       \
157
+    A("pop r24")                       \
158
+    A("pop r23")                       \
159
+    A("pop r22")                       \
160
+    A("pop r21")                       \
161
+    A("pop r20")                       \
162
+    A("pop r19")                       \
163
+    A("pop r18")                       \
164
+    A("pop r1")                        \
165
+    A("pop r0")                        \
166
+    A("out 0x3C, r16")                 /* 1 Restore EIND register */ \
167
+    A("pop r16")                       /* 2 Get the original RAMPZ register value */ \
168
+    A("out 0x3B, r16")                 /* 1 Restore RAMPZ register to its original value */ \
169
+    A("pop r16")                       /* 2 Get the original TIMSK1 value but with stepper ISR disabled */ \
170
+    A("ori r16,%[msk1]")               /* 1 Reenable the stepper ISR */ \
171
+    A("cli")                           /* 1 Disable global interrupts - Reenabling Stepper ISR can reenter amd temperature can reenter, and we want that, if it happens, after this ISR has ended */ \
172
+    A("sts %[timsk1], r16")            /* 2 And restore the old value - This reenables the stepper ISR */ \
173
+    A("pop r16")                       /* 2 Get the temperature timer Interrupt mask register [TIMSK0] */ \
174
+    A("sts %[timsk0], r16")            /* 2 And restore the old value - This reenables the temperature ISR */ \
175
+    A("pop r16")                       /* 2 Get the old SREG value */ \
176
+    A("out __SREG__, r16")             /* 1 And restore the SREG value */ \
177
+    A("pop r16")                       /* 2 Restore R16 value */ \
178
+    A("reti")                          /* 4 Return from interrupt */ \
179
+    :                                   \
180
+    : [timsk0] "i" ((uint16_t)&TIMSK0), \
181
+      [timsk1] "i" ((uint16_t)&TIMSK1), \
182
+      [msk0] "M" ((uint8_t)(1<<OCIE0B)),\
183
+      [msk1] "M" ((uint8_t)(1<<OCIE1A)) \
184
+    : \
185
+  ); \
186
+} \
187
+void TIMER1_COMPA_vect_bottom()
188
+
189
+#endif // HAL_STEP_TIMER_ISR
190
+
191
+#ifndef HAL_TEMP_TIMER_ISR
192
+
193
+/* 14 cycles maximum latency */
194
+#define HAL_TEMP_TIMER_ISR() \
195
+extern "C" void TIMER0_COMPB_vect() __attribute__ ((signal, naked, used, externally_visible)); \
196
+extern "C" void TIMER0_COMPB_vect_bottom()  asm ("TIMER0_COMPB_vect_bottom") __attribute__ ((used, externally_visible, noinline)); \
197
+void TIMER0_COMPB_vect() { \
198
+  __asm__ __volatile__ ( \
199
+    A("push r16")                       /* 2 Save R16 */ \
200
+    A("in r16, __SREG__")               /* 1 Get SREG */ \
201
+    A("push r16")                       /* 2 Save SREG into stack */ \
202
+    A("lds r16, %[timsk0]")             /* 2 Load into R0 the Temperature timer Interrupt mask register */ \
203
+    A("andi r16,~%[msk0]")              /* 1 Disable the temperature ISR */ \
204
+    A("sts %[timsk0], r16")             /* 2 And set the new value */ \
205
+    A("sei")                            /* 1 Enable global interrupts - It is safe, as the temperature ISR is disabled, so we cannot reenter it */    \
206
+    A("push r16")                       /* 2 Save TIMSK0 into stack */ \
207
+    A("in r16, 0x3B")                   /* 1 Get RAMPZ register */ \
208
+    A("push r16")                       /* 2 Save RAMPZ into stack */ \
209
+    A("in r16, 0x3C")                   /* 1 Get EIND register */ \
210
+    A("push r0")                        /* C runtime can modify all the following registers without restoring them */ \
211
+    A("push r1")                        \
212
+    A("push r18")                       \
213
+    A("push r19")                       \
214
+    A("push r20")                       \
215
+    A("push r21")                       \
216
+    A("push r22")                       \
217
+    A("push r23")                       \
218
+    A("push r24")                       \
219
+    A("push r25")                       \
220
+    A("push r26")                       \
221
+    A("push r27")                       \
222
+    A("push r30")                       \
223
+    A("push r31")                       \
224
+    A("clr r1")                         /* C runtime expects this register to be 0 */ \
225
+    A("call TIMER0_COMPB_vect_bottom")  /* Call the bottom handler - No inlining allowed, otherwise registers used are not saved */   \
226
+    A("pop r31")                        \
227
+    A("pop r30")                        \
228
+    A("pop r27")                        \
229
+    A("pop r26")                        \
230
+    A("pop r25")                        \
231
+    A("pop r24")                        \
232
+    A("pop r23")                        \
233
+    A("pop r22")                        \
234
+    A("pop r21")                        \
235
+    A("pop r20")                        \
236
+    A("pop r19")                        \
237
+    A("pop r18")                        \
238
+    A("pop r1")                         \
239
+    A("pop r0")                         \
240
+    A("out 0x3C, r16")                  /* 1 Restore EIND register */ \
241
+    A("pop r16")                        /* 2 Get the original RAMPZ register value */ \
242
+    A("out 0x3B, r16")                  /* 1 Restore RAMPZ register to its original value */ \
243
+    A("pop r16")                        /* 2 Get the original TIMSK0 value but with temperature ISR disabled */ \
244
+    A("ori r16,%[msk0]")                /* 1 Enable temperature ISR */ \
245
+    A("cli")                            /* 1 Disable global interrupts - We must do this, as we will reenable the temperature ISR, and we don't want to reenter this handler until the current one is done */ \
246
+    A("sts %[timsk0], r16")             /* 2 And restore the old value */ \
247
+    A("pop r16")                        /* 2 Get the old SREG */ \
248
+    A("out __SREG__, r16")              /* 1 And restore the SREG value */ \
249
+    A("pop r16")                        /* 2 Restore R16 */ \
250
+    A("reti")                           /* 4 Return from interrupt */ \
251
+    :                                   \
252
+    : [timsk0] "i"((uint16_t)&TIMSK0),  \
253
+      [msk0] "M" ((uint8_t)(1<<OCIE0B)) \
254
+    : \
255
+  ); \
256
+} \
257
+void TIMER0_COMPB_vect_bottom()
258
+
259
+#endif // HAL_TEMP_TIMER_ISR

+ 0
- 1
Marlin/src/HAL/DUE/HAL.h View File

@@ -35,7 +35,6 @@
35 35
 #include "../shared/HAL_SPI.h"
36 36
 #include "fastio.h"
37 37
 #include "watchdog.h"
38
-#include "timers.h"
39 38
 
40 39
 #include <stdint.h>
41 40
 

+ 0
- 1
Marlin/src/HAL/DUE/Tone.cpp View File

@@ -31,7 +31,6 @@
31 31
 
32 32
 #include "../../inc/MarlinConfig.h"
33 33
 #include "HAL.h"
34
-#include "timers.h"
35 34
 
36 35
 static pin_t tone_pin;
37 36
 volatile static int32_t toggles;

+ 0
- 2
Marlin/src/HAL/DUE/timers.cpp View File

@@ -34,8 +34,6 @@
34 34
 #include "../../inc/MarlinConfig.h"
35 35
 #include "HAL.h"
36 36
 
37
-#include "timers.h"
38
-
39 37
 // ------------------------
40 38
 // Local defines
41 39
 // ------------------------

+ 16
- 6
Marlin/src/HAL/DUE/timers.h View File

@@ -40,11 +40,17 @@ typedef uint32_t hal_timer_t;
40 40
 #define HAL_TIMER_RATE         ((F_CPU) / 2)    // frequency of timers peripherals
41 41
 
42 42
 #ifndef STEP_TIMER_NUM
43
-#define STEP_TIMER_NUM 2  // index of timer to use for stepper
43
+  #define STEP_TIMER_NUM        2  // Timer Index for Stepper
44
+#endif
45
+#ifndef PULSE_TIMER_NUM
46
+  #define PULSE_TIMER_NUM       STEP_TIMER_NUM
47
+#endif
48
+#ifndef TEMP_TIMER_NUM
49
+  #define TEMP_TIMER_NUM        4  // Timer Index for Temperature
50
+#endif
51
+#ifndef TONE_TIMER_NUM
52
+  #define TONE_TIMER_NUM        6  // index of timer to use for beeper tones
44 53
 #endif
45
-#define TEMP_TIMER_NUM 4  // index of timer to use for temperature
46
-#define PULSE_TIMER_NUM STEP_TIMER_NUM
47
-#define TONE_TIMER_NUM 6  // index of timer to use for beeper tones
48 54
 
49 55
 #define TEMP_TIMER_FREQUENCY   1000 // temperature interrupt frequency
50 56
 
@@ -66,8 +72,12 @@ typedef uint32_t hal_timer_t;
66 72
 #ifndef HAL_STEP_TIMER_ISR
67 73
   #define HAL_STEP_TIMER_ISR() void TC2_Handler()
68 74
 #endif
69
-#define HAL_TEMP_TIMER_ISR()  void TC4_Handler()
70
-#define HAL_TONE_TIMER_ISR()  void TC6_Handler()
75
+#ifndef HAL_TEMP_TIMER_ISR
76
+  #define HAL_TEMP_TIMER_ISR() void TC4_Handler()
77
+#endif
78
+#ifndef HAL_TONE_TIMER_ISR
79
+  #define HAL_TONE_TIMER_ISR() void TC6_Handler()
80
+#endif
71 81
 
72 82
 // ------------------------
73 83
 // Types

+ 2
- 4
Marlin/src/HAL/ESP32/HAL.cpp View File

@@ -21,15 +21,13 @@
21 21
  */
22 22
 #ifdef ARDUINO_ARCH_ESP32
23 23
 
24
-#include "HAL.h"
25
-#include "timers.h"
24
+#include "../../inc/MarlinConfig.h"
25
+
26 26
 #include <rom/rtc.h>
27 27
 #include <driver/adc.h>
28 28
 #include <esp_adc_cal.h>
29 29
 #include <HardwareSerial.h>
30 30
 
31
-#include "../../inc/MarlinConfigPre.h"
32
-
33 31
 #if ENABLED(WIFISUPPORT)
34 32
   #include <ESPAsyncWebServer.h>
35 33
   #include "wifi.h"

+ 0
- 2
Marlin/src/HAL/ESP32/HAL.h View File

@@ -34,8 +34,6 @@
34 34
 #include "watchdog.h"
35 35
 #include "i2s.h"
36 36
 
37
-#include "timers.h"
38
-
39 37
 #if ENABLED(WIFISUPPORT)
40 38
   #include "WebSocketSerial.h"
41 39
 #endif

+ 3
- 4
Marlin/src/HAL/ESP32/HAL_SPI.cpp View File

@@ -22,14 +22,13 @@
22 22
  */
23 23
 #ifdef ARDUINO_ARCH_ESP32
24 24
 
25
-#include "HAL.h"
25
+#include "../../inc/MarlinConfig.h"
26
+
26 27
 #include "../shared/HAL_SPI.h"
28
+
27 29
 #include <pins_arduino.h>
28
-#include "spi_pins.h"
29 30
 #include <SPI.h>
30 31
 
31
-#include "../../core/macros.h"
32
-
33 32
 // ------------------------
34 33
 // Public Variables
35 34
 // ------------------------

+ 1
- 3
Marlin/src/HAL/ESP32/timers.cpp View File

@@ -27,9 +27,7 @@
27 27
 #include <driver/periph_ctrl.h>
28 28
 #include <driver/timer.h>
29 29
 
30
-#include "HAL.h"
31
-
32
-#include "timers.h"
30
+#include "../../inc/MarlinConfig.h"
33 31
 
34 32
 // ------------------------
35 33
 // Local defines

+ 21
- 7
Marlin/src/HAL/ESP32/timers.h View File

@@ -38,10 +38,18 @@
38 38
 typedef uint64_t hal_timer_t;
39 39
 #define HAL_TIMER_TYPE_MAX 0xFFFFFFFFFFFFFFFFULL
40 40
 
41
-#define STEP_TIMER_NUM 0  // index of timer to use for stepper
42
-#define TEMP_TIMER_NUM 1  // index of timer to use for temperature
43
-#define PWM_TIMER_NUM  2  // index of timer to use for PWM outputs
44
-#define PULSE_TIMER_NUM STEP_TIMER_NUM
41
+#ifndef STEP_TIMER_NUM
42
+  #define STEP_TIMER_NUM        0  // Timer Index for Stepper
43
+#endif
44
+#ifndef PULSE_TIMER_NUM
45
+  #define PULSE_TIMER_NUM       STEP_TIMER_NUM
46
+#endif
47
+#ifndef TEMP_TIMER_NUM
48
+  #define TEMP_TIMER_NUM        1  // Timer Index for Temperature
49
+#endif
50
+#ifndef PWM_TIMER_NUM
51
+  #define PWM_TIMER_NUM         2  // index of timer to use for PWM outputs
52
+#endif
45 53
 
46 54
 #define HAL_TIMER_RATE APB_CLK_FREQ // frequency of timer peripherals
47 55
 
@@ -79,9 +87,15 @@ typedef uint64_t hal_timer_t;
79 87
 #define ENABLE_TEMPERATURE_INTERRUPT()  HAL_timer_enable_interrupt(TEMP_TIMER_NUM)
80 88
 #define DISABLE_TEMPERATURE_INTERRUPT() HAL_timer_disable_interrupt(TEMP_TIMER_NUM)
81 89
 
82
-#define HAL_TEMP_TIMER_ISR() extern "C" void tempTC_Handler()
83
-#define HAL_STEP_TIMER_ISR() extern "C" void stepTC_Handler()
84
-#define HAL_PWM_TIMER_ISR() extern "C" void pwmTC_Handler()
90
+#ifndef HAL_TEMP_TIMER_ISR
91
+  #define HAL_TEMP_TIMER_ISR() extern "C" void tempTC_Handler()
92
+#endif
93
+#ifndef HAL_STEP_TIMER_ISR
94
+  #define HAL_STEP_TIMER_ISR() extern "C" void stepTC_Handler()
95
+#endif
96
+#ifndef HAL_PWM_TIMER_ISR
97
+  #define HAL_PWM_TIMER_ISR() extern "C" void pwmTC_Handler()
98
+#endif
85 99
 
86 100
 extern "C" void tempTC_Handler();
87 101
 extern "C" void stepTC_Handler();

+ 0
- 1
Marlin/src/HAL/LINUX/HAL.h View File

@@ -56,7 +56,6 @@ uint8_t _getc();
56 56
 #include "../shared/HAL_SPI.h"
57 57
 #include "fastio.h"
58 58
 #include "watchdog.h"
59
-#include "timers.h"
60 59
 #include "serial.h"
61 60
 
62 61
 #define SHARED_SERVOS HAS_SERVOS

+ 0
- 1
Marlin/src/HAL/LINUX/timers.cpp View File

@@ -24,7 +24,6 @@
24 24
 #include "hardware/Timer.h"
25 25
 
26 26
 #include "../../inc/MarlinConfig.h"
27
-#include "timers.h"
28 27
 
29 28
 /**
30 29
  * Use POSIX signals to attempt to emulate Interrupts

+ 15
- 5
Marlin/src/HAL/LINUX/timers.h View File

@@ -37,9 +37,15 @@ typedef uint32_t hal_timer_t;
37 37
 
38 38
 #define HAL_TIMER_RATE         ((SystemCoreClock) / 4)  // frequency of timers peripherals
39 39
 
40
-#define STEP_TIMER_NUM 0  // Timer Index for Stepper
41
-#define TEMP_TIMER_NUM 1  // Timer Index for Temperature
42
-#define PULSE_TIMER_NUM STEP_TIMER_NUM
40
+#ifndef STEP_TIMER_NUM
41
+  #define STEP_TIMER_NUM        0  // Timer Index for Stepper
42
+#endif
43
+#ifndef PULSE_TIMER_NUM
44
+  #define PULSE_TIMER_NUM       STEP_TIMER_NUM
45
+#endif
46
+#ifndef TEMP_TIMER_NUM
47
+  #define TEMP_TIMER_NUM        1  // Timer Index for Temperature
48
+#endif
43 49
 
44 50
 #define TEMP_TIMER_RATE        1000000
45 51
 #define TEMP_TIMER_FREQUENCY   1000 // temperature interrupt frequency
@@ -59,8 +65,12 @@ typedef uint32_t hal_timer_t;
59 65
 #define ENABLE_TEMPERATURE_INTERRUPT() HAL_timer_enable_interrupt(TEMP_TIMER_NUM)
60 66
 #define DISABLE_TEMPERATURE_INTERRUPT() HAL_timer_disable_interrupt(TEMP_TIMER_NUM)
61 67
 
62
-#define HAL_STEP_TIMER_ISR()  extern "C" void TIMER0_IRQHandler()
63
-#define HAL_TEMP_TIMER_ISR()  extern "C" void TIMER1_IRQHandler()
68
+#ifndef HAL_STEP_TIMER_ISR
69
+  #define HAL_STEP_TIMER_ISR()  extern "C" void TIMER0_IRQHandler()
70
+#endif
71
+#ifndef HAL_TEMP_TIMER_ISR
72
+  #define HAL_TEMP_TIMER_ISR()  extern "C" void TIMER1_IRQHandler()
73
+#endif
64 74
 
65 75
 // PWM timer
66 76
 #define HAL_PWM_TIMER

+ 0
- 1
Marlin/src/HAL/LPC1768/HAL.h View File

@@ -41,7 +41,6 @@ extern "C" volatile uint32_t _millis;
41 41
 #include "../shared/HAL_SPI.h"
42 42
 #include "fastio.h"
43 43
 #include "watchdog.h"
44
-#include "timers.h"
45 44
 #include "MarlinSerial.h"
46 45
 
47 46
 #include <adc.h>

+ 0
- 2
Marlin/src/HAL/LPC1768/main.cpp View File

@@ -38,8 +38,6 @@ extern "C" {
38 38
 #include "../../sd/cardreader.h"
39 39
 #include "../../inc/MarlinConfig.h"
40 40
 #include "../../core/millis_t.h"
41
-#include "HAL.h"
42
-#include "timers.h"
43 41
 
44 42
 extern uint32_t MSC_SD_Init(uint8_t pdrv);
45 43
 extern "C" int isLPC1769();

+ 0
- 1
Marlin/src/HAL/LPC1768/timers.cpp View File

@@ -29,7 +29,6 @@
29 29
 #ifdef TARGET_LPC1768
30 30
 
31 31
 #include "../../inc/MarlinConfig.h"
32
-#include "timers.h"
33 32
 
34 33
 void HAL_timer_init() {
35 34
   SBI(LPC_SC->PCONP, SBIT_TIMER0);  // Power ON Timer 0

+ 18
- 6
Marlin/src/HAL/LPC1768/timers.h View File

@@ -61,10 +61,18 @@ typedef uint32_t hal_timer_t;
61 61
 
62 62
 #define HAL_TIMER_RATE         ((F_CPU) / 4)  // frequency of timers peripherals
63 63
 
64
-#define STEP_TIMER_NUM 0  // Timer Index for Stepper
65
-#define TEMP_TIMER_NUM 1  // Timer Index for Temperature
66
-#define PULSE_TIMER_NUM STEP_TIMER_NUM
67
-#define PWM_TIMER_NUM 3   // Timer Index for PWM
64
+#ifndef STEP_TIMER_NUM
65
+  #define STEP_TIMER_NUM        0  // Timer Index for Stepper
66
+#endif
67
+#ifndef PULSE_TIMER_NUM
68
+  #define PULSE_TIMER_NUM       STEP_TIMER_NUM
69
+#endif
70
+#ifndef TEMP_TIMER_NUM
71
+  #define TEMP_TIMER_NUM        1  // Timer Index for Temperature
72
+#endif
73
+#ifndef PWM_TIMER_NUM
74
+  #define PWM_TIMER_NUM         3  // Timer Index for PWM
75
+#endif
68 76
 
69 77
 #define TEMP_TIMER_RATE        1000000
70 78
 #define TEMP_TIMER_FREQUENCY   1000 // temperature interrupt frequency
@@ -84,8 +92,12 @@ typedef uint32_t hal_timer_t;
84 92
 #define ENABLE_TEMPERATURE_INTERRUPT() HAL_timer_enable_interrupt(TEMP_TIMER_NUM)
85 93
 #define DISABLE_TEMPERATURE_INTERRUPT() HAL_timer_disable_interrupt(TEMP_TIMER_NUM)
86 94
 
87
-#define HAL_STEP_TIMER_ISR() _HAL_TIMER_ISR(STEP_TIMER_NUM)
88
-#define HAL_TEMP_TIMER_ISR() _HAL_TIMER_ISR(TEMP_TIMER_NUM)
95
+#ifndef HAL_STEP_TIMER_ISR
96
+  #define HAL_STEP_TIMER_ISR() _HAL_TIMER_ISR(STEP_TIMER_NUM)
97
+#endif
98
+#ifndef HAL_TEMP_TIMER_ISR
99
+  #define HAL_TEMP_TIMER_ISR() _HAL_TIMER_ISR(TEMP_TIMER_NUM)
100
+#endif
89 101
 
90 102
 // Timer references by index
91 103
 #define STEP_TIMER_PTR _HAL_TIMER(STEP_TIMER_NUM)

+ 0
- 1
Marlin/src/HAL/SAMD51/HAL.h View File

@@ -27,7 +27,6 @@
27 27
 #include "../shared/HAL_SPI.h"
28 28
 #include "fastio.h"
29 29
 #include "watchdog.h"
30
-#include "timers.h"
31 30
 
32 31
 #ifdef ADAFRUIT_GRAND_CENTRAL_M4
33 32
   #include "MarlinSerial_AGCM4.h"

+ 0
- 1
Marlin/src/HAL/SAMD51/Servo.cpp View File

@@ -32,7 +32,6 @@
32 32
 #include "../shared/servo.h"
33 33
 #include "../shared/servo_private.h"
34 34
 #include "SAMD51.h"
35
-#include "timers.h"
36 35
 
37 36
 #define __TC_GCLK_ID(t)         TC##t##_GCLK_ID
38 37
 #define _TC_GCLK_ID(t)          __TC_GCLK_ID(t)

+ 0
- 1
Marlin/src/HAL/SAMD51/timers.cpp View File

@@ -24,7 +24,6 @@
24 24
 // Includes
25 25
 // --------------------------------------------------------------------------
26 26
 #include "../../inc/MarlinConfig.h"
27
-#include "timers.h"
28 27
 
29 28
 // --------------------------------------------------------------------------
30 29
 // Local defines

+ 17
- 9
Marlin/src/HAL/SAMD51/timers.h View File

@@ -32,9 +32,15 @@ typedef uint32_t hal_timer_t;
32 32
 
33 33
 #define HAL_TIMER_RATE      F_CPU   // frequency of timers peripherals
34 34
 
35
-#define STEP_TIMER_NUM      0  // index of timer to use for stepper (also +1 for 32bits counter)
36
-#define PULSE_TIMER_NUM     STEP_TIMER_NUM
37
-#define TEMP_TIMER_NUM      RTC_TIMER_NUM  // index of timer to use for temperature
35
+#ifndef STEP_TIMER_NUM
36
+  #define STEP_TIMER_NUM        0  // Timer Index for Stepper
37
+#endif
38
+#ifndef PULSE_TIMER_NUM
39
+  #define PULSE_TIMER_NUM       STEP_TIMER_NUM
40
+#endif
41
+#ifndef TEMP_TIMER_NUM
42
+  #define TEMP_TIMER_NUM        RTC_TIMER_NUM // Timer Index for Temperature
43
+#endif
38 44
 
39 45
 #define TEMP_TIMER_FREQUENCY   1000 // temperature interrupt frequency
40 46
 
@@ -57,16 +63,18 @@ typedef uint32_t hal_timer_t;
57 63
                                : (t == TEMP_TIMER_NUM) ? 6                        \
58 64
                                : 7
59 65
 
60
-#define _TC_HANDLER(t)            void TC##t##_Handler()
61
-#define TC_HANDLER(t)             _TC_HANDLER(t)
62
-#define HAL_STEP_TIMER_ISR()      TC_HANDLER(STEP_TIMER_NUM)
66
+#define _TC_HANDLER(t)          void TC##t##_Handler()
67
+#define TC_HANDLER(t)           _TC_HANDLER(t)
68
+#ifndef HAL_STEP_TIMER_ISR
69
+  #define HAL_STEP_TIMER_ISR()  TC_HANDLER(STEP_TIMER_NUM)
70
+#endif
63 71
 #if STEP_TIMER_NUM != PULSE_TIMER_NUM
64
-  #define HAL_PULSE_TIMER_ISR()   TC_HANDLER(PULSE_TIMER_NUM)
72
+  #define HAL_PULSE_TIMER_ISR() TC_HANDLER(PULSE_TIMER_NUM)
65 73
 #endif
66 74
 #if TEMP_TIMER_NUM == RTC_TIMER_NUM
67
-  #define HAL_TEMP_TIMER_ISR()    void RTC_Handler()
75
+  #define HAL_TEMP_TIMER_ISR()  void RTC_Handler()
68 76
 #else
69
-  #define HAL_TEMP_TIMER_ISR()    TC_HANDLER(TEMP_TIMER_NUM)
77
+  #define HAL_TEMP_TIMER_ISR()  TC_HANDLER(TEMP_TIMER_NUM)
70 78
 #endif
71 79
 
72 80
 // --------------------------------------------------------------------------

+ 0
- 1
Marlin/src/HAL/STM32/HAL.h View File

@@ -119,7 +119,6 @@
119 119
   #define DGUS_SERIAL_GET_TX_BUFFER_FREE DGUS_SERIAL.availableForWrite
120 120
 #endif
121 121
 
122
-#include "timers.h"
123 122
 
124 123
 /**
125 124
  * TODO: review this to return 1 for pins that are not analog input

+ 2
- 1
Marlin/src/HAL/STM32/SoftwareSerial.cpp View File

@@ -36,8 +36,9 @@
36 36
 //
37 37
 #if defined(PLATFORMIO) && defined(ARDUINO_ARCH_STM32) && !defined(STM32GENERIC)
38 38
 
39
+#include "../../inc/MarlinConfig.h"
40
+
39 41
 #include "SoftwareSerial.h"
40
-#include "timers.h"
41 42
 
42 43
 #define OVERSAMPLE 3 // in RX, Timer will generate interruption OVERSAMPLE time during a bit. Thus OVERSAMPLE ticks in a bit. (interrupt not synchonized with edge).
43 44
 

+ 0
- 2
Marlin/src/HAL/STM32/timers.cpp View File

@@ -21,8 +21,6 @@
21 21
  */
22 22
 #if defined(ARDUINO_ARCH_STM32) && !defined(STM32GENERIC)
23 23
 
24
-#include "timers.h"
25
-
26 24
 #include "../../inc/MarlinConfig.h"
27 25
 
28 26
 // ------------------------

+ 16
- 5
Marlin/src/HAL/STM32/timers.h View File

@@ -33,9 +33,15 @@
33 33
 #define hal_timer_t uint32_t
34 34
 #define HAL_TIMER_TYPE_MAX 0xFFFFFFFF // Timers can be 16 or 32 bit
35 35
 
36
-#define STEP_TIMER_NUM 0  // index of timer to use for stepper
37
-#define TEMP_TIMER_NUM 1  // index of timer to use for temperature
38
-#define PULSE_TIMER_NUM STEP_TIMER_NUM
36
+#ifndef STEP_TIMER_NUM
37
+  #define STEP_TIMER_NUM        0  // Timer Index for Stepper
38
+#endif
39
+#ifndef PULSE_TIMER_NUM
40
+  #define PULSE_TIMER_NUM       STEP_TIMER_NUM
41
+#endif
42
+#ifndef TEMP_TIMER_NUM
43
+  #define TEMP_TIMER_NUM        1  // Timer Index for Temperature
44
+#endif
39 45
 
40 46
 #define TEMP_TIMER_FREQUENCY 1000   // Temperature::isr() is expected to be called at around 1kHz
41 47
 
@@ -57,8 +63,13 @@
57 63
 
58 64
 extern void Step_Handler(HardwareTimer *htim);
59 65
 extern void Temp_Handler(HardwareTimer *htim);
60
-#define HAL_STEP_TIMER_ISR() void Step_Handler(HardwareTimer *htim)
61
-#define HAL_TEMP_TIMER_ISR() void Temp_Handler(HardwareTimer *htim)
66
+
67
+#ifndef HAL_STEP_TIMER_ISR
68
+  #define HAL_STEP_TIMER_ISR() void Step_Handler(HardwareTimer *htim)
69
+#endif
70
+#ifndef HAL_TEMP_TIMER_ISR
71
+  #define HAL_TEMP_TIMER_ISR() void Temp_Handler(HardwareTimer *htim)
72
+#endif
62 73
 
63 74
 // ------------------------
64 75
 // Public Variables

+ 0
- 1
Marlin/src/HAL/STM32F1/HAL.h View File

@@ -36,7 +36,6 @@
36 36
 #include "fastio.h"
37 37
 #include "watchdog.h"
38 38
 
39
-#include "timers.h"
40 39
 
41 40
 #include <stdint.h>
42 41
 #include <util/atomic.h>

+ 0
- 1
Marlin/src/HAL/STM32F1/Servo.cpp View File

@@ -29,7 +29,6 @@
29 29
 uint8_t ServoCount = 0;
30 30
 
31 31
 #include "Servo.h"
32
-#include "timers.h"
33 32
 
34 33
 //#include "Servo.h"
35 34
 

+ 0
- 2
Marlin/src/HAL/STM32F1/timers.cpp View File

@@ -27,8 +27,6 @@
27 27
 #ifdef __STM32F1__
28 28
 
29 29
 #include "../../inc/MarlinConfig.h"
30
-#include "HAL.h"
31
-#include "timers.h"
32 30
 
33 31
 // ------------------------
34 32
 // Local defines

+ 19
- 9
Marlin/src/HAL/STM32F1/timers.h View File

@@ -61,14 +61,20 @@ typedef uint16_t hal_timer_t;
61 61
  *   - Otherwise it uses Timer 8 on boards with STM32_HIGH_DENSITY
62 62
  *     or Timer 4 on other boards.
63 63
  */
64
-#if defined(MCU_STM32F103CB) || defined(MCU_STM32F103C8)
65
-  #define STEP_TIMER_NUM 4 // For C8/CB boards, use timer 4
66
-#else
67
-  #define STEP_TIMER_NUM 5 // for other boards, five is fine.
64
+#ifndef STEP_TIMER_NUM
65
+  #if defined(MCU_STM32F103CB) || defined(MCU_STM32F103C8)
66
+    #define STEP_TIMER_NUM      4  // For C8/CB boards, use timer 4
67
+  #else
68
+    #define STEP_TIMER_NUM      5  // for other boards, five is fine.
69
+  #endif
70
+#endif
71
+#ifndef PULSE_TIMER_NUM
72
+  #define PULSE_TIMER_NUM       STEP_TIMER_NUM
73
+#endif
74
+#ifndef TEMP_TIMER_NUM
75
+  #define TEMP_TIMER_NUM        2  // Timer Index for Temperature
76
+  //#define TEMP_TIMER_NUM      4  // 2->4, Timer 2 for Stepper Current PWM
68 77
 #endif
69
-#define TEMP_TIMER_NUM 2    // index of timer to use for temperature
70
-//#define TEMP_TIMER_NUM 4  // 2->4, Timer 2 for Stepper Current PWM
71
-#define PULSE_TIMER_NUM STEP_TIMER_NUM
72 78
 
73 79
 #if MB(BTT_SKR_MINI_E3_V1_0, BTT_SKR_E3_DIP, BTT_SKR_MINI_E3_V1_2, MKS_ROBIN_LITE)
74 80
   // SKR Mini E3 boards use PA8 as FAN_PIN, so TIMER 1 is used for Fan PWM.
@@ -111,8 +117,12 @@ timer_dev* get_timer_dev(int number);
111 117
 
112 118
 // TODO change this
113 119
 
114
-#define HAL_TEMP_TIMER_ISR() extern "C" void tempTC_Handler()
115
-#define HAL_STEP_TIMER_ISR() extern "C" void stepTC_Handler()
120
+#ifndef HAL_TEMP_TIMER_ISR
121
+  #define HAL_TEMP_TIMER_ISR() extern "C" void tempTC_Handler()
122
+#endif
123
+#ifndef HAL_STEP_TIMER_ISR
124
+  #define HAL_STEP_TIMER_ISR() extern "C" void stepTC_Handler()
125
+#endif
116 126
 
117 127
 extern "C" void tempTC_Handler();
118 128
 extern "C" void stepTC_Handler();

+ 0
- 1
Marlin/src/HAL/STM32_F4_F7/HAL.h View File

@@ -31,7 +31,6 @@
31 31
 #include "../shared/HAL_SPI.h"
32 32
 
33 33
 #include "fastio.h"
34
-#include "timers.h"
35 34
 #include "watchdog.h"
36 35
 
37 36
 #include <stdint.h>

+ 1
- 2
Marlin/src/HAL/STM32_F4_F7/STM32F4/timers.cpp View File

@@ -21,8 +21,7 @@
21 21
  */
22 22
 #if defined(STM32GENERIC) && defined(STM32F4)
23 23
 
24
-#include "../HAL.h"
25
-#include "timers.h"
24
+#include "../../../inc/MarlinConfig.h"
26 25
 
27 26
 // ------------------------
28 27
 // Local defines

+ 19
- 11
Marlin/src/HAL/STM32_F4_F7/STM32F4/timers.h View File

@@ -34,9 +34,15 @@
34 34
 
35 35
 #define HAL_TIMER_RATE         (HAL_RCC_GetSysClockFreq() / 2)  // frequency of timer peripherals
36 36
 
37
-#define STEP_TIMER_NUM 0  // index of timer to use for stepper
38
-#define TEMP_TIMER_NUM 1  // index of timer to use for temperature
39
-#define PULSE_TIMER_NUM STEP_TIMER_NUM
37
+#ifndef STEP_TIMER_NUM
38
+  #define STEP_TIMER_NUM        0  // Timer Index for Stepper
39
+#endif
40
+#ifndef PULSE_TIMER_NUM
41
+  #define PULSE_TIMER_NUM       STEP_TIMER_NUM
42
+#endif
43
+#ifndef TEMP_TIMER_NUM
44
+  #define TEMP_TIMER_NUM        1  // Timer Index for Temperature
45
+#endif
40 46
 
41 47
 #define TEMP_TIMER_PRESCALE     1000 // prescaler for setting Temp timer, 72Khz
42 48
 #define TEMP_TIMER_FREQUENCY    1000 // temperature interrupt frequency
@@ -59,17 +65,19 @@
59 65
 // TODO change this
60 66
 
61 67
 #ifdef STM32GENERIC
62
-  extern void TC5_Handler();
63
-  extern void TC7_Handler();
64
-  #define HAL_STEP_TIMER_ISR() void TC5_Handler()
65
-  #define HAL_TEMP_TIMER_ISR() void TC7_Handler()
68
+  #define TC_TIMER_ARGS
66 69
 #else
67
-  extern void TC5_Handler(stimer_t *htim);
68
-  extern void TC7_Handler(stimer_t *htim);
69
-  #define HAL_STEP_TIMER_ISR() void TC5_Handler(stimer_t *htim)
70
-  #define HAL_TEMP_TIMER_ISR() void TC7_Handler(stimer_t *htim)
70
+  #define TC_TIMER_ARGS stimer_t *htim
71 71
 #endif
72 72
 
73
+extern void TC5_Handler(TC_TIMER_ARGS);
74
+extern void TC7_Handler(TC_TIMER_ARGS);
75
+#ifndef HAL_STEP_TIMER_ISR
76
+  #define HAL_STEP_TIMER_ISR() void TC5_Handler(TC_TIMER_ARGS)
77
+#endif
78
+#ifndef HAL_TEMP_TIMER_ISR
79
+  #define HAL_TEMP_TIMER_ISR() void TC7_Handler(TC_TIMER_ARGS)
80
+#endif
73 81
 
74 82
 // ------------------------
75 83
 // Types

+ 1
- 2
Marlin/src/HAL/STM32_F4_F7/STM32F7/timers.cpp View File

@@ -21,8 +21,7 @@
21 21
  */
22 22
 #if defined(STM32GENERIC) && defined(STM32F7)
23 23
 
24
-#include "../HAL.h"
25
-#include "timers.h"
24
+#include "../../../inc/MarlinConfig.h"
26 25
 
27 26
 // ------------------------
28 27
 // Local defines

+ 15
- 5
Marlin/src/HAL/STM32_F4_F7/STM32F7/timers.h View File

@@ -34,9 +34,15 @@
34 34
 
35 35
 #define HAL_TIMER_RATE         (HAL_RCC_GetSysClockFreq() / 2)  // frequency of timer peripherals
36 36
 
37
-#define STEP_TIMER_NUM 0  // index of timer to use for stepper
38
-#define TEMP_TIMER_NUM 1  // index of timer to use for temperature
39
-#define PULSE_TIMER_NUM STEP_TIMER_NUM
37
+#ifndef STEP_TIMER_NUM
38
+  #define STEP_TIMER_NUM        0  // Timer Index for Stepper
39
+#endif
40
+#ifndef PULSE_TIMER_NUM
41
+  #define PULSE_TIMER_NUM       STEP_TIMER_NUM
42
+#endif
43
+#ifndef TEMP_TIMER_NUM
44
+  #define TEMP_TIMER_NUM        1  // Timer Index for Temperature
45
+#endif
40 46
 
41 47
 #define TEMP_TIMER_FREQUENCY    1000 // temperature interrupt frequency
42 48
 #define TEMP_TIMER_PRESCALE     1000 // prescaler for setting Temp timer, 72Khz
@@ -62,8 +68,12 @@
62 68
 
63 69
 extern void TC5_Handler();
64 70
 extern void TC7_Handler();
65
-#define HAL_STEP_TIMER_ISR()  void TC5_Handler()
66
-#define HAL_TEMP_TIMER_ISR()  void TC7_Handler()
71
+#ifndef HAL_STEP_TIMER_ISR
72
+  #define HAL_STEP_TIMER_ISR()  void TC5_Handler()
73
+#endif
74
+#ifndef HAL_TEMP_TIMER_ISR
75
+  #define HAL_TEMP_TIMER_ISR()  void TC7_Handler()
76
+#endif
67 77
 
68 78
 // ------------------------
69 79
 // Types

+ 0
- 1
Marlin/src/HAL/TEENSY31_32/HAL.h View File

@@ -34,7 +34,6 @@
34 34
 #include "fastio.h"
35 35
 #include "watchdog.h"
36 36
 
37
-#include "timers.h"
38 37
 
39 38
 #include <stdint.h>
40 39
 

+ 1
- 2
Marlin/src/HAL/TEENSY31_32/timers.cpp View File

@@ -26,8 +26,7 @@
26 26
 
27 27
 #ifdef __MK20DX256__
28 28
 
29
-#include "HAL.h"
30
-#include "timers.h"
29
+#include "../../inc/MarlinConfig.h"
31 30
 
32 31
 /** \brief Instruction Synchronization Barrier
33 32
   Instruction Synchronization Barrier flushes the pipeline in the processor,

+ 15
- 5
Marlin/src/HAL/TEENSY31_32/timers.h View File

@@ -47,9 +47,15 @@ typedef uint32_t hal_timer_t;
47 47
 
48 48
 #define HAL_TIMER_RATE         (FTM0_TIMER_RATE)
49 49
 
50
-#define STEP_TIMER_NUM 0
51
-#define TEMP_TIMER_NUM 1
52
-#define PULSE_TIMER_NUM STEP_TIMER_NUM
50
+#ifndef STEP_TIMER_NUM
51
+  #define STEP_TIMER_NUM        0  // Timer Index for Stepper
52
+#endif
53
+#ifndef PULSE_TIMER_NUM
54
+  #define PULSE_TIMER_NUM       STEP_TIMER_NUM
55
+#endif
56
+#ifndef TEMP_TIMER_NUM
57
+  #define TEMP_TIMER_NUM        1  // Timer Index for Temperature
58
+#endif
53 59
 
54 60
 #define TEMP_TIMER_FREQUENCY    1000
55 61
 
@@ -68,8 +74,12 @@ typedef uint32_t hal_timer_t;
68 74
 #define ENABLE_TEMPERATURE_INTERRUPT() HAL_timer_enable_interrupt(TEMP_TIMER_NUM)
69 75
 #define DISABLE_TEMPERATURE_INTERRUPT() HAL_timer_disable_interrupt(TEMP_TIMER_NUM)
70 76
 
71
-#define HAL_STEP_TIMER_ISR()  extern "C" void ftm0_isr() //void TC3_Handler()
72
-#define HAL_TEMP_TIMER_ISR()  extern "C" void ftm1_isr() //void TC4_Handler()
77
+#ifndef HAL_STEP_TIMER_ISR
78
+  #define HAL_STEP_TIMER_ISR()  extern "C" void ftm0_isr() //void TC3_Handler()
79
+#endif
80
+#ifndef HAL_TEMP_TIMER_ISR
81
+  #define HAL_TEMP_TIMER_ISR()  extern "C" void ftm1_isr() //void TC4_Handler()
82
+#endif
73 83
 
74 84
 void HAL_timer_start(const uint8_t timer_num, const uint32_t frequency);
75 85
 

+ 0
- 2
Marlin/src/HAL/TEENSY35_36/HAL.h View File

@@ -34,8 +34,6 @@
34 34
 #include "fastio.h"
35 35
 #include "watchdog.h"
36 36
 
37
-#include "timers.h"
38
-
39 37
 #include <stdint.h>
40 38
 #include <util/atomic.h>
41 39
 

+ 1
- 2
Marlin/src/HAL/TEENSY35_36/timers.cpp View File

@@ -27,8 +27,7 @@
27 27
 
28 28
 #if defined(__MK64FX512__) || defined(__MK66FX1M0__)
29 29
 
30
-#include "HAL.h"
31
-#include "timers.h"
30
+#include "../../inc/MarlinConfig.h"
32 31
 
33 32
 /** \brief Instruction Synchronization Barrier
34 33
   Instruction Synchronization Barrier flushes the pipeline in the processor,

+ 15
- 5
Marlin/src/HAL/TEENSY35_36/timers.h View File

@@ -46,9 +46,15 @@ typedef uint32_t hal_timer_t;
46 46
 
47 47
 #define HAL_TIMER_RATE         (FTM0_TIMER_RATE)
48 48
 
49
-#define STEP_TIMER_NUM 0
50
-#define TEMP_TIMER_NUM 1
51
-#define PULSE_TIMER_NUM STEP_TIMER_NUM
49
+#ifndef STEP_TIMER_NUM
50
+  #define STEP_TIMER_NUM        0  // Timer Index for Stepper
51
+#endif
52
+#ifndef PULSE_TIMER_NUM
53
+  #define PULSE_TIMER_NUM       STEP_TIMER_NUM
54
+#endif
55
+#ifndef TEMP_TIMER_NUM
56
+  #define TEMP_TIMER_NUM        1  // Timer Index for Temperature
57
+#endif
52 58
 
53 59
 #define TEMP_TIMER_FREQUENCY    1000
54 60
 
@@ -67,8 +73,12 @@ typedef uint32_t hal_timer_t;
67 73
 #define ENABLE_TEMPERATURE_INTERRUPT() HAL_timer_enable_interrupt(TEMP_TIMER_NUM)
68 74
 #define DISABLE_TEMPERATURE_INTERRUPT() HAL_timer_disable_interrupt(TEMP_TIMER_NUM)
69 75
 
70
-#define HAL_STEP_TIMER_ISR()  extern "C" void ftm0_isr() //void TC3_Handler()
71
-#define HAL_TEMP_TIMER_ISR()  extern "C" void ftm1_isr() //void TC4_Handler()
76
+#ifndef HAL_STEP_TIMER_ISR
77
+  #define HAL_STEP_TIMER_ISR()  extern "C" void ftm0_isr() //void TC3_Handler()
78
+#endif
79
+#ifndef HAL_TEMP_TIMER_ISR
80
+  #define HAL_TEMP_TIMER_ISR()  extern "C" void ftm1_isr() //void TC4_Handler()
81
+#endif
72 82
 
73 83
 void HAL_timer_start(const uint8_t timer_num, const uint32_t frequency);
74 84
 

+ 1
- 0
Marlin/src/inc/MarlinConfig.h View File

@@ -30,6 +30,7 @@
30 30
 #include "../HAL/HAL.h"
31 31
 
32 32
 #include "../pins/pins.h"
33
+#include HAL_PATH(../HAL, timers.h)
33 34
 #include HAL_PATH(../HAL, spi_pins.h)
34 35
 
35 36
 #include "Conditionals_post.h"

+ 1
- 0
Marlin/src/pins/sam/pins_ARCHIM1.h View File

@@ -46,6 +46,7 @@
46 46
 //
47 47
 // Timers
48 48
 //
49
+// These are already defined in DUE, so must be undefined first
49 50
 #define STEP_TIMER_NUM                         3
50 51
 #define HAL_STEP_TIMER_ISR()  void TC3_Handler()
51 52
 

Loading…
Cancel
Save