@@ -811,10 +811,11 @@ uint32_t getTimerClkFreq(TIM_TypeDef *tim)
811
811
*/
812
812
void TimerPulseInit (stimer_t * obj , uint16_t period , uint16_t pulseWidth , void (* irqHandle )(stimer_t * , uint32_t ))
813
813
{
814
- TIM_OC_InitTypeDef sConfig = {};
815
814
TIM_HandleTypeDef * handle = & (obj -> handle );
816
815
817
- obj -> timer = TIMER_SERVO ;
816
+ if (obj -> timer == NULL ) {
817
+ obj -> timer = TIMER_SERVO ;
818
+ }
818
819
819
820
//min pulse = 1us - max pulse = 65535us
820
821
handle -> Instance = obj -> timer ;
@@ -827,28 +828,7 @@ void TimerPulseInit(stimer_t *obj, uint16_t period, uint16_t pulseWidth, void (*
827
828
#endif
828
829
obj -> irqHandleOC = irqHandle ;
829
830
830
- sConfig .OCMode = TIM_OCMODE_TIMING ;
831
- sConfig .Pulse = pulseWidth ;
832
- sConfig .OCPolarity = TIM_OCPOLARITY_HIGH ;
833
- sConfig .OCFastMode = TIM_OCFAST_DISABLE ;
834
- #if !defined(STM32L0xx ) && !defined(STM32L1xx )
835
- sConfig .OCNPolarity = TIM_OCNPOLARITY_HIGH ;
836
- sConfig .OCIdleState = TIM_OCIDLESTATE_RESET ;
837
- sConfig .OCNIdleState = TIM_OCNIDLESTATE_RESET ;
838
- #endif
839
- HAL_NVIC_SetPriority (getTimerIrq (obj -> timer ), 14 , 0 );
840
- HAL_NVIC_EnableIRQ (getTimerIrq (obj -> timer ));
841
-
842
- if (HAL_TIM_OC_Init (handle ) != HAL_OK ) {
843
- return ;
844
- }
845
-
846
- if (HAL_TIM_OC_ConfigChannel (handle , & sConfig , TIM_CHANNEL_1 ) != HAL_OK ) {
847
- return ;
848
- }
849
- if (HAL_TIM_OC_Start_IT (handle , TIM_CHANNEL_1 ) != HAL_OK ) {
850
- return ;
851
- }
831
+ attachIntHandleOC (obj , NULL , 1 , pulseWidth );
852
832
}
853
833
854
834
/**
@@ -859,8 +839,11 @@ void TimerPulseInit(stimer_t *obj, uint16_t period, uint16_t pulseWidth, void (*
859
839
void TimerPulseDeinit (stimer_t * obj )
860
840
{
861
841
TIM_HandleTypeDef * handle = & (obj -> handle );
862
-
863
842
obj -> irqHandleOC = NULL ;
843
+ obj -> irqHandleOC_CH1 = NULL ;
844
+ obj -> irqHandleOC_CH2 = NULL ;
845
+ obj -> irqHandleOC_CH3 = NULL ;
846
+ obj -> irqHandleOC_CH4 = NULL ;
864
847
865
848
HAL_NVIC_DisableIRQ (getTimerIrq (obj -> timer ));
866
849
@@ -915,17 +898,36 @@ void HAL_TIM_OC_DelayElapsedCallback(TIM_HandleTypeDef *htim)
915
898
{
916
899
uint32_t channel = 0 ;
917
900
stimer_t * obj = get_timer_obj (htim );
918
-
919
- if (obj -> irqHandleOC != NULL ) {
920
- switch (htim -> Channel ) {
921
- case HAL_TIM_ACTIVE_CHANNEL_1 :
922
- channel = TIM_CHANNEL_1 / 4 ;
923
- break ;
924
- default :
925
- return ;
926
- break ;
927
- }
928
- obj -> irqHandleOC (obj , channel );
901
+ switch (htim -> Channel ) {
902
+ case HAL_TIM_ACTIVE_CHANNEL_1 :
903
+ channel = TIM_CHANNEL_1 / 4 ;
904
+ if (obj -> irqHandleOC_CH1 != NULL ) {
905
+ obj -> irqHandleOC_CH1 ();
906
+ }
907
+ if (obj -> irqHandleOC != NULL ) {
908
+ obj -> irqHandleOC (obj , channel );
909
+ }
910
+ break ;
911
+ case HAL_TIM_ACTIVE_CHANNEL_2 :
912
+ channel = TIM_CHANNEL_2 / 4 ;
913
+ if (obj -> irqHandleOC_CH2 != NULL ) {
914
+ obj -> irqHandleOC_CH2 ();
915
+ }
916
+ break ;
917
+ case HAL_TIM_ACTIVE_CHANNEL_3 :
918
+ if (obj -> irqHandleOC_CH3 != NULL ) {
919
+ obj -> irqHandleOC_CH3 ();
920
+ }
921
+ channel = TIM_CHANNEL_3 / 4 ;
922
+ break ;
923
+ case HAL_TIM_ACTIVE_CHANNEL_4 :
924
+ if (obj -> irqHandleOC_CH4 != NULL ) {
925
+ obj -> irqHandleOC_CH4 ();
926
+ }
927
+ channel = TIM_CHANNEL_4 / 4 ;
928
+ break ;
929
+ default :
930
+ break ;
929
931
}
930
932
}
931
933
@@ -1095,6 +1097,64 @@ void attachIntHandle(stimer_t *obj, void (*irqHandle)(stimer_t *))
1095
1097
obj -> irqHandle = irqHandle ;
1096
1098
}
1097
1099
1100
+ /**
1101
+ * @brief This function will attach timer interrupt to with a particular duty cycle on channel x
1102
+ * @param timer_id : timer_id_e
1103
+ * @param irqHandle : interrupt routine to call
1104
+ * @param timChannel : timer channel
1105
+ * @param pulseWidth : phase of the timer where the callback will happen
1106
+ * @retval None
1107
+ */
1108
+ void attachIntHandleOC (stimer_t * obj , void (* irqHandle )(void ), uint16_t timChannel , uint16_t pulseWidth )
1109
+ {
1110
+ TIM_OC_InitTypeDef sConfig = {};
1111
+ TIM_HandleTypeDef * handle = & (obj -> handle );
1112
+
1113
+ sConfig .OCMode = TIM_OCMODE_TIMING ;
1114
+ sConfig .Pulse = pulseWidth ;
1115
+ sConfig .OCPolarity = TIM_OCPOLARITY_HIGH ;
1116
+ sConfig .OCFastMode = TIM_OCFAST_DISABLE ;
1117
+ #if !defined(STM32L0xx ) && !defined(STM32L1xx )
1118
+ sConfig .OCNPolarity = TIM_OCNPOLARITY_HIGH ;
1119
+ sConfig .OCIdleState = TIM_OCIDLESTATE_RESET ;
1120
+ sConfig .OCNIdleState = TIM_OCNIDLESTATE_RESET ;
1121
+ #endif
1122
+ HAL_NVIC_SetPriority (getTimerIrq (obj -> timer ), 14 , 0 );
1123
+ HAL_NVIC_EnableIRQ (getTimerIrq (obj -> timer ));
1124
+
1125
+ if (HAL_TIM_OC_Init (handle ) != HAL_OK ) {
1126
+ return ;
1127
+ }
1128
+ switch (timChannel ) {
1129
+ case 1 :
1130
+ obj -> irqHandleOC_CH1 = irqHandle ;
1131
+ if (HAL_TIM_OC_ConfigChannel (handle , & sConfig , TIM_CHANNEL_1 ) == HAL_OK ) {
1132
+ HAL_TIM_OC_Start_IT (handle , TIM_CHANNEL_1 );
1133
+ }
1134
+ break ;
1135
+ case 2 :
1136
+ obj -> irqHandleOC_CH2 = irqHandle ;
1137
+ if (HAL_TIM_OC_ConfigChannel (handle , & sConfig , TIM_CHANNEL_2 ) != HAL_OK ) {
1138
+ HAL_TIM_OC_Start_IT (handle , TIM_CHANNEL_2 );
1139
+ }
1140
+ break ;
1141
+ case 3 :
1142
+ obj -> irqHandleOC_CH3 = irqHandle ;
1143
+ if (HAL_TIM_OC_ConfigChannel (handle , & sConfig , TIM_CHANNEL_3 ) != HAL_OK ) {
1144
+ HAL_TIM_OC_Start_IT (handle , TIM_CHANNEL_3 );
1145
+ }
1146
+ break ;
1147
+ case 4 :
1148
+ obj -> irqHandleOC_CH4 = irqHandle ;
1149
+ if (HAL_TIM_OC_ConfigChannel (handle , & sConfig , TIM_CHANNEL_4 ) != HAL_OK ) {
1150
+ HAL_TIM_OC_Start_IT (handle , TIM_CHANNEL_4 );
1151
+ }
1152
+ break ;
1153
+ default :
1154
+ break ;
1155
+ }
1156
+ return ;
1157
+ }
1098
1158
1099
1159
/******************************************************************************/
1100
1160
/* TIMx IRQ HANDLER */
0 commit comments