瀏覽代碼

Changes to STM32F1 HAL (#8833)

Some to correct missing files from previous PR to completely avoid
HardwareTimer Class (reduce overhead). Some changes to formatting.
Changes to DMA ADC to work correctly.
Change to F1 sanity check.
victorpv 7 年之前
父節點
當前提交
2ec4113cb2

+ 40
- 15
Marlin/src/HAL/HAL_STM32F1/HAL_Stm32f1.cpp 查看文件

88
 };
88
 };
89
 
89
 
90
 enum TEMP_PINS {
90
 enum TEMP_PINS {
91
-  TEMP_0,
92
-  TEMP_1,
93
-  TEMP_2,
94
-  TEMP_3,
95
-  TEMP_4,
96
-  TEMP_BED,
97
-  FILWIDTH
91
+  #if HAS_TEMP_0
92
+    TEMP_0,
93
+  #endif
94
+  #if HAS_TEMP_1
95
+    TEMP_1,
96
+  #endif
97
+  #if HAS_TEMP_2
98
+    TEMP_2,
99
+  #endif
100
+  #if HAS_TEMP_3
101
+    TEMP_3,
102
+  #endif
103
+  #if HAS_TEMP_4
104
+    TEMP_4,
105
+  #endif
106
+  #if HAS_TEMP_BED
107
+    TEMP_BED,
108
+  #endif
109
+  #if ENABLED(FILAMENT_WIDTH_SENSOR)
110
+    FILWIDTH,
111
+  #endif
112
+    ADC_PIN_COUNT
98
 };
113
 };
99
 
114
 
100
-#define ADC_PIN_COUNT (sizeof(adc_pins)/sizeof(adc_pins[0]))
101
 uint16_t HAL_adc_results[ADC_PIN_COUNT];
115
 uint16_t HAL_adc_results[ADC_PIN_COUNT];
102
 
116
 
103
 
117
 
181
 void HAL_adc_start_conversion(const uint8_t adc_pin) {
195
 void HAL_adc_start_conversion(const uint8_t adc_pin) {
182
   TEMP_PINS pin_index;
196
   TEMP_PINS pin_index;
183
   switch (adc_pin) {
197
   switch (adc_pin) {
184
-    default:
185
-    case TEMP_0_PIN: pin_index = TEMP_0; break;
186
-    case TEMP_1_PIN: pin_index = TEMP_1; break;
187
-    case TEMP_2_PIN: pin_index = TEMP_2; break;
188
-    case TEMP_3_PIN: pin_index = TEMP_3; break;
189
-    case TEMP_4_PIN: pin_index = TEMP_4; break;
190
-    case TEMP_BED_PIN: pin_index = TEMP_BED; break;
198
+    #if HAS_TEMP_0
199
+      case TEMP_0_PIN: pin_index = TEMP_0; break;
200
+    #endif
201
+    #if HAS_TEMP_1
202
+      case TEMP_1_PIN: pin_index = TEMP_1; break;
203
+    #endif
204
+    #if HAS_TEMP_2
205
+      case TEMP_2_PIN: pin_index = TEMP_2; break;
206
+    #endif
207
+    #if HAS_TEMP_3
208
+      case TEMP_3_PIN: pin_index = TEMP_3; break;
209
+    #endif
210
+    #if HAS_TEMP_4
211
+      case TEMP_4_PIN: pin_index = TEMP_4; break;
212
+    #endif
213
+    #if HAS_TEMP_BED
214
+      case TEMP_BED_PIN: pin_index = TEMP_BED; break;
215
+    #endif
191
     #if ENABLED(FILAMENT_WIDTH_SENSOR)
216
     #if ENABLED(FILAMENT_WIDTH_SENSOR)
192
       case FILWIDTH_PIN: pin_index = FILWIDTH; break;
217
       case FILWIDTH_PIN: pin_index = FILWIDTH; break;
193
     #endif
218
     #endif

+ 7
- 7
Marlin/src/HAL/HAL_STM32F1/HAL_spi_Stm32f1.cpp 查看文件

79
   #if !PIN_EXISTS(SS)
79
   #if !PIN_EXISTS(SS)
80
     #error "SS_PIN not defined!"
80
     #error "SS_PIN not defined!"
81
   #endif
81
   #endif
82
-  SET_OUTPUT(SS_PIN);
83
   WRITE(SS_PIN, HIGH);
82
   WRITE(SS_PIN, HIGH);
83
+  SET_OUTPUT(SS_PIN);
84
 }
84
 }
85
 
85
 
86
 /**
86
 /**
94
 void spiInit(uint8_t spiRate) {
94
 void spiInit(uint8_t spiRate) {
95
   uint8_t  clock;
95
   uint8_t  clock;
96
   switch (spiRate) {
96
   switch (spiRate) {
97
-  case SPI_FULL_SPEED:    clock = SPI_CLOCK_DIV2 ;  break;
98
-  case SPI_HALF_SPEED:    clock =  SPI_CLOCK_DIV4 ; break;
99
-  case SPI_QUARTER_SPEED: clock =  SPI_CLOCK_DIV8 ; break;
100
-  case SPI_EIGHTH_SPEED:  clock =  SPI_CLOCK_DIV16; break;
101
-  case SPI_SPEED_5:       clock =   SPI_CLOCK_DIV32;  break;
102
-  case SPI_SPEED_6:       clock =   SPI_CLOCK_DIV64;  break;
97
+  case SPI_FULL_SPEED:    clock = SPI_CLOCK_DIV2 ; break;
98
+  case SPI_HALF_SPEED:    clock = SPI_CLOCK_DIV4 ; break;
99
+  case SPI_QUARTER_SPEED: clock = SPI_CLOCK_DIV8 ; break;
100
+  case SPI_EIGHTH_SPEED:  clock = SPI_CLOCK_DIV16; break;
101
+  case SPI_SPEED_5:       clock = SPI_CLOCK_DIV32; break;
102
+  case SPI_SPEED_6:       clock = SPI_CLOCK_DIV64; break;
103
   default:
103
   default:
104
     clock = SPI_CLOCK_DIV2; // Default from the SPI library
104
     clock = SPI_CLOCK_DIV2; // Default from the SPI library
105
   }
105
   }

+ 23
- 6
Marlin/src/HAL/HAL_STM32F1/HAL_timers_Stm32f1.cpp 查看文件

82
 // Public functions
82
 // Public functions
83
 // --------------------------------------------------------------------------
83
 // --------------------------------------------------------------------------
84
 
84
 
85
-/*
86
-Timer_clock1: Prescaler 2 -> 42MHz
87
-Timer_clock2: Prescaler 8 -> 10.5MHz
88
-Timer_clock3: Prescaler 32 -> 2.625MHz
89
-Timer_clock4: Prescaler 128 -> 656.25kHz
90
-*/
85
+/**
86
+ * Timer_clock1: Prescaler   2 ->  36    MHz
87
+ * Timer_clock2: Prescaler   8 ->   9    MHz
88
+ * Timer_clock3: Prescaler  32 ->   2.25 MHz
89
+ * Timer_clock4: Prescaler 128 -> 562.5  kHz
90
+ */
91
 
91
 
92
 /**
92
 /**
93
  * TODO: Calculate Timer prescale value, so we get the 32bit to adjust
93
  * TODO: Calculate Timer prescale value, so we get the 32bit to adjust
94
  */
94
  */
95
 
95
 
96
 void HAL_timer_start(uint8_t timer_num, uint32_t frequency) {
96
 void HAL_timer_start(uint8_t timer_num, uint32_t frequency) {
97
+  nvic_irq_num irq_num;
98
+  switch (timer_num) {
99
+    case 1: irq_num = NVIC_TIMER1_CC; break;
100
+    case 2: irq_num = NVIC_TIMER2; break;
101
+    case 3: irq_num = NVIC_TIMER3; break;
102
+    case 4: irq_num = NVIC_TIMER4; break;
103
+    case 5: irq_num = NVIC_TIMER5; break;
104
+    default:
105
+      /**
106
+       *  We should not get here, add Sanitycheck for timer number. Should be a general timer
107
+       *  since basic timers do not have CC channels.
108
+       *  Advanced timers should be skipped if possible too, and are not listed above.
109
+       */
110
+      break;
111
+  }
112
+  nvic_irq_set_priority(irq_num, 0xF); // this is the lowest settable priority, but should still be over USB
113
+
97
   switch (timer_num) {
114
   switch (timer_num) {
98
     case STEP_TIMER_NUM:
115
     case STEP_TIMER_NUM:
99
       timer_pause(STEP_TIMER_DEV);
116
       timer_pause(STEP_TIMER_DEV);

+ 37
- 62
Marlin/src/HAL/HAL_STM32F1/HAL_timers_Stm32f1.h 查看文件

46
 typedef uint16_t hal_timer_t;
46
 typedef uint16_t hal_timer_t;
47
 #define HAL_TIMER_TYPE_MAX 0xFFFF
47
 #define HAL_TIMER_TYPE_MAX 0xFFFF
48
 
48
 
49
-#ifdef MCU_STM32F103CB  || defined(MCU_STM32F103C8)
49
+#if defined MCU_STM32F103CB  || defined(MCU_STM32F103C8)
50
   #define STEP_TIMER_NUM 4 // For C8/CB boards, use timer 4
50
   #define STEP_TIMER_NUM 4 // For C8/CB boards, use timer 4
51
 #else
51
 #else
52
   #define STEP_TIMER_NUM 5 // for other boards, five is fine.
52
   #define STEP_TIMER_NUM 5 // for other boards, five is fine.
56
 #define TEMP_TIMER_NUM 2  // index of timer to use for temperature
56
 #define TEMP_TIMER_NUM 2  // index of timer to use for temperature
57
 #define TEMP_TIMER_CHAN 1 // Channel of the timer to use for compare and interrupts
57
 #define TEMP_TIMER_CHAN 1 // Channel of the timer to use for compare and interrupts
58
 
58
 
59
+#define CAT(a, ...) a ## __VA_ARGS__
60
+#define TIMER_DEV(num) CAT (&timer, num)
61
+
62
+#define STEP_TIMER_DEV TIMER_DEV(STEP_TIMER_NUM)
63
+#define TEMP_TIMER_DEV TIMER_DEV(TEMP_TIMER_NUM)
64
+
65
+
66
+
67
+//STM32_HAVE_TIMER(n);
68
+
59
 #define HAL_TIMER_RATE         (F_CPU)  // frequency of timers peripherals
69
 #define HAL_TIMER_RATE         (F_CPU)  // frequency of timers peripherals
60
-#define STEPPER_TIMER_PRESCALE 36             // prescaler for setting stepper timer, 2Mhz
70
+#define STEPPER_TIMER_PRESCALE 18             // prescaler for setting stepper timer, 4Mhz
61
 #define HAL_STEPPER_TIMER_RATE (HAL_TIMER_RATE / STEPPER_TIMER_PRESCALE)   // frequency of stepper timer (HAL_TIMER_RATE / STEPPER_TIMER_PRESCALE)
71
 #define HAL_STEPPER_TIMER_RATE (HAL_TIMER_RATE / STEPPER_TIMER_PRESCALE)   // frequency of stepper timer (HAL_TIMER_RATE / STEPPER_TIMER_PRESCALE)
62
 #define HAL_TICKS_PER_US       ((HAL_STEPPER_TIMER_RATE) / 1000000) // stepper timer ticks per us
72
 #define HAL_TICKS_PER_US       ((HAL_STEPPER_TIMER_RATE) / 1000000) // stepper timer ticks per us
63
 
73
 
65
 #define PULSE_TIMER_PRESCALE STEPPER_TIMER_PRESCALE
75
 #define PULSE_TIMER_PRESCALE STEPPER_TIMER_PRESCALE
66
 
76
 
67
 #define TEMP_TIMER_PRESCALE     1000 // prescaler for setting Temp timer, 72Khz
77
 #define TEMP_TIMER_PRESCALE     1000 // prescaler for setting Temp timer, 72Khz
68
-#define TEMP_TIMER_FREQUENCY    1000 // temperature interrupt frequency
78
+#define TEMP_TIMER_FREQUENCY    100 // temperature interrupt frequency
69
 
79
 
70
-#define ENABLE_STEPPER_DRIVER_INTERRUPT() HAL_timer_enable_interrupt(STEP_TIMER_NUM)
71
-#define DISABLE_STEPPER_DRIVER_INTERRUPT() HAL_timer_disable_interrupt(STEP_TIMER_NUM)
80
+#define ENABLE_STEPPER_DRIVER_INTERRUPT() timer_enable_irq(STEP_TIMER_DEV, STEP_TIMER_CHAN)
81
+#define DISABLE_STEPPER_DRIVER_INTERRUPT() timer_disable_irq(STEP_TIMER_DEV, STEP_TIMER_CHAN)
82
+
83
+#define ENABLE_TEMPERATURE_INTERRUPT() timer_enable_irq(TEMP_TIMER_DEV, TEMP_TIMER_CHAN)
84
+#define DISABLE_TEMPERATURE_INTERRUPT() timer_disable_irq(TEMP_TIMER_DEV, TEMP_TIMER_CHAN)
85
+
86
+#define HAL_timer_get_current_count(timer_num) timer_get_count(TIMER_DEV(timer_num))
87
+#define HAL_timer_set_current_count(timer_num, count) timer_set_count(TIMER_DEV(timer_num, (uint16)count))
72
 
88
 
73
-#define ENABLE_TEMPERATURE_INTERRUPT() HAL_timer_enable_interrupt(TEMP_TIMER_NUM)
74
-#define DISABLE_TEMPERATURE_INTERRUPT() HAL_timer_disable_interrupt(TEMP_TIMER_NUM)
75
 
89
 
76
 #define HAL_ENABLE_ISRs() do { if (thermalManager.in_temp_isr)DISABLE_TEMPERATURE_INTERRUPT(); else ENABLE_TEMPERATURE_INTERRUPT(); ENABLE_STEPPER_DRIVER_INTERRUPT(); } while(0)
90
 #define HAL_ENABLE_ISRs() do { if (thermalManager.in_temp_isr)DISABLE_TEMPERATURE_INTERRUPT(); else ENABLE_TEMPERATURE_INTERRUPT(); ENABLE_STEPPER_DRIVER_INTERRUPT(); } while(0)
77
 // TODO change this
91
 // TODO change this
115
  */
129
  */
116
 
130
 
117
 FORCE_INLINE static void HAL_timer_set_count(const uint8_t timer_num, const hal_timer_t count) {
131
 FORCE_INLINE static void HAL_timer_set_count(const uint8_t timer_num, const hal_timer_t count) {
132
+  //count = min(count, HAL_TIMER_TYPE_MAX);
118
   switch (timer_num) {
133
   switch (timer_num) {
119
   case STEP_TIMER_NUM:
134
   case STEP_TIMER_NUM:
120
-    StepperTimer.pause();
121
-    StepperTimer.setCompare(STEP_TIMER_CHAN, count);
122
-    StepperTimer.refresh();
123
-    StepperTimer.resume();
124
-    break;
135
+    timer_set_compare(STEP_TIMER_DEV, STEP_TIMER_CHAN, count);
136
+    return;
125
   case TEMP_TIMER_NUM:
137
   case TEMP_TIMER_NUM:
126
-    TempTimer.pause();
127
-    TempTimer.setCompare(TEMP_TIMER_CHAN, count);
128
-    TempTimer.refresh();
129
-    TempTimer.resume();
130
-    break;
138
+    timer_set_compare(TEMP_TIMER_DEV, TEMP_TIMER_CHAN, count);
139
+    return;
131
   default:
140
   default:
132
-    break;
141
+    return;
133
   }
142
   }
134
 }
143
 }
135
 
144
 
136
 FORCE_INLINE static hal_timer_t HAL_timer_get_count(const uint8_t timer_num) {
145
 FORCE_INLINE static hal_timer_t HAL_timer_get_count(const uint8_t timer_num) {
137
-  hal_timer_t temp;
138
   switch (timer_num) {
146
   switch (timer_num) {
139
   case STEP_TIMER_NUM:
147
   case STEP_TIMER_NUM:
140
-    temp = StepperTimer.getCompare(STEP_TIMER_CHAN);
141
-    break;
148
+    return timer_get_compare(STEP_TIMER_DEV, STEP_TIMER_CHAN);
142
   case TEMP_TIMER_NUM:
149
   case TEMP_TIMER_NUM:
143
-    temp = TempTimer.getCompare(TEMP_TIMER_CHAN);
144
-    break;
150
+    return timer_get_compare(TEMP_TIMER_DEV, TEMP_TIMER_CHAN);
145
   default:
151
   default:
146
-    temp = 0;
147
-    break;
152
+    return 0;
148
   }
153
   }
149
-  return temp;
150
 }
154
 }
151
 
155
 
152
-FORCE_INLINE static void HAL_timer_set_current_count(const uint8_t timer_num, const hal_timer_t count) {
153
-  switch (timer_num) {
154
-    case STEP_TIMER_NUM: StepperTimer.setCount(count); break;
155
-    case TEMP_TIMER_NUM: TempTimer.setCount(count); break;
156
-  }
157
-}
158
-
159
-FORCE_INLINE static hal_timer_t HAL_timer_get_current_count(const uint8_t timer_num) {
160
-  hal_timer_t temp;
161
-  switch (timer_num) {
162
-  case STEP_TIMER_NUM:
163
-    temp = StepperTimer.getCount();
164
-    break;
165
-  case TEMP_TIMER_NUM:
166
-    temp = TempTimer.getCount();
167
-    break;
168
-  default:
169
-    temp = 0;
170
-    break;
171
-  }
172
-  return temp;
173
-}
174
-
175
-//void HAL_timer_isr_prologue (const uint8_t timer_num);
176
-
177
 FORCE_INLINE static void HAL_timer_isr_prologue(const uint8_t timer_num) {
156
 FORCE_INLINE static void HAL_timer_isr_prologue(const uint8_t timer_num) {
178
   switch (timer_num) {
157
   switch (timer_num) {
179
   case STEP_TIMER_NUM:
158
   case STEP_TIMER_NUM:
180
-    StepperTimer.pause();
181
-    StepperTimer.setCount(0);
182
-    StepperTimer.refresh();
183
-    StepperTimer.resume();
184
-    break;
159
+    timer_set_count(STEP_TIMER_DEV, 0);
160
+    timer_generate_update(STEP_TIMER_DEV);
161
+    return;
185
   case TEMP_TIMER_NUM:
162
   case TEMP_TIMER_NUM:
186
-    TempTimer.pause();
187
-    TempTimer.setCount(0);
188
-    TempTimer.refresh();
189
-    TempTimer.resume();
190
-    break;
163
+    timer_set_count(TEMP_TIMER_DEV, 0);
164
+    timer_generate_update(TEMP_TIMER_DEV);
165
+    return;
191
   default:
166
   default:
192
-    break;
167
+    return;
193
   }
168
   }
194
 }
169
 }
195
 
170
 

+ 4
- 6
Marlin/src/HAL/HAL_STM32F1/SanityCheck_Stm32f1.h 查看文件

35
   #elif ENABLED(SPINDLE_LASER_PWM) && PIN_EXISTS(SPINDLE_LASER_PWM)
35
   #elif ENABLED(SPINDLE_LASER_PWM) && PIN_EXISTS(SPINDLE_LASER_PWM)
36
     #if !PWM_PIN(SPINDLE_LASER_PWM_PIN)
36
     #if !PWM_PIN(SPINDLE_LASER_PWM_PIN)
37
       #error "SPINDLE_LASER_PWM_PIN not assigned to a PWM pin."
37
       #error "SPINDLE_LASER_PWM_PIN not assigned to a PWM pin."
38
-    #elif !(SPINDLE_LASER_PWM_PIN == 4 || SPINDLE_LASER_PWM_PIN == 6 || SPINDLE_LASER_PWM_PIN == 11)
39
-      #error "SPINDLE_LASER_PWM_PIN must use SERVO0, SERVO1 or SERVO3 connector"
40
-    #elif SPINDLE_LASER_POWERUP_DELAY < 1
41
-      #error "SPINDLE_LASER_POWERUP_DELAY must be greater than 0."
42
-    #elif SPINDLE_LASER_POWERDOWN_DELAY < 1
43
-      #error "SPINDLE_LASER_POWERDOWN_DELAY must be greater than 0."
38
+    #elif SPINDLE_LASER_POWERUP_DELAY < 0
39
+      #error "SPINDLE_LASER_POWERUP_DELAY must be positive"
40
+    #elif SPINDLE_LASER_POWERDOWN_DELAY < 0
41
+      #error "SPINDLE_LASER_POWERDOWN_DELAY must be positive"
44
     #elif !defined(SPINDLE_LASER_PWM_INVERT)
42
     #elif !defined(SPINDLE_LASER_PWM_INVERT)
45
       #error "SPINDLE_LASER_PWM_INVERT missing."
43
       #error "SPINDLE_LASER_PWM_INVERT missing."
46
     #elif !defined(SPEED_POWER_SLOPE) || !defined(SPEED_POWER_INTERCEPT) || !defined(SPEED_POWER_MIN) || !defined(SPEED_POWER_MAX)
44
     #elif !defined(SPEED_POWER_SLOPE) || !defined(SPEED_POWER_INTERCEPT) || !defined(SPEED_POWER_MIN) || !defined(SPEED_POWER_MAX)

+ 5
- 1
Marlin/src/HAL/HAL_STM32F1/fastio_Stm32f1.h 查看文件

48
 #define GET_OUTPUT(IO)        (_GET_MODE(IO) == GPIO_OUTPUT_PP)
48
 #define GET_OUTPUT(IO)        (_GET_MODE(IO) == GPIO_OUTPUT_PP)
49
 #define GET_TIMER(IO)         (PIN_MAP[IO].timer_device != NULL)
49
 #define GET_TIMER(IO)         (PIN_MAP[IO].timer_device != NULL)
50
 
50
 
51
-#define OUT_WRITE(IO, v) { _SET_OUTPUT(IO); WRITE(IO, v); }
51
+#define OUT_WRITE(IO, v)      { _SET_OUTPUT(IO); WRITE(IO, v); }
52
+/*
53
+ * TODO: Write a macro to test if PIN is PWM or not.
54
+ */
55
+#define PWM_PIN(p)            true
52
 
56
 
53
 #endif	/* _FASTIO_STM32F1_H */
57
 #endif	/* _FASTIO_STM32F1_H */

+ 1
- 1
Marlin/src/HAL/HAL_STM32F1/spi_pins.h 查看文件

27
 /**
27
 /**
28
  * Define SPI Pins: SCK, MISO, MOSI, SS
28
  * Define SPI Pins: SCK, MISO, MOSI, SS
29
  *
29
  *
30
- * Available chip select pins for HW SPI are 4 10 52 77
30
+ * Any PIN can be used for Chip Select (SS)
31
  */
31
  */
32
 #define SCK_PIN   PA5
32
 #define SCK_PIN   PA5
33
 #define MISO_PIN  PA6
33
 #define MISO_PIN  PA6

+ 12
- 1
Marlin/src/HAL/HAL_STM32F1/watchdog_Stm32f1.h 查看文件

30
 #include <libmaple/iwdg.h>
30
 #include <libmaple/iwdg.h>
31
 
31
 
32
 #include "../../../src/inc/MarlinConfig.h"
32
 #include "../../../src/inc/MarlinConfig.h"
33
+
34
+/**
35
+ *  The watchdog clock is 40Khz. We need a 4 seconds interval, so use a /256 preescaler and
36
+ *  625 reload value (counts down to 0)
37
+ *  use 1250 for 8 seconds
38
+ */
33
 #define STM32F1_WD_RELOAD 625
39
 #define STM32F1_WD_RELOAD 625
34
 
40
 
35
 // Arduino STM32F1 core now has watchdog support
41
 // Arduino STM32F1 core now has watchdog support
39
 
45
 
40
 // Reset watchdog. MUST be called at least every 4 seconds after the
46
 // Reset watchdog. MUST be called at least every 4 seconds after the
41
 // first watchdog_init or STM32F1 will reset.
47
 // first watchdog_init or STM32F1 will reset.
42
-inline void watchdog_reset() { iwdg_feed(); }
48
+inline void watchdog_reset() {
49
+  #if PIN_EXISTS(LED)
50
+    TOGGLE(LED_PIN);  // heart beat indicator
51
+  #endif
52
+  iwdg_feed();
53
+}
43
 
54
 
44
 #endif // WATCHDOG_STM32F1_H
55
 #endif // WATCHDOG_STM32F1_H

Loading…
取消
儲存