@@ -811,10 +811,11 @@ uint32_t getTimerClkFreq(TIM_TypeDef *tim)
811811 */
812812void TimerPulseInit (stimer_t * obj , uint16_t period , uint16_t pulseWidth , void (* irqHandle )(stimer_t * , uint32_t ))
813813{
814- TIM_OC_InitTypeDef sConfig = {};
815814 TIM_HandleTypeDef * handle = & (obj -> handle );
816815
817- obj -> timer = TIMER_SERVO ;
816+ if (obj -> timer == NULL ) {
817+ obj -> timer = TIMER_SERVO ;
818+ }
818819
819820 //min pulse = 1us - max pulse = 65535us
820821 handle -> Instance = obj -> timer ;
@@ -827,28 +828,7 @@ void TimerPulseInit(stimer_t *obj, uint16_t period, uint16_t pulseWidth, void (*
827828#endif
828829 obj -> irqHandleOC = irqHandle ;
829830
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 );
852832}
853833
854834/**
@@ -859,8 +839,11 @@ void TimerPulseInit(stimer_t *obj, uint16_t period, uint16_t pulseWidth, void (*
859839void TimerPulseDeinit (stimer_t * obj )
860840{
861841 TIM_HandleTypeDef * handle = & (obj -> handle );
862-
863842 obj -> irqHandleOC = NULL ;
843+ obj -> irqHandleOC_CH1 = NULL ;
844+ obj -> irqHandleOC_CH2 = NULL ;
845+ obj -> irqHandleOC_CH3 = NULL ;
846+ obj -> irqHandleOC_CH4 = NULL ;
864847
865848 HAL_NVIC_DisableIRQ (getTimerIrq (obj -> timer ));
866849
@@ -915,17 +898,36 @@ void HAL_TIM_OC_DelayElapsedCallback(TIM_HandleTypeDef *htim)
915898{
916899 uint32_t channel = 0 ;
917900 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 ;
929931 }
930932}
931933
@@ -1095,6 +1097,64 @@ void attachIntHandle(stimer_t *obj, void (*irqHandle)(stimer_t *))
10951097 obj -> irqHandle = irqHandle ;
10961098}
10971099
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+ }
10981158
10991159/******************************************************************************/
11001160/* TIMx IRQ HANDLER */
0 commit comments