summaryrefslogtreecommitdiffstatshomepage
path: root/stmhal/servo.c
diff options
context:
space:
mode:
Diffstat (limited to 'stmhal/servo.c')
-rw-r--r--stmhal/servo.c50
1 files changed, 18 insertions, 32 deletions
diff --git a/stmhal/servo.c b/stmhal/servo.c
index 15ba35165c..9c757c5659 100644
--- a/stmhal/servo.c
+++ b/stmhal/servo.c
@@ -8,12 +8,13 @@
#include "qstr.h"
#include "obj.h"
#include "runtime.h"
+#include "timer.h"
#include "servo.h"
// this servo driver uses hardware PWM to drive servos on PA0, PA1, PA2, PA3 = X1, X2, X3, X4
// TIM2 and TIM5 have CH1, CH2, CH3, CH4 on PA0-PA3 respectively
// they are both 32-bit counters with 16-bit prescaler
-// we use TIM2
+// we use TIM5
#define PYB_SERVO_NUM (4)
@@ -30,23 +31,8 @@ STATIC const mp_obj_type_t servo_obj_type;
STATIC pyb_servo_obj_t pyb_servo_obj[PYB_SERVO_NUM];
-TIM_HandleTypeDef TIM2_Handle;
-
void servo_init(void) {
- // TIM2 clock enable
- __TIM2_CLK_ENABLE();
-
- // set up and enable interrupt
- HAL_NVIC_SetPriority(TIM2_IRQn, 6, 0);
- HAL_NVIC_EnableIRQ(TIM2_IRQn);
-
- // PWM clock configuration
- TIM2_Handle.Instance = TIM2;
- TIM2_Handle.Init.Period = 2000; // timer cycles at 50Hz
- TIM2_Handle.Init.Prescaler = ((SystemCoreClock / 2) / 100000) - 1; // timer runs at 100kHz
- TIM2_Handle.Init.ClockDivision = 0;
- TIM2_Handle.Init.CounterMode = TIM_COUNTERMODE_UP;
- HAL_TIM_PWM_Init(&TIM2_Handle);
+ timer_tim5_init();
// reset servo objects
for (int i = 0; i < PYB_SERVO_NUM; i++) {
@@ -74,17 +60,17 @@ void servo_timer_irq_callback(void) {
need_it = true;
}
switch (s->servo_id) {
- case 1: TIM2->CCR1 = s->pulse_cur; break;
- case 2: TIM2->CCR2 = s->pulse_cur; break;
- case 3: TIM2->CCR3 = s->pulse_cur; break;
- case 4: TIM2->CCR4 = s->pulse_cur; break;
+ case 1: TIM5->CCR1 = s->pulse_cur; break;
+ case 2: TIM5->CCR2 = s->pulse_cur; break;
+ case 3: TIM5->CCR3 = s->pulse_cur; break;
+ case 4: TIM5->CCR4 = s->pulse_cur; break;
}
}
}
if (need_it) {
- __HAL_TIM_ENABLE_IT(&TIM2_Handle, TIM_IT_UPDATE);
+ __HAL_TIM_ENABLE_IT(&TIM5_Handle, TIM_IT_UPDATE);
} else {
- __HAL_TIM_DISABLE_IT(&TIM2_Handle, TIM_IT_UPDATE);
+ __HAL_TIM_DISABLE_IT(&TIM5_Handle, TIM_IT_UPDATE);
}
}
@@ -105,7 +91,7 @@ STATIC void servo_init_channel(pyb_servo_obj_t *s) {
GPIO_InitStructure.Mode = GPIO_MODE_AF_PP;
GPIO_InitStructure.Speed = GPIO_SPEED_FAST;
GPIO_InitStructure.Pull = GPIO_NOPULL;
- GPIO_InitStructure.Alternate = GPIO_AF1_TIM2;
+ GPIO_InitStructure.Alternate = GPIO_AF2_TIM5;
HAL_GPIO_Init(GPIOA, &GPIO_InitStructure);
// PWM mode configuration
@@ -114,10 +100,10 @@ STATIC void servo_init_channel(pyb_servo_obj_t *s) {
oc_init.Pulse = s->pulse_cur; // units of 10us
oc_init.OCPolarity = TIM_OCPOLARITY_HIGH;
oc_init.OCFastMode = TIM_OCFAST_DISABLE;
- HAL_TIM_PWM_ConfigChannel(&TIM2_Handle, &oc_init, channel);
+ HAL_TIM_PWM_ConfigChannel(&TIM5_Handle, &oc_init, channel);
// start PWM
- HAL_TIM_PWM_Start(&TIM2_Handle, channel);
+ HAL_TIM_PWM_Start(&TIM5_Handle, channel);
}
/******************************************************************************/
@@ -129,10 +115,10 @@ STATIC mp_obj_t pyb_servo_set(mp_obj_t port, mp_obj_t value) {
if (v < 50) { v = 50; }
if (v > 250) { v = 250; }
switch (p) {
- case 1: TIM2->CCR1 = v; break;
- case 2: TIM2->CCR2 = v; break;
- case 3: TIM2->CCR3 = v; break;
- case 4: TIM2->CCR4 = v; break;
+ case 1: TIM5->CCR1 = v; break;
+ case 2: TIM5->CCR2 = v; break;
+ case 3: TIM5->CCR3 = v; break;
+ case 4: TIM5->CCR4 = v; break;
}
return mp_const_none;
}
@@ -142,8 +128,8 @@ MP_DEFINE_CONST_FUN_OBJ_2(pyb_servo_set_obj, pyb_servo_set);
STATIC mp_obj_t pyb_pwm_set(mp_obj_t period, mp_obj_t pulse) {
int pe = mp_obj_get_int(period);
int pu = mp_obj_get_int(pulse);
- TIM2->ARR = pe;
- TIM2->CCR3 = pu;
+ TIM5->ARR = pe;
+ TIM5->CCR3 = pu;
return mp_const_none;
}