Skip to content

Commit 6473a17

Browse files
committed
add ability to reserve timers so they don't get used for motors
1 parent 4d8fa4a commit 6473a17

File tree

2 files changed

+35
-1
lines changed

2 files changed

+35
-1
lines changed

src/drivers/hardware_specific/stm32/stm32_mcu.cpp

Lines changed: 29 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,10 @@
2727
int numTimersUsed = 0;
2828
TIM_HandleTypeDef* timersUsed[SIMPLEFOC_STM32_MAX_TIMERSUSED];
2929

30+
// reserve timers for other uses, so SimpleFOC doesn't use them for motors
31+
int numTimersReserved = 0;
32+
TIM_TypeDef* reservedTimers[SIMPLEFOC_STM32_MAX_TIMERSRESERVED];
33+
3034
// track drivers initialized via SimpleFOC - used to know which timer channels are used
3135
int numMotorsUsed = 0;
3236
STM32DriverParams* motorsUsed[SIMPLEFOC_STM32_MAX_MOTORSUSED];
@@ -38,6 +42,16 @@ int stm32_getNumTimersUsed() {
3842
int stm32_getNumMotorsUsed() {
3943
return numMotorsUsed;
4044
}
45+
int stm32_getNumTimersReserved() {
46+
return numTimersReserved;
47+
}
48+
bool stm32_isTimerReserved(TIM_TypeDef* timer) {
49+
for (int i=0; i<numTimersReserved; i++) {
50+
if (reservedTimers[i] == timer)
51+
return true;
52+
}
53+
return false;
54+
}
4155
bool stm32_isTimerUsed(TIM_HandleTypeDef* timer) {
4256
for (int i=0; i<numTimersUsed; i++) {
4357
if (timersUsed[i] == timer)
@@ -49,6 +63,9 @@ STM32DriverParams* stm32_getMotorUsed(int index) {
4963
return motorsUsed[index];
5064
}
5165
bool stm32_isChannelUsed(PinMap* pin) {
66+
if (stm32_isTimerReserved((TIM_TypeDef*)pin->peripheral)) {
67+
return true;
68+
}
5269
for (int i=0; i<numMotorsUsed; i++) {
5370
for (int j=0; j<6; j++) {
5471
if (motorsUsed[i]->timers_handle[j] == NULL) break;
@@ -65,7 +82,14 @@ TIM_HandleTypeDef* stm32_getTimer(PinMap* timer) {
6582
}
6683
return NULL;
6784
}
68-
85+
bool stm32_reserveTimer(TIM_TypeDef* timer) {
86+
if (numTimersReserved >= SIMPLEFOC_STM32_MAX_TIMERSRESERVED) {
87+
SIMPLEFOC_DEBUG("STM32-DRV: ERR: too many timers reserved");
88+
return false;
89+
}
90+
reservedTimers[numTimersReserved++] = timer;
91+
return true;
92+
}
6993
// function to get a timer handle given the pinmap entry of the pin you want to use
7094
// after calling this function, the timer is marked as used by SimpleFOC
7195
TIM_HandleTypeDef* stm32_useTimer(PinMap* timer) {
@@ -75,6 +99,10 @@ TIM_HandleTypeDef* stm32_useTimer(PinMap* timer) {
7599
SIMPLEFOC_DEBUG("STM32-DRV: ERR: too many timers used");
76100
return NULL;
77101
}
102+
if (stm32_isTimerReserved((TIM_TypeDef*)timer->peripheral)) {
103+
SIMPLEFOC_DEBUG("STM32-DRV: ERR: timer reserved");
104+
return NULL;
105+
}
78106
handle = new TIM_HandleTypeDef();
79107
handle->Instance = (TIM_TypeDef*)timer->peripheral;
80108
handle->Channel = HAL_TIM_ACTIVE_CHANNEL_CLEARED;

src/drivers/hardware_specific/stm32/stm32_mcu.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,9 @@
88
#ifndef SIMPLEFOC_STM32_MAX_TIMERSUSED
99
#define SIMPLEFOC_STM32_MAX_TIMERSUSED 6
1010
#endif
11+
#ifndef SIMPLEFOC_STM32_MAX_TIMERSRESERVED
12+
#define SIMPLEFOC_STM32_MAX_TIMERSRESERVED 4
13+
#endif
1114
#ifndef SIMPLEFOC_STM32_MAX_MOTORSUSED
1215
#define SIMPLEFOC_STM32_MAX_MOTORSUSED 4
1316
#endif
@@ -53,11 +56,14 @@ typedef struct STM32DriverParams {
5356
// timer allocation functions
5457
int stm32_getNumTimersUsed();
5558
int stm32_getNumMotorsUsed();
59+
int stm32_getNumTimersReserved();
5660
STM32DriverParams* stm32_getMotorUsed(int index);
5761
bool stm32_isTimerUsed(TIM_HandleTypeDef* timer);
5862
bool stm32_isChannelUsed(PinMap* pin);
63+
bool stm32_isTimerReserved(TIM_TypeDef* timer);
5964
TIM_HandleTypeDef* stm32_getTimer(PinMap* timer);
6065
TIM_HandleTypeDef* stm32_useTimer(PinMap* timer);
66+
bool stm32_reserveTimer(TIM_TypeDef* timer);
6167

6268
void stm32_pause(STM32DriverParams* params);
6369
void stm32_resume(STM32DriverParams* params);

0 commit comments

Comments
 (0)