Skip to content

Commit 61b3007

Browse files
Tjeerdiefpistm
authored andcommitted
[Timer] Add channels support
1 parent c293ece commit 61b3007

File tree

2 files changed

+101
-36
lines changed

2 files changed

+101
-36
lines changed

cores/arduino/stm32/timer.c

+96-36
Original file line numberDiff line numberDiff line change
@@ -811,10 +811,11 @@ uint32_t getTimerClkFreq(TIM_TypeDef *tim)
811811
*/
812812
void 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 (*
859839
void 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 */

cores/arduino/stm32/timer.h

+5
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,10 @@ struct timer_s {
6868
uint8_t idx;
6969
void (*irqHandle)(stimer_t *);
7070
void (*irqHandleOC)(stimer_t *, uint32_t);
71+
void (*irqHandleOC_CH1)(void);
72+
void (*irqHandleOC_CH2)(void);
73+
void (*irqHandleOC_CH3)(void);
74+
void (*irqHandleOC_CH4)(void);
7175
PinName pin;
7276
volatile timerPinInfo_t pinInfo;
7377
};
@@ -216,6 +220,7 @@ uint8_t getTimerClkSrc(TIM_TypeDef *tim);
216220
uint32_t getTimerClkFreq(TIM_TypeDef *tim);
217221

218222
void attachIntHandle(stimer_t *obj, void (*irqHandle)(stimer_t *));
223+
void attachIntHandleOC(stimer_t *obj, void (*irqHandle)(void), uint16_t timChannel, uint16_t pulseWidth);
219224

220225
#ifdef __cplusplus
221226
}

0 commit comments

Comments
 (0)