@@ -558,8 +558,10 @@ uint32_t getTimerIrq(TIM_TypeDef* tim)
558558  */ 
559559void  TimerHandleDeinit (stimer_t  * obj )
560560{
561-   HAL_TIM_Base_DeInit (& (obj -> handle ));
562-   HAL_TIM_Base_Stop_IT (& (obj -> handle ));
561+   if (obj  !=  NULL ) {
562+     HAL_TIM_Base_DeInit (& (obj -> handle ));
563+     HAL_TIM_Base_Stop_IT (& (obj -> handle ));
564+   }
563565}
564566
565567/** 
@@ -855,32 +857,16 @@ void HAL_TIM_OC_DelayElapsedCallback(TIM_HandleTypeDef *htim)
855857  */ 
856858void  HAL_TIMx_PeriodElapsedCallback (stimer_t  * obj )
857859{
860+   GPIO_TypeDef *  port  =  get_GPIO_Port (STM_PORT (obj -> pin ));
858861
859-   if (get_GPIO_Port (STM_PORT (obj -> pin )) !=  NULL ) {
860-     if (obj -> pinInfo .count  >  0 ){
861-       obj -> pinInfo .count -- ;
862- 
863-       if (obj -> pinInfo .state  ==  0 ) {
864-         obj -> pinInfo .state  =  1 ;
865-         digital_io_write (get_GPIO_Port (STM_PORT (obj -> pin )), STM_GPIO_PIN (obj -> pin ), 1 );
866-       }
867-       else  {
868-         obj -> pinInfo .state  =  0 ;
869-         digital_io_write (get_GPIO_Port (STM_PORT (obj -> pin )), STM_GPIO_PIN (obj -> pin ), 0 );
870-       }
871-     }
872-     else  if (obj -> pinInfo .count  ==  -1 ) {
873-       if (obj -> pinInfo .state  ==  0 ) {
874-         obj -> pinInfo .state  =  1 ;
875-         digital_io_write (get_GPIO_Port (STM_PORT (obj -> pin )), STM_GPIO_PIN (obj -> pin ), 1 );
876-       }
877-       else  {
878-         obj -> pinInfo .state  =  0 ;
879-         digital_io_write (get_GPIO_Port (STM_PORT (obj -> pin )), STM_GPIO_PIN (obj -> pin ), 0 );
880-       }
862+   if (port  !=  NULL ) {
863+     if (obj -> pinInfo .count  !=  0 ){
864+       if  (obj -> pinInfo .count  >  0 ) obj -> pinInfo .count -- ;
865+       obj -> pinInfo .state  =  (obj -> pinInfo .state  ==  0 )? 1  : 0 ;
866+       digital_io_write (port , STM_GPIO_PIN (obj -> pin ), obj -> pinInfo .state );
881867    }
882868    else  {
883-       digital_io_write (get_GPIO_Port ( STM_PORT ( obj -> pin )) , STM_GPIO_PIN (obj -> pin ), 0 );
869+       digital_io_write (port , STM_GPIO_PIN (obj -> pin ), 0 );
884870    }
885871  }
886872}
@@ -916,13 +902,19 @@ void TimerPinInit(stimer_t *obj, uint32_t frequency, uint32_t duration)
916902  uint32_t  timFreq  =  2 * frequency ;
917903  uint32_t  prescaler  =  1 ;
918904  uint32_t  period  =  0 ;
905+   uint32_t  scale  =  0 ;
919906
920907  if (frequency  >  MAX_FREQ )
921908    return ;
922909
923910  obj -> timer  =  TIMER_TONE ;
924911  obj -> pinInfo .state  =  0 ;
925912
913+   if (frequency  ==  0 ) {
914+     TimerPinDeinit (obj );
915+     return ;
916+   }
917+ 
926918  //Calculate the toggle count 
927919  if  (duration  >  0 ) {
928920    obj -> pinInfo .count  =  ((timFreq  *  duration ) / 1000 );
@@ -934,8 +926,10 @@ void TimerPinInit(stimer_t *obj, uint32_t frequency, uint32_t duration)
934926  digital_io_init (obj -> pin , GPIO_MODE_OUTPUT_PP , GPIO_NOPULL );
935927  timClkFreq  =  getTimerClkFreq (obj -> timer );
936928
929+   // Do this once 
930+   scale  =  timClkFreq  / timFreq ;
937931  while (end  ==  0 ) {
938-     period  =  ((uint32_t )( timClkFreq  /  timFreq  / prescaler )) -  1 ;
932+     period  =  ((uint32_t )( scale  / prescaler )) -  1 ;
939933
940934    if ((period  >= 0xFFFF ) &&  (prescaler  <  0xFFFF ))
941935      prescaler ++ ; //prescaler *= 2; 
@@ -962,6 +956,7 @@ void TimerPinInit(stimer_t *obj, uint32_t frequency, uint32_t duration)
962956void  TimerPinDeinit (stimer_t  * obj )
963957{
964958  TimerHandleDeinit (obj );
959+   digital_io_init (obj -> pin , GPIO_MODE_INPUT , GPIO_NOPULL );
965960}
966961
967962/** 
0 commit comments