@@ -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