浏览代码

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,16 +88,30 @@ uint8 adc_pins[] = {
88 88
 };
89 89
 
90 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 115
 uint16_t HAL_adc_results[ADC_PIN_COUNT];
102 116
 
103 117
 
@@ -181,13 +195,24 @@ void HAL_adc_init(void) {
181 195
 void HAL_adc_start_conversion(const uint8_t adc_pin) {
182 196
   TEMP_PINS pin_index;
183 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 216
     #if ENABLED(FILAMENT_WIDTH_SENSOR)
192 217
       case FILWIDTH_PIN: pin_index = FILWIDTH; break;
193 218
     #endif

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

@@ -79,8 +79,8 @@ void spiBegin() {
79 79
   #if !PIN_EXISTS(SS)
80 80
     #error "SS_PIN not defined!"
81 81
   #endif
82
-  SET_OUTPUT(SS_PIN);
83 82
   WRITE(SS_PIN, HIGH);
83
+  SET_OUTPUT(SS_PIN);
84 84
 }
85 85
 
86 86
 /**
@@ -94,12 +94,12 @@ void spiBegin() {
94 94
 void spiInit(uint8_t spiRate) {
95 95
   uint8_t  clock;
96 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 103
   default:
104 104
     clock = SPI_CLOCK_DIV2; // Default from the SPI library
105 105
   }

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

@@ -82,18 +82,35 @@ const tTimerConfig TimerConfig [NUM_HARDWARE_TIMERS] = {
82 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 93
  * TODO: Calculate Timer prescale value, so we get the 32bit to adjust
94 94
  */
95 95
 
96 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 114
   switch (timer_num) {
98 115
     case STEP_TIMER_NUM:
99 116
       timer_pause(STEP_TIMER_DEV);

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

@@ -46,7 +46,7 @@
46 46
 typedef uint16_t hal_timer_t;
47 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 50
   #define STEP_TIMER_NUM 4 // For C8/CB boards, use timer 4
51 51
 #else
52 52
   #define STEP_TIMER_NUM 5 // for other boards, five is fine.
@@ -56,8 +56,18 @@ typedef uint16_t hal_timer_t;
56 56
 #define TEMP_TIMER_NUM 2  // index of timer to use for temperature
57 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 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 71
 #define HAL_STEPPER_TIMER_RATE (HAL_TIMER_RATE / STEPPER_TIMER_PRESCALE)   // frequency of stepper timer (HAL_TIMER_RATE / STEPPER_TIMER_PRESCALE)
62 72
 #define HAL_TICKS_PER_US       ((HAL_STEPPER_TIMER_RATE) / 1000000) // stepper timer ticks per us
63 73
 
@@ -65,13 +75,17 @@ typedef uint16_t hal_timer_t;
65 75
 #define PULSE_TIMER_PRESCALE STEPPER_TIMER_PRESCALE
66 76
 
67 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 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 91
 // TODO change this
@@ -115,81 +129,42 @@ void HAL_timer_disable_interrupt(uint8_t timer_num);
115 129
  */
116 130
 
117 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 133
   switch (timer_num) {
119 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 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 140
   default:
132
-    break;
141
+    return;
133 142
   }
134 143
 }
135 144
 
136 145
 FORCE_INLINE static hal_timer_t HAL_timer_get_count(const uint8_t timer_num) {
137
-  hal_timer_t temp;
138 146
   switch (timer_num) {
139 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 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 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 156
 FORCE_INLINE static void HAL_timer_isr_prologue(const uint8_t timer_num) {
178 157
   switch (timer_num) {
179 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 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 166
   default:
192
-    break;
167
+    return;
193 168
   }
194 169
 }
195 170
 

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

@@ -35,12 +35,10 @@
35 35
   #elif ENABLED(SPINDLE_LASER_PWM) && PIN_EXISTS(SPINDLE_LASER_PWM)
36 36
     #if !PWM_PIN(SPINDLE_LASER_PWM_PIN)
37 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 42
     #elif !defined(SPINDLE_LASER_PWM_INVERT)
45 43
       #error "SPINDLE_LASER_PWM_INVERT missing."
46 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,6 +48,10 @@
48 48
 #define GET_OUTPUT(IO)        (_GET_MODE(IO) == GPIO_OUTPUT_PP)
49 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 57
 #endif	/* _FASTIO_STM32F1_H */

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

@@ -27,7 +27,7 @@
27 27
 /**
28 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 32
 #define SCK_PIN   PA5
33 33
 #define MISO_PIN  PA6

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

@@ -30,6 +30,12 @@
30 30
 #include <libmaple/iwdg.h>
31 31
 
32 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 39
 #define STM32F1_WD_RELOAD 625
34 40
 
35 41
 // Arduino STM32F1 core now has watchdog support
@@ -39,6 +45,11 @@ void watchdog_init();
39 45
 
40 46
 // Reset watchdog. MUST be called at least every 4 seconds after the
41 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 55
 #endif // WATCHDOG_STM32F1_H

正在加载...
取消
保存