瀏覽代碼

Secure STM32F1 servo code and M280 detach (#14085)

Tanguy Pruvot 6 年之前
父節點
當前提交
24b1818245

+ 8
- 6
Marlin/src/HAL/HAL_STM32F1/HAL_Servo_STM32F1.cpp 查看文件

27
 
27
 
28
 #if HAS_SERVOS
28
 #if HAS_SERVOS
29
 
29
 
30
-uint8_t ServoCount; //=0
30
+uint8_t ServoCount = 0;
31
 
31
 
32
 #include "HAL_Servo_STM32F1.h"
32
 #include "HAL_Servo_STM32F1.h"
33
 
33
 
68
 
68
 
69
 bool libServo::attach(const int32_t pin, const int32_t minAngle, const int32_t maxAngle) {
69
 bool libServo::attach(const int32_t pin, const int32_t minAngle, const int32_t maxAngle) {
70
   if (this->servoIndex >= MAX_SERVOS) return false;
70
   if (this->servoIndex >= MAX_SERVOS) return false;
71
+  if (!PWM_PIN(pin)) return false;
71
 
72
 
72
-  this->pin = pin;
73
   this->minAngle = minAngle;
73
   this->minAngle = minAngle;
74
   this->maxAngle = maxAngle;
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
   timer_pause(tdev);
82
   timer_pause(tdev);
83
   timer_set_prescaler(tdev, SERVO_PRESCALER - 1); // prescaler is 1-based
83
   timer_set_prescaler(tdev, SERVO_PRESCALER - 1); // prescaler is 1-based
85
   timer_generate_update(tdev);
85
   timer_generate_update(tdev);
86
   timer_resume(tdev);
86
   timer_resume(tdev);
87
 
87
 
88
+  this->pin = pin; // set attached()
89
+
88
   return true;
90
   return true;
89
 }
91
 }
90
 
92
 

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

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)
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
 #define IS_OUTPUT(IO)         (_GET_MODE(IO) == GPIO_OUTPUT_PP)
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
 // digitalRead/Write wrappers
56
 // digitalRead/Write wrappers
57
 #define extDigitalRead(IO)    digitalRead(IO)
57
 #define extDigitalRead(IO)    digitalRead(IO)

+ 7
- 2
Marlin/src/gcode/control/M280.cpp 查看文件

34
   if (!parser.seen('P')) return;
34
   if (!parser.seen('P')) return;
35
   const int servo_index = parser.value_int();
35
   const int servo_index = parser.value_int();
36
   if (WITHIN(servo_index, 0, NUM_SERVOS - 1)) {
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
     else {
44
     else {
40
       SERIAL_ECHO_START();
45
       SERIAL_ECHO_START();
41
       SERIAL_ECHOPAIR(" Servo ", servo_index);
46
       SERIAL_ECHOPAIR(" Servo ", servo_index);

Loading…
取消
儲存