Browse Source

Increase STM32F1 Servo Timer Interrupt Priority (#18637)

Jason Smith 5 years ago
parent
commit
95b76a65c3
No account linked to committer's email address

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

74
 
74
 
75
 libServo::libServo() {
75
 libServo::libServo() {
76
   servoIndex = ServoCount < MAX_SERVOS ? ServoCount++ : INVALID_SERVO;
76
   servoIndex = ServoCount < MAX_SERVOS ? ServoCount++ : INVALID_SERVO;
77
+  timer_set_interrupt_priority(SERVO0_TIMER_NUM, SERVO0_TIMER_IRQ_PRIO);
77
 }
78
 }
78
 
79
 
79
 bool libServo::attach(const int32_t inPin, const int32_t inMinAngle, const int32_t inMaxAngle) {
80
 bool libServo::attach(const int32_t inPin, const int32_t inMinAngle, const int32_t inMaxAngle) {

+ 12
- 4
Marlin/src/HAL/STM32F1/timers.cpp View File

47
  * TODO: Calculate Timer prescale value, so we get the 32bit to adjust
47
  * TODO: Calculate Timer prescale value, so we get the 32bit to adjust
48
  */
48
  */
49
 
49
 
50
-void HAL_timer_start(const uint8_t timer_num, const uint32_t frequency) {
50
+
51
+
52
+
53
+void timer_set_interrupt_priority(uint_fast8_t timer_num, uint_fast8_t priority) {
51
   nvic_irq_num irq_num;
54
   nvic_irq_num irq_num;
52
   switch (timer_num) {
55
   switch (timer_num) {
53
     case 1: irq_num = NVIC_TIMER1_CC; break;
56
     case 1: irq_num = NVIC_TIMER1_CC; break;
64
        * This should never happen. Add a Sanitycheck for timer number.
67
        * This should never happen. Add a Sanitycheck for timer number.
65
        * Should be a general timer since basic timers have no CC channels.
68
        * Should be a general timer since basic timers have no CC channels.
66
        */
69
        */
67
-      break;
70
+      return;
68
   }
71
   }
69
 
72
 
73
+  nvic_irq_set_priority(irq_num, priority);
74
+}
75
+
76
+
77
+void HAL_timer_start(const uint8_t timer_num, const uint32_t frequency) {
70
   /**
78
   /**
71
    * Give the Stepper ISR a higher priority (lower number)
79
    * Give the Stepper ISR a higher priority (lower number)
72
    * so it automatically preempts the Temperature ISR.
80
    * so it automatically preempts the Temperature ISR.
83
       timer_set_compare(STEP_TIMER_DEV, STEP_TIMER_CHAN, _MIN(hal_timer_t(HAL_TIMER_TYPE_MAX), (STEPPER_TIMER_RATE) / frequency));
91
       timer_set_compare(STEP_TIMER_DEV, STEP_TIMER_CHAN, _MIN(hal_timer_t(HAL_TIMER_TYPE_MAX), (STEPPER_TIMER_RATE) / frequency));
84
       timer_no_ARR_preload_ARPE(STEP_TIMER_DEV); // Need to be sure no preload on ARR register
92
       timer_no_ARR_preload_ARPE(STEP_TIMER_DEV); // Need to be sure no preload on ARR register
85
       timer_attach_interrupt(STEP_TIMER_DEV, STEP_TIMER_CHAN, stepTC_Handler);
93
       timer_attach_interrupt(STEP_TIMER_DEV, STEP_TIMER_CHAN, stepTC_Handler);
86
-      nvic_irq_set_priority(irq_num, STEP_TIMER_IRQ_PRIO);
94
+      timer_set_interrupt_priority(STEP_TIMER_NUM, STEP_TIMER_IRQ_PRIO);
87
       timer_generate_update(STEP_TIMER_DEV);
95
       timer_generate_update(STEP_TIMER_DEV);
88
       timer_resume(STEP_TIMER_DEV);
96
       timer_resume(STEP_TIMER_DEV);
89
       break;
97
       break;
95
       timer_set_reload(TEMP_TIMER_DEV, 0xFFFF);
103
       timer_set_reload(TEMP_TIMER_DEV, 0xFFFF);
96
       timer_set_compare(TEMP_TIMER_DEV, TEMP_TIMER_CHAN, _MIN(hal_timer_t(HAL_TIMER_TYPE_MAX), (F_CPU) / (TEMP_TIMER_PRESCALE) / frequency));
104
       timer_set_compare(TEMP_TIMER_DEV, TEMP_TIMER_CHAN, _MIN(hal_timer_t(HAL_TIMER_TYPE_MAX), (F_CPU) / (TEMP_TIMER_PRESCALE) / frequency));
97
       timer_attach_interrupt(TEMP_TIMER_DEV, TEMP_TIMER_CHAN, tempTC_Handler);
105
       timer_attach_interrupt(TEMP_TIMER_DEV, TEMP_TIMER_CHAN, tempTC_Handler);
98
-      nvic_irq_set_priority(irq_num, TEMP_TIMER_IRQ_PRIO);
106
+      timer_set_interrupt_priority(TEMP_TIMER_NUM, TEMP_TIMER_IRQ_PRIO);
99
       timer_generate_update(TEMP_TIMER_DEV);
107
       timer_generate_update(TEMP_TIMER_DEV);
100
       timer_resume(TEMP_TIMER_DEV);
108
       timer_resume(TEMP_TIMER_DEV);
101
       break;
109
       break;

+ 5
- 2
Marlin/src/HAL/STM32F1/timers.h View File

91
   #define SERVO0_TIMER_NUM 1  // SERVO0 or BLTOUCH
91
   #define SERVO0_TIMER_NUM 1  // SERVO0 or BLTOUCH
92
 #endif
92
 #endif
93
 
93
 
94
-#define STEP_TIMER_IRQ_PRIO 1
95
-#define TEMP_TIMER_IRQ_PRIO 2
94
+#define STEP_TIMER_IRQ_PRIO 2
95
+#define TEMP_TIMER_IRQ_PRIO 3
96
+#define SERVO0_TIMER_IRQ_PRIO 1
96
 
97
 
97
 #define TEMP_TIMER_PRESCALE     1000 // prescaler for setting Temp timer, 72Khz
98
 #define TEMP_TIMER_PRESCALE     1000 // prescaler for setting Temp timer, 72Khz
98
 #define TEMP_TIMER_FREQUENCY    1000 // temperature interrupt frequency
99
 #define TEMP_TIMER_FREQUENCY    1000 // temperature interrupt frequency
193
   bb_peri_set_bit(&(dev->regs).gen->CR1, TIMER_CR1_ARPE_BIT, 0);
194
   bb_peri_set_bit(&(dev->regs).gen->CR1, TIMER_CR1_ARPE_BIT, 0);
194
 }
195
 }
195
 
196
 
197
+void timer_set_interrupt_priority(uint_fast8_t timer_num, uint_fast8_t priority);
198
+
196
 #define TIMER_OC_NO_PRELOAD 0 // Need to disable preload also on compare registers.
199
 #define TIMER_OC_NO_PRELOAD 0 // Need to disable preload also on compare registers.

Loading…
Cancel
Save