27
27
int numTimersUsed = 0 ;
28
28
TIM_HandleTypeDef* timersUsed[SIMPLEFOC_STM32_MAX_TIMERSUSED];
29
29
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
+
30
34
// track drivers initialized via SimpleFOC - used to know which timer channels are used
31
35
int numMotorsUsed = 0 ;
32
36
STM32DriverParams* motorsUsed[SIMPLEFOC_STM32_MAX_MOTORSUSED];
@@ -38,6 +42,16 @@ int stm32_getNumTimersUsed() {
38
42
int stm32_getNumMotorsUsed () {
39
43
return numMotorsUsed;
40
44
}
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
+ }
41
55
bool stm32_isTimerUsed (TIM_HandleTypeDef* timer) {
42
56
for (int i=0 ; i<numTimersUsed; i++) {
43
57
if (timersUsed[i] == timer)
@@ -49,6 +63,9 @@ STM32DriverParams* stm32_getMotorUsed(int index) {
49
63
return motorsUsed[index];
50
64
}
51
65
bool stm32_isChannelUsed (PinMap* pin) {
66
+ if (stm32_isTimerReserved ((TIM_TypeDef*)pin->peripheral )) {
67
+ return true ;
68
+ }
52
69
for (int i=0 ; i<numMotorsUsed; i++) {
53
70
for (int j=0 ; j<6 ; j++) {
54
71
if (motorsUsed[i]->timers_handle [j] == NULL ) break ;
@@ -65,7 +82,14 @@ TIM_HandleTypeDef* stm32_getTimer(PinMap* timer) {
65
82
}
66
83
return NULL ;
67
84
}
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
+ }
69
93
// function to get a timer handle given the pinmap entry of the pin you want to use
70
94
// after calling this function, the timer is marked as used by SimpleFOC
71
95
TIM_HandleTypeDef* stm32_useTimer (PinMap* timer) {
@@ -75,6 +99,10 @@ TIM_HandleTypeDef* stm32_useTimer(PinMap* timer) {
75
99
SIMPLEFOC_DEBUG (" STM32-DRV: ERR: too many timers used" );
76
100
return NULL ;
77
101
}
102
+ if (stm32_isTimerReserved ((TIM_TypeDef*)timer->peripheral )) {
103
+ SIMPLEFOC_DEBUG (" STM32-DRV: ERR: timer reserved" );
104
+ return NULL ;
105
+ }
78
106
handle = new TIM_HandleTypeDef ();
79
107
handle->Instance = (TIM_TypeDef*)timer->peripheral ;
80
108
handle->Channel = HAL_TIM_ACTIVE_CHANNEL_CLEARED;
0 commit comments