瀏覽代碼

STM32F4xx modifications for HAL_STM32 (#12080)

Karl Andersson 6 年之前
父節點
當前提交
8b5e51c9aa

+ 1
- 1
Marlin/src/HAL/HAL_LPC1768/watchdog.cpp 查看文件

@@ -67,7 +67,7 @@ uint8_t HAL_get_reset_source(void) {
67 67
 
68 68
 void watchdog_reset() {
69 69
   WDT_Feed();
70
-  #if PIN_EXISTS(LED)
70
+  #if !defined(PINS_DEBUGGING) && PIN_EXISTS(LED)
71 71
     TOGGLE(LED_PIN);  // heart beat indicator
72 72
   #endif
73 73
 }

+ 2
- 2
Marlin/src/HAL/HAL_STM32/HAL_timers_STM32.cpp 查看文件

@@ -79,7 +79,7 @@ void HAL_timer_start(const uint8_t timer_num, const uint32_t frequency) {
79 79
         TimerHandle[timer_num].timer = STEP_TIMER_DEV;
80 80
         TimerHandle[timer_num].irqHandle = Step_Handler;
81 81
         TimerHandleInit(&TimerHandle[timer_num], (((HAL_TIMER_RATE) / step_prescaler) / frequency) - 1, step_prescaler);
82
-        HAL_NVIC_SetPriority(STEP_TIMER_IRQ_NAME, 6, 0);
82
+        HAL_NVIC_SetPriority(STEP_TIMER_IRQ_NAME, STEP_TIMER_IRQ_PRIO, 0);
83 83
         break;
84 84
 
85 85
       case TEMP_TIMER_NUM:
@@ -87,7 +87,7 @@ void HAL_timer_start(const uint8_t timer_num, const uint32_t frequency) {
87 87
         TimerHandle[timer_num].timer = TEMP_TIMER_DEV;
88 88
         TimerHandle[timer_num].irqHandle = Temp_Handler;
89 89
         TimerHandleInit(&TimerHandle[timer_num], (((HAL_TIMER_RATE) / temp_prescaler) / frequency) - 1, temp_prescaler);
90
-        HAL_NVIC_SetPriority(TEMP_TIMER_IRQ_NAME, 2, 0);
90
+        HAL_NVIC_SetPriority(TEMP_TIMER_IRQ_NAME, TEMP_TIMER_IRQ_PRIO, 0);
91 91
         break;
92 92
     }
93 93
     timers_initialised[timer_num] = true;

+ 39
- 24
Marlin/src/HAL/HAL_STM32/HAL_timers_STM32.h 查看文件

@@ -34,42 +34,66 @@
34 34
 #define FORCE_INLINE __attribute__((always_inline)) inline
35 35
 
36 36
 #define hal_timer_t uint32_t
37
-#define HAL_TIMER_TYPE_MAX 0xFFFF
37
+#define HAL_TIMER_TYPE_MAX 0xFFFFFFFF // Timers can be 16 or 32 bit
38 38
 
39 39
 #ifdef STM32F0xx
40 40
 
41
-  #define HAL_TIMER_RATE (HAL_RCC_GetSysClockFreq()) // frequency of timer peripherals
41
+  #define HAL_TIMER_RATE (F_CPU) // frequency of timer peripherals
42 42
 
43
-  #define STEP_TIMER 16
44
-  #define TEMP_TIMER 17
43
+  #ifndef STEP_TIMER
44
+    #define STEP_TIMER 16
45
+  #endif
46
+
47
+  #ifndef TEMP_TIMER
48
+    #define TEMP_TIMER 17
49
+  #endif
45 50
 
46 51
 #elif defined STM32F1xx
47 52
 
48
-  #define HAL_TIMER_RATE (HAL_RCC_GetPCLK2Freq()) // frequency of timer peripherals
53
+  #define HAL_TIMER_RATE (F_CPU) // frequency of timer peripherals
49 54
 
50
-  #define STEP_TIMER 4
51
-  #define TEMP_TIMER 2
55
+  #ifndef STEP_TIMER
56
+    #define STEP_TIMER 4
57
+  #endif
58
+
59
+  #ifndef TEMP_TIMER
60
+    #define TEMP_TIMER 2
61
+  #endif
52 62
 
53 63
 #elif defined STM32F4xx
54 64
 
55
-  #define HAL_TIMER_RATE (HAL_RCC_GetPCLK2Freq()) // frequency of timer peripherals
65
+  #define HAL_TIMER_RATE (F_CPU/2) // frequency of timer peripherals
66
+
67
+  #ifndef STEP_TIMER
68
+    #define STEP_TIMER 5
69
+  #endif
56 70
 
57
-  #define STEP_TIMER 4
58
-  #define TEMP_TIMER 5
71
+  #ifndef TEMP_TIMER
72
+    #define TEMP_TIMER 7
73
+  #endif
59 74
 
60 75
 #elif defined STM32F7xx
61 76
 
62
-  #define HAL_TIMER_RATE (HAL_RCC_GetSysClockFreq()/2) // frequency of timer peripherals
77
+  #define HAL_TIMER_RATE (F_CPU/2) // frequency of timer peripherals
63 78
 
64
-  #define STEP_TIMER 5
65
-  #define TEMP_TIMER 7
79
+  #ifndef STEP_TIMER
80
+    #define STEP_TIMER 5
81
+  #endif
66 82
 
67
-  #if MB(REMRAM_V1)
68
-  #define STEP_TIMER 2
83
+  #ifndef TEMP_TIMER
84
+    #define TEMP_TIMER 7
69 85
   #endif
70 86
 
71 87
 #endif
72 88
 
89
+#ifndef STEP_TIMER_IRQ_PRIO
90
+  #define STEP_TIMER_IRQ_PRIO 1
91
+#endif
92
+
93
+#ifndef TEMP_TIMER_IRQ_PRIO
94
+  #define TEMP_TIMER_IRQ_PRIO 2
95
+#endif
96
+
73 97
 #define STEP_TIMER_NUM 0  // index of timer to use for stepper
74 98
 #define TEMP_TIMER_NUM 1  // index of timer to use for temperature
75 99
 #define PULSE_TIMER_NUM STEP_TIMER_NUM
@@ -110,9 +134,6 @@
110 134
 #define ENABLE_TEMPERATURE_INTERRUPT() HAL_timer_enable_interrupt(TEMP_TIMER_NUM)
111 135
 #define DISABLE_TEMPERATURE_INTERRUPT() HAL_timer_disable_interrupt(TEMP_TIMER_NUM)
112 136
 
113
-#define STEPPER_ISR_ENABLED() HAL_timer_interrupt_enabled(STEP_TIMER_NUM)
114
-#define TEMP_ISR_ENABLED() HAL_timer_interrupt_enabled(TEMP_TIMER_NUM)
115
-
116 137
 extern void Step_Handler(stimer_t *htim);
117 138
 extern void Temp_Handler(stimer_t *htim);
118 139
 #define HAL_STEP_TIMER_ISR void Step_Handler(stimer_t *htim)
@@ -153,11 +174,5 @@ FORCE_INLINE static hal_timer_t HAL_timer_get_compare(const uint8_t timer_num) {
153 174
   return __HAL_TIM_GET_AUTORELOAD(&TimerHandle[timer_num].handle);
154 175
 }
155 176
 
156
-FORCE_INLINE static void HAL_timer_restrain(const uint8_t timer_num, const uint16_t interval_ticks) {
157
-  const hal_timer_t mincmp = HAL_timer_get_count(timer_num) + interval_ticks;
158
-  if (HAL_timer_get_compare(timer_num) < mincmp)
159
-    HAL_timer_set_compare(timer_num, mincmp);
160
-}
161
-
162 177
 #define HAL_timer_isr_prologue(TIMER_NUM)
163 178
 #define HAL_timer_isr_epilogue(TIMER_NUM)

+ 6
- 0
Marlin/src/HAL/HAL_STM32/endstop_interrupts.h 查看文件

@@ -52,6 +52,12 @@ void setup_endstop_interrupts(void) {
52 52
   #if HAS_Z2_MIN
53 53
     attachInterrupt(Z2_MIN_PIN, endstop_ISR, CHANGE);
54 54
   #endif
55
+  #if HAS_Z3_MAX
56
+    attachInterrupt(Z3_MAX_PIN, endstop_ISR, CHANGE);
57
+  #endif
58
+  #if HAS_Z3_MIN
59
+    attachInterrupt(Z3_MIN_PIN, endstop_ISR, CHANGE);
60
+  #endif  
55 61
   #if HAS_Z_MIN_PROBE_PIN
56 62
     attachInterrupt(Z_MIN_PROBE_PIN, endstop_ISR, CHANGE);
57 63
   #endif

+ 25
- 9
Marlin/src/HAL/HAL_STM32/persistent_store_impl.cpp 查看文件

@@ -28,20 +28,20 @@
28 28
 
29 29
 #include "../shared/persistent_store_api.h"
30 30
 
31
-#if DISABLED(EEPROM_EMULATED_WITH_SRAM)
31
+#if DISABLED(EEPROM_EMULATED_WITH_SRAM) && DISABLED(SPI_EEPROM) && DISABLED(I2C_EEPROM)
32 32
   #include <EEPROM.h>
33 33
   static bool eeprom_data_written = false;
34 34
 #endif
35 35
 
36 36
 bool PersistentStore::access_start() {
37
-  #if DISABLED(EEPROM_EMULATED_WITH_SRAM)
37
+  #if DISABLED(EEPROM_EMULATED_WITH_SRAM) && DISABLED(SPI_EEPROM) && DISABLED(I2C_EEPROM)
38 38
     eeprom_buffer_fill();
39 39
   #endif
40 40
   return true;
41 41
 }
42 42
 
43 43
 bool PersistentStore::access_finish() {
44
-  #if DISABLED(EEPROM_EMULATED_WITH_SRAM)
44
+  #if DISABLED(EEPROM_EMULATED_WITH_SRAM) && DISABLED(SPI_EEPROM) && DISABLED(I2C_EEPROM)
45 45
     if (eeprom_data_written) {
46 46
       eeprom_buffer_flush();
47 47
       eeprom_data_written = false;
@@ -54,8 +54,20 @@ bool PersistentStore::write_data(int &pos, const uint8_t *value, size_t size, ui
54 54
   while (size--) {
55 55
     uint8_t v = *value;
56 56
 
57
-    // Save to either program flash or Backup SRAM
58
-    #if DISABLED(EEPROM_EMULATED_WITH_SRAM)
57
+    // Save to either external EEPROM, program flash or Backup SRAM
58
+    #if ENABLED(SPI_EEPROM) || ENABLED(I2C_EEPROM)
59
+      // EEPROM has only ~100,000 write cycles,
60
+      // so only write bytes that have changed!
61
+      uint8_t * const p = (uint8_t * const)pos;
62
+      if (v != eeprom_read_byte(p)) {
63
+        eeprom_write_byte(p, v);
64
+        if (eeprom_read_byte(p) != v) {
65
+          SERIAL_ECHO_START();
66
+          SERIAL_ECHOLNPGM(MSG_ERR_EEPROM_WRITE);
67
+          return true;
68
+        }
69
+      }
70
+    #elif DISABLED(EEPROM_EMULATED_WITH_SRAM)
59 71
       eeprom_buffered_write_byte(pos, v);
60 72
     #else
61 73
       *(__IO uint8_t *)(BKPSRAM_BASE + (uint8_t * const)pos) = v;
@@ -65,7 +77,7 @@ bool PersistentStore::write_data(int &pos, const uint8_t *value, size_t size, ui
65 77
     pos++;
66 78
     value++;
67 79
   };
68
-  #if DISABLED(EEPROM_EMULATED_WITH_SRAM)
80
+  #if DISABLED(EEPROM_EMULATED_WITH_SRAM) && DISABLED(SPI_EEPROM) && DISABLED(I2C_EEPROM)
69 81
     eeprom_data_written = true;
70 82
   #endif
71 83
 
@@ -74,9 +86,11 @@ bool PersistentStore::write_data(int &pos, const uint8_t *value, size_t size, ui
74 86
 
75 87
 bool PersistentStore::read_data(int &pos, uint8_t* value, size_t size, uint16_t *crc, const bool writing) {
76 88
   do {
77
-    // Read from either program flash or Backup SRAM
89
+    // Read from either external EEPROM, program flash or Backup SRAM
78 90
     const uint8_t c = (
79
-      #if DISABLED(EEPROM_EMULATED_WITH_SRAM)
91
+      #if ENABLED(SPI_EEPROM) || ENABLED(I2C_EEPROM)
92
+        eeprom_read_byte((uint8_t*)pos)
93
+      #elif DISABLED(EEPROM_EMULATED_WITH_SRAM)
80 94
         eeprom_buffered_read_byte(pos)
81 95
       #else
82 96
         (*(__IO uint8_t *)(BKPSRAM_BASE + ((uint8_t*)pos)))
@@ -92,7 +106,9 @@ bool PersistentStore::read_data(int &pos, uint8_t* value, size_t size, uint16_t
92 106
 }
93 107
 
94 108
 size_t PersistentStore::capacity() {
95
-  #if DISABLED(EEPROM_EMULATED_WITH_SRAM)
109
+  #if ENABLED(SPI_EEPROM) || ENABLED(I2C_EEPROM)
110
+    return E2END + 1;
111
+  #elif DISABLED(EEPROM_EMULATED_WITH_SRAM)
96 112
     return E2END + 1;
97 113
   #else
98 114
     return 4096; // 4kB

+ 8
- 1
Marlin/src/HAL/HAL_STM32/watchdog_STM32.cpp 查看文件

@@ -31,7 +31,14 @@
31 31
 
32 32
   void watchdog_init() { IWatchdog.begin(4000000); } // 4 sec timeout
33 33
 
34
-  void watchdog_reset() { IWatchdog.reload(); }
34
+  void watchdog_reset() 
35
+  {
36
+    IWatchdog.reload(); 
37
+
38
+    #if PIN_EXISTS(LED)
39
+      TOGGLE(LED_PIN);  // heart beat indicator
40
+    #endif
41
+  }
35 42
 
36 43
 #endif // USE_WATCHDOG
37 44
 #endif // ARDUINO_ARCH_STM32

+ 1
- 1
Marlin/src/HAL/HAL_STM32F4/EEPROM_Emul/eeprom_emul.cpp 查看文件

@@ -47,7 +47,7 @@
47 47
 /** @addtogroup EEPROM_Emulation
48 48
   * @{
49 49
   */
50
-#if defined(STM32F4) || defined(STM32F4xx)
50
+#if defined(STM32GENERIC) && (defined(STM32F4) || defined(STM32F4xx))
51 51
 
52 52
 /* Includes ------------------------------------------------------------------*/
53 53
 #include "eeprom_emul.h"

+ 1
- 1
Marlin/src/HAL/HAL_STM32F4/EmulatedEeprom.cpp 查看文件

@@ -17,7 +17,7 @@
17 17
  *
18 18
  */
19 19
 
20
-#if defined(STM32F4) || defined(STM32F4xx)
20
+#if defined(STM32GENERIC) && (defined(STM32F4) || defined(STM32F4xx))
21 21
 
22 22
 /**
23 23
  * Description: functions for I2C connected external EEPROM.

+ 1
- 1
Marlin/src/HAL/HAL_STM32F4/HAL.cpp 查看文件

@@ -21,7 +21,7 @@
21 21
  *
22 22
  */
23 23
 
24
-#if defined(STM32F4) || defined(STM32F4xx)
24
+#if defined(STM32GENERIC) && (defined(STM32F4) || defined(STM32F4xx))
25 25
 
26 26
 // --------------------------------------------------------------------------
27 27
 // Includes

+ 1
- 1
Marlin/src/HAL/HAL_STM32F4/HAL_Servo_STM32F4.cpp 查看文件

@@ -21,7 +21,7 @@
21 21
  *
22 22
  */
23 23
 
24
-#if defined(STM32F4) || defined(STM32F4xx)
24
+#if defined(STM32GENERIC) && (defined(STM32F4) || defined(STM32F4xx))
25 25
 
26 26
 #include "../../inc/MarlinConfig.h"
27 27
 

+ 1
- 1
Marlin/src/HAL/HAL_STM32F4/HAL_spi_STM32F4.cpp 查看文件

@@ -30,7 +30,7 @@
30 30
  * Adapted to the STM32F4 HAL
31 31
  */
32 32
 
33
-#if defined(STM32F4) || defined(STM32F4xx)
33
+#if defined(STM32GENERIC) && (defined(STM32F4) || defined(STM32F4xx))
34 34
 
35 35
 // --------------------------------------------------------------------------
36 36
 // Includes

+ 2
- 2
Marlin/src/HAL/HAL_STM32F4/HAL_timers_STM32F4.cpp 查看文件

@@ -20,7 +20,7 @@
20 20
  *
21 21
  */
22 22
 
23
-#if defined(STM32F4) || defined(STM32F4xx)
23
+#if defined(STM32GENERIC) && (defined(STM32F4) || defined(STM32F4xx))
24 24
 
25 25
 // --------------------------------------------------------------------------
26 26
 // Includes
@@ -91,7 +91,7 @@ void HAL_timer_start(const uint8_t timer_num, const uint32_t frequency) {
91 91
           TimerHandle[timer_num].irqHandle = TC5_Handler;
92 92
           TimerHandleInit(&TimerHandle[timer_num], (((HAL_TIMER_RATE) / step_prescaler) / frequency) - 1, step_prescaler);
93 93
         #endif
94
-        HAL_NVIC_SetPriority(STEP_TIMER_IRQ_ID, 6, 0);
94
+        HAL_NVIC_SetPriority(STEP_TIMER_IRQ_ID, 1, 0);
95 95
         break;
96 96
 
97 97
       case TEMP_TIMER_NUM:

+ 1
- 1
Marlin/src/HAL/HAL_STM32F4/persistent_store_eeprom.cpp 查看文件

@@ -21,7 +21,7 @@
21 21
  *
22 22
  */
23 23
 
24
-#if defined(STM32F4) || defined(STM32F4xx)
24
+#if defined(STM32GENERIC) && (defined(STM32F4) || defined(STM32F4xx))
25 25
 
26 26
 #include "../shared/persistent_store_api.h"
27 27
 

+ 1
- 1
Marlin/src/HAL/HAL_STM32F4/watchdog_STM32F4.cpp 查看文件

@@ -20,7 +20,7 @@
20 20
  *
21 21
  */
22 22
 
23
-#if defined(STM32F4) || defined(STM32F4xx)
23
+#if defined(STM32GENERIC) && (defined(STM32F4) || defined(STM32F4xx))
24 24
 
25 25
 #include "../../inc/MarlinConfig.h"
26 26
 

+ 6
- 0
Marlin/src/pins/pins_REMRAM_V1.h 查看文件

@@ -124,3 +124,9 @@
124 124
 #define BTN_EN1            54   // BTN_EN1
125 125
 #define BTN_EN2            55   // BTN_EN2
126 126
 #define BTN_ENC            47   // BTN_ENC
127
+
128
+//
129
+// Timers
130
+//
131
+
132
+#define STEP_TIMER 2

Loading…
取消
儲存