@@ -558,8 +558,10 @@ uint32_t getTimerIrq(TIM_TypeDef* tim)
558
558
*/
559
559
void TimerHandleDeinit (stimer_t * obj )
560
560
{
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
+ }
563
565
}
564
566
565
567
/**
@@ -855,32 +857,16 @@ void HAL_TIM_OC_DelayElapsedCallback(TIM_HandleTypeDef *htim)
855
857
*/
856
858
void HAL_TIMx_PeriodElapsedCallback (stimer_t * obj )
857
859
{
860
+ GPIO_TypeDef * port = get_GPIO_Port (STM_PORT (obj -> pin ));
858
861
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 );
881
867
}
882
868
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 );
884
870
}
885
871
}
886
872
}
@@ -916,13 +902,19 @@ void TimerPinInit(stimer_t *obj, uint32_t frequency, uint32_t duration)
916
902
uint32_t timFreq = 2 * frequency ;
917
903
uint32_t prescaler = 1 ;
918
904
uint32_t period = 0 ;
905
+ uint32_t scale = 0 ;
919
906
920
907
if (frequency > MAX_FREQ )
921
908
return ;
922
909
923
910
obj -> timer = TIMER_TONE ;
924
911
obj -> pinInfo .state = 0 ;
925
912
913
+ if (frequency == 0 ) {
914
+ TimerPinDeinit (obj );
915
+ return ;
916
+ }
917
+
926
918
//Calculate the toggle count
927
919
if (duration > 0 ) {
928
920
obj -> pinInfo .count = ((timFreq * duration ) / 1000 );
@@ -934,8 +926,10 @@ void TimerPinInit(stimer_t *obj, uint32_t frequency, uint32_t duration)
934
926
digital_io_init (obj -> pin , GPIO_MODE_OUTPUT_PP , GPIO_NOPULL );
935
927
timClkFreq = getTimerClkFreq (obj -> timer );
936
928
929
+ // Do this once
930
+ scale = timClkFreq / timFreq ;
937
931
while (end == 0 ) {
938
- period = ((uint32_t )( timClkFreq / timFreq / prescaler )) - 1 ;
932
+ period = ((uint32_t )( scale / prescaler )) - 1 ;
939
933
940
934
if ((period >= 0xFFFF ) && (prescaler < 0xFFFF ))
941
935
prescaler ++ ; //prescaler *= 2;
@@ -962,6 +956,7 @@ void TimerPinInit(stimer_t *obj, uint32_t frequency, uint32_t duration)
962
956
void TimerPinDeinit (stimer_t * obj )
963
957
{
964
958
TimerHandleDeinit (obj );
959
+ digital_io_init (obj -> pin , GPIO_MODE_INPUT , GPIO_NOPULL );
965
960
}
966
961
967
962
/**
0 commit comments