Increase STM32F1 Servo Timer Interrupt Priority (#18637)
This commit is contained in:
parent
c9718504c5
commit
95b76a65c3
3 changed files with 18 additions and 6 deletions
|
@ -74,6 +74,7 @@ void libServo::servoWrite(uint8_t inPin, uint16_t duty_cycle) {
|
||||||
|
|
||||||
libServo::libServo() {
|
libServo::libServo() {
|
||||||
servoIndex = ServoCount < MAX_SERVOS ? ServoCount++ : INVALID_SERVO;
|
servoIndex = ServoCount < MAX_SERVOS ? ServoCount++ : INVALID_SERVO;
|
||||||
|
timer_set_interrupt_priority(SERVO0_TIMER_NUM, SERVO0_TIMER_IRQ_PRIO);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool libServo::attach(const int32_t inPin, const int32_t inMinAngle, const int32_t inMaxAngle) {
|
bool libServo::attach(const int32_t inPin, const int32_t inMinAngle, const int32_t inMaxAngle) {
|
||||||
|
|
|
@ -47,7 +47,10 @@
|
||||||
* TODO: Calculate Timer prescale value, so we get the 32bit to adjust
|
* TODO: Calculate Timer prescale value, so we get the 32bit to adjust
|
||||||
*/
|
*/
|
||||||
|
|
||||||
void HAL_timer_start(const uint8_t timer_num, const uint32_t frequency) {
|
|
||||||
|
|
||||||
|
|
||||||
|
void timer_set_interrupt_priority(uint_fast8_t timer_num, uint_fast8_t priority) {
|
||||||
nvic_irq_num irq_num;
|
nvic_irq_num irq_num;
|
||||||
switch (timer_num) {
|
switch (timer_num) {
|
||||||
case 1: irq_num = NVIC_TIMER1_CC; break;
|
case 1: irq_num = NVIC_TIMER1_CC; break;
|
||||||
|
@ -64,9 +67,14 @@ void HAL_timer_start(const uint8_t timer_num, const uint32_t frequency) {
|
||||||
* This should never happen. Add a Sanitycheck for timer number.
|
* This should never happen. Add a Sanitycheck for timer number.
|
||||||
* Should be a general timer since basic timers have no CC channels.
|
* Should be a general timer since basic timers have no CC channels.
|
||||||
*/
|
*/
|
||||||
break;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
nvic_irq_set_priority(irq_num, priority);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void HAL_timer_start(const uint8_t timer_num, const uint32_t frequency) {
|
||||||
/**
|
/**
|
||||||
* Give the Stepper ISR a higher priority (lower number)
|
* Give the Stepper ISR a higher priority (lower number)
|
||||||
* so it automatically preempts the Temperature ISR.
|
* so it automatically preempts the Temperature ISR.
|
||||||
|
@ -83,7 +91,7 @@ void HAL_timer_start(const uint8_t timer_num, const uint32_t frequency) {
|
||||||
timer_set_compare(STEP_TIMER_DEV, STEP_TIMER_CHAN, _MIN(hal_timer_t(HAL_TIMER_TYPE_MAX), (STEPPER_TIMER_RATE) / frequency));
|
timer_set_compare(STEP_TIMER_DEV, STEP_TIMER_CHAN, _MIN(hal_timer_t(HAL_TIMER_TYPE_MAX), (STEPPER_TIMER_RATE) / frequency));
|
||||||
timer_no_ARR_preload_ARPE(STEP_TIMER_DEV); // Need to be sure no preload on ARR register
|
timer_no_ARR_preload_ARPE(STEP_TIMER_DEV); // Need to be sure no preload on ARR register
|
||||||
timer_attach_interrupt(STEP_TIMER_DEV, STEP_TIMER_CHAN, stepTC_Handler);
|
timer_attach_interrupt(STEP_TIMER_DEV, STEP_TIMER_CHAN, stepTC_Handler);
|
||||||
nvic_irq_set_priority(irq_num, STEP_TIMER_IRQ_PRIO);
|
timer_set_interrupt_priority(STEP_TIMER_NUM, STEP_TIMER_IRQ_PRIO);
|
||||||
timer_generate_update(STEP_TIMER_DEV);
|
timer_generate_update(STEP_TIMER_DEV);
|
||||||
timer_resume(STEP_TIMER_DEV);
|
timer_resume(STEP_TIMER_DEV);
|
||||||
break;
|
break;
|
||||||
|
@ -95,7 +103,7 @@ void HAL_timer_start(const uint8_t timer_num, const uint32_t frequency) {
|
||||||
timer_set_reload(TEMP_TIMER_DEV, 0xFFFF);
|
timer_set_reload(TEMP_TIMER_DEV, 0xFFFF);
|
||||||
timer_set_compare(TEMP_TIMER_DEV, TEMP_TIMER_CHAN, _MIN(hal_timer_t(HAL_TIMER_TYPE_MAX), (F_CPU) / (TEMP_TIMER_PRESCALE) / frequency));
|
timer_set_compare(TEMP_TIMER_DEV, TEMP_TIMER_CHAN, _MIN(hal_timer_t(HAL_TIMER_TYPE_MAX), (F_CPU) / (TEMP_TIMER_PRESCALE) / frequency));
|
||||||
timer_attach_interrupt(TEMP_TIMER_DEV, TEMP_TIMER_CHAN, tempTC_Handler);
|
timer_attach_interrupt(TEMP_TIMER_DEV, TEMP_TIMER_CHAN, tempTC_Handler);
|
||||||
nvic_irq_set_priority(irq_num, TEMP_TIMER_IRQ_PRIO);
|
timer_set_interrupt_priority(TEMP_TIMER_NUM, TEMP_TIMER_IRQ_PRIO);
|
||||||
timer_generate_update(TEMP_TIMER_DEV);
|
timer_generate_update(TEMP_TIMER_DEV);
|
||||||
timer_resume(TEMP_TIMER_DEV);
|
timer_resume(TEMP_TIMER_DEV);
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -91,8 +91,9 @@ typedef uint16_t hal_timer_t;
|
||||||
#define SERVO0_TIMER_NUM 1 // SERVO0 or BLTOUCH
|
#define SERVO0_TIMER_NUM 1 // SERVO0 or BLTOUCH
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define STEP_TIMER_IRQ_PRIO 1
|
#define STEP_TIMER_IRQ_PRIO 2
|
||||||
#define TEMP_TIMER_IRQ_PRIO 2
|
#define TEMP_TIMER_IRQ_PRIO 3
|
||||||
|
#define SERVO0_TIMER_IRQ_PRIO 1
|
||||||
|
|
||||||
#define TEMP_TIMER_PRESCALE 1000 // prescaler for setting Temp timer, 72Khz
|
#define TEMP_TIMER_PRESCALE 1000 // prescaler for setting Temp timer, 72Khz
|
||||||
#define TEMP_TIMER_FREQUENCY 1000 // temperature interrupt frequency
|
#define TEMP_TIMER_FREQUENCY 1000 // temperature interrupt frequency
|
||||||
|
@ -193,4 +194,6 @@ FORCE_INLINE static void timer_no_ARR_preload_ARPE(timer_dev *dev) {
|
||||||
bb_peri_set_bit(&(dev->regs).gen->CR1, TIMER_CR1_ARPE_BIT, 0);
|
bb_peri_set_bit(&(dev->regs).gen->CR1, TIMER_CR1_ARPE_BIT, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void timer_set_interrupt_priority(uint_fast8_t timer_num, uint_fast8_t priority);
|
||||||
|
|
||||||
#define TIMER_OC_NO_PRELOAD 0 // Need to disable preload also on compare registers.
|
#define TIMER_OC_NO_PRELOAD 0 // Need to disable preload also on compare registers.
|
||||||
|
|
Reference in a new issue