Преглед на файлове

Secure STM32F1 servo code and M280 detach (#14085)

Tanguy Pruvot преди 6 години
родител
ревизия
24b1818245
променени са 3 файла, в които са добавени 16 реда и са изтрити 9 реда
  1. 8
    6
      Marlin/src/HAL/HAL_STM32F1/HAL_Servo_STM32F1.cpp
  2. 1
    1
      Marlin/src/HAL/HAL_STM32F1/fastio_STM32F1.h
  3. 7
    2
      Marlin/src/gcode/control/M280.cpp

+ 8
- 6
Marlin/src/HAL/HAL_STM32F1/HAL_Servo_STM32F1.cpp Целия файл

@@ -27,7 +27,7 @@
27 27
 
28 28
 #if HAS_SERVOS
29 29
 
30
-uint8_t ServoCount; //=0
30
+uint8_t ServoCount = 0;
31 31
 
32 32
 #include "HAL_Servo_STM32F1.h"
33 33
 
@@ -68,16 +68,16 @@ libServo::libServo() {
68 68
 
69 69
 bool libServo::attach(const int32_t pin, const int32_t minAngle, const int32_t maxAngle) {
70 70
   if (this->servoIndex >= MAX_SERVOS) return false;
71
+  if (!PWM_PIN(pin)) return false;
71 72
 
72
-  this->pin = pin;
73 73
   this->minAngle = minAngle;
74 74
   this->maxAngle = maxAngle;
75 75
 
76
-  timer_dev *tdev = PIN_MAP[this->pin].timer_device;
77
-  uint8_t tchan = PIN_MAP[this->pin].timer_channel;
76
+  timer_dev *tdev = PIN_MAP[pin].timer_device;
77
+  uint8_t tchan = PIN_MAP[pin].timer_channel;
78 78
 
79
-  pinMode(this->pin, PWM);
80
-  pwmWrite(this->pin, 0);
79
+  pinMode(pin, PWM);
80
+  pwmWrite(pin, 0);
81 81
 
82 82
   timer_pause(tdev);
83 83
   timer_set_prescaler(tdev, SERVO_PRESCALER - 1); // prescaler is 1-based
@@ -85,6 +85,8 @@ bool libServo::attach(const int32_t pin, const int32_t minAngle, const int32_t m
85 85
   timer_generate_update(tdev);
86 86
   timer_resume(tdev);
87 87
 
88
+  this->pin = pin; // set attached()
89
+
88 90
   return true;
89 91
 }
90 92
 

+ 1
- 1
Marlin/src/HAL/HAL_STM32F1/fastio_STM32F1.h Целия файл

@@ -51,7 +51,7 @@
51 51
 #define IS_INPUT(IO)          (_GET_MODE(IO) == GPIO_INPUT_FLOATING || _GET_MODE(IO) == GPIO_INPUT_ANALOG || _GET_MODE(IO) == GPIO_INPUT_PU || _GET_MODE(IO) == GPIO_INPUT_PD)
52 52
 #define IS_OUTPUT(IO)         (_GET_MODE(IO) == GPIO_OUTPUT_PP)
53 53
 
54
-#define PWM_PIN(P)            (PIN_MAP[IO].timer_device != nullptr)
54
+#define PWM_PIN(IO)           (PIN_MAP[IO].timer_device != nullptr)
55 55
 
56 56
 // digitalRead/Write wrappers
57 57
 #define extDigitalRead(IO)    digitalRead(IO)

+ 7
- 2
Marlin/src/gcode/control/M280.cpp Целия файл

@@ -34,8 +34,13 @@ void GcodeSuite::M280() {
34 34
   if (!parser.seen('P')) return;
35 35
   const int servo_index = parser.value_int();
36 36
   if (WITHIN(servo_index, 0, NUM_SERVOS - 1)) {
37
-    if (parser.seen('S'))
38
-      MOVE_SERVO(servo_index, parser.value_int());
37
+    if (parser.seen('S')) {
38
+      const int a = parser.value_int();
39
+      if (a == -1)
40
+        servo[servo_index].detach();
41
+      else
42
+        MOVE_SERVO(servo_index, a);
43
+    }
39 44
     else {
40 45
       SERIAL_ECHO_START();
41 46
       SERIAL_ECHOPAIR(" Servo ", servo_index);

Loading…
Отказ
Запис