2727int numTimersUsed = 0 ;
2828TIM_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
3135int numMotorsUsed = 0 ;
3236STM32DriverParams* motorsUsed[SIMPLEFOC_STM32_MAX_MOTORSUSED];
@@ -38,6 +42,16 @@ int stm32_getNumTimersUsed() {
3842int 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+ }
4155bool 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}
5165bool 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
7195TIM_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;
0 commit comments