31 #include <oc_gpio_mslld.h> 41 #define _________________________________________LOCAL_MACROS_SECTION_______________________________________________________________________ 43 #define GPTMTAMR(Channel) oC_Machine_Register(Channel,GPTMTAMR) 44 #define GPTMTBMR(Channel) oC_Machine_Register(Channel,GPTMTBMR) 45 #define GPTMCTL(Channel) oC_Machine_Register(Channel,GPTMCTL) 46 #define GPTMPP(Channel) oC_Machine_Register(Channel,GPTMPP) 47 #define GPTMIMR(Channel) oC_Machine_Register(Channel,GPTMIMR) 48 #define GPTMMIS(Channel) oC_Machine_Register(Channel,GPTMMIS) 49 #define GPTMICR(Channel) oC_Machine_Register(Channel,GPTMICR) 51 #define IsChannelPoweredOn(Channel) (oC_Machine_GetPowerStateForChannel(Channel) == oC_Power_On) 52 #define IsChannelCorrect(channel) (oC_Channel_IsCorrect(TIMER,channel)) 53 #define MODE(Channel) Modes[oC_TIMER_LLD_ChannelToChannelIndex(Channel)] 56 #undef _________________________________________LOCAL_MACROS_SECTION_______________________________________________________________________ 63 #define _________________________________________LOCAL_TYPES_SECTION________________________________________________________________________ 67 GPTMTxMR_TxMR_Reserved = 0 ,
68 GPTMTxMR_TxMR_OneShotTimerMode = 0x1 ,
69 GPTMTxMR_TxMR_PeriodicTimerMode = 0x2 ,
70 GPTMTxMR_TxMR_CaptureMode = 0x3
75 GPTMCTL_TxEVENT_PositiveEdge = 0 ,
76 GPTMCTL_TxEVENT_NegativeEdge = 1 ,
77 GPTMCTL_TxEVENT_BothEdges = 3 ,
82 GPTMCFG_TimerWidth_Full = 0x0 ,
83 GPTMCFG_TimerWidth_FullRtc = 0x1 ,
84 GPTMCFG_TimerWidth_Half = 0x4
85 } GPTMCFG_TimerWidth_t;
89 GPTMTxMR_TxAMS_AlternateMode_CaptureOrCompare = 0 ,
90 GPTMTxMR_TxAMS_AlternateMode_Pwm = 1
91 } GPTMTxMR_TxAMS_AlternateMode_t;
95 GPTMTxMR_TxCMR_CaptureMode_EdgeCount = 0 ,
96 GPTMTxMR_TxCMR_CaptureMode_EdgeTime = 1
97 } GPTMTxMR_TxCMR_CaptureMode_t;
101 GPTMCTL_TxPWML_PwmOutput_Unaffected = 0 ,
102 GPTMCTL_TxPWML_PwmOutput_Inverted = 1
103 } GPTMCTL_TxPWML_PwmOutput_t;
107 GPTMTxMR_TxPWMIE_PwmInterruptEnable_Disabled = 0 ,
108 GPTMTxMR_TxPWMIE_PwmInterruptEnable_Enabled = 1
109 } GPTMTxMR_TxPWMIE_PwmInterruptEnable_t;
113 GPTMTxMR_TxPLO_PwmLegacyOperations_Disabled = 0 ,
114 GPTMTxMR_TxPLO_PwmLegacyOperations_Enabled = 1
115 } GPTMTxMR_TxPLO_PwmLegacyOperations_t;
119 GPTMCTL_TxEVENT_EventMode_PositiveEdge = 0 ,
120 GPTMCTL_TxEVENT_EventMode_NegativeEdge = 1 ,
121 GPTMCTL_TxEVENT_EventMode_BothEdges = 3
122 } GPTMCTL_TxEVENT_EventMode_t;
124 #undef _________________________________________LOCAL_TYPES_SECTION________________________________________________________________________ 132 #define _________________________________________LOCAL_VARIABLES_SECTION____________________________________________________________________ 144 #undef _________________________________________LOCAL_VARIABLES_SECTION____________________________________________________________________ 151 #define _________________________________________LOCAL_PROTOTYPES_SECTION_________________________________________________________________ 153 static inline bool IsModeSelected ( oC_TIMER_Channel_t Channel , oC_TIMER_LLD_SubTimer_t SubTimer );
154 static inline bool IsTimerEnabled ( oC_TIMER_Channel_t Channel );
155 static inline bool IsWideChannel ( oC_TIMER_Channel_t Channel );
156 static inline bool CanBeFullWidth ( oC_TIMER_Channel_t Channel , oC_TIMER_LLD_SubTimer_t SubTimer );
157 static inline void SetCountDirection ( oC_TIMER_Channel_t Channel , oC_TIMER_LLD_SubTimer_t SubTimer , oC_TIMER_LLD_CountDirection_t CountDirection );
158 static inline oC_TIMER_LLD_CountDirection_t GetCountDirection ( oC_TIMER_Channel_t Channel , oC_TIMER_LLD_SubTimer_t SubTimer );
159 static inline void SetTimersMode ( oC_TIMER_Channel_t Channel , oC_TIMER_LLD_SubTimer_t SubTimer , GPTMTxMR_TxMR_t Mode );
160 static inline void SetInputTrigger ( oC_TIMER_Channel_t Channel , oC_TIMER_LLD_SubTimer_t SubTimer , GPTMCTL_TxEVENT_t Trigger );
161 static inline GPTMCTL_TxEVENT_t GetInputTrigger ( oC_TIMER_Channel_t Channel , oC_TIMER_LLD_SubTimer_t SubTimer );
162 static inline void EnableTimer ( oC_TIMER_Channel_t Channel , oC_TIMER_LLD_SubTimer_t SubTimer );
163 static inline void DisableTimer ( oC_TIMER_Channel_t Channel , oC_TIMER_LLD_SubTimer_t SubTimer );
164 static void CallEvent ( oC_TIMER_Channel_t Channel ,
oC_ChannelIndex_t ChannelIndex , oC_TIMER_LLD_SubTimer_t SubTimer , oC_TIMER_LLD_EventFlags_t EventFlags );
165 static inline uint32_t GetPrescaler ( oC_TIMER_Channel_t Channel , oC_TIMER_LLD_SubTimer_t SubTimer );
166 static inline void SetTimerWidth ( oC_TIMER_Channel_t Channel , GPTMCFG_TimerWidth_t TimerWidth );
167 static inline GPTMCFG_TimerWidth_t GetTimerWidth ( oC_TIMER_Channel_t Channel );
168 static inline void SetMaxValue ( oC_TIMER_Channel_t Channel , oC_TIMER_LLD_SubTimer_t SubTimer , uint64_t MaxValue );
169 static inline uint64_t GetMaxValue ( oC_TIMER_Channel_t Channel , oC_TIMER_LLD_SubTimer_t SubTimer);
170 static inline void SetValue ( oC_TIMER_Channel_t Channel , oC_TIMER_LLD_SubTimer_t SubTimer , uint64_t Value );
171 static inline uint64_t GetValue ( oC_TIMER_Channel_t Channel , oC_TIMER_LLD_SubTimer_t SubTimer);
172 static inline void SetMatchValue ( oC_TIMER_Channel_t Channel , oC_TIMER_LLD_SubTimer_t SubTimer , uint64_t Value );
173 static inline uint64_t GetMatchValue ( oC_TIMER_Channel_t Channel , oC_TIMER_LLD_SubTimer_t SubTimer );
174 static inline void SetAlternateMode ( oC_TIMER_Channel_t Channel , oC_TIMER_LLD_SubTimer_t SubTimer , GPTMTxMR_TxAMS_AlternateMode_t Mode );
175 static inline void SetCaptureMode ( oC_TIMER_Channel_t Channel , oC_TIMER_LLD_SubTimer_t SubTimer , GPTMTxMR_TxCMR_CaptureMode_t Mode );
176 static inline void SetPwmOutput ( oC_TIMER_Channel_t Channel , oC_TIMER_LLD_SubTimer_t SubTimer , GPTMCTL_TxPWML_PwmOutput_t PwmOutput );
177 static inline GPTMCTL_TxPWML_PwmOutput_t GetPwmOutput ( oC_TIMER_Channel_t Channel , oC_TIMER_LLD_SubTimer_t SubTimer );
178 static void EnableEvents ( oC_TIMER_Channel_t Channel , oC_TIMER_LLD_SubTimer_t SubTimer , oC_TIMER_LLD_EventFlags_t EventFlags );
179 static void DisableEvents ( oC_TIMER_Channel_t Channel , oC_TIMER_LLD_SubTimer_t SubTimer , oC_TIMER_LLD_EventFlags_t EventFlags );
180 static void SetPwmInterrupt ( oC_TIMER_Channel_t Channel , oC_TIMER_LLD_SubTimer_t SubTimer , GPTMTxMR_TxPWMIE_PwmInterruptEnable_t Enabled );
181 static inline void SetPwmLegacyOperations ( oC_TIMER_Channel_t Channel , oC_TIMER_LLD_SubTimer_t SubTimer , GPTMTxMR_TxPLO_PwmLegacyOperations_t Enabled );
182 static inline oC_ErrorCode_t InitializeMode ( oC_TIMER_Channel_t Channel , oC_TIMER_LLD_SubTimer_t SubTimer , oC_TIMER_LLD_Mode_t Mode );
183 static oC_TIMER_LLD_Mode_t GetMode ( oC_TIMER_Channel_t Channel , oC_TIMER_LLD_SubTimer_t SubTimer );
184 static void SetMode ( oC_TIMER_Channel_t Channel , oC_TIMER_LLD_SubTimer_t SubTimer , oC_TIMER_LLD_Mode_t Mode );
185 static inline void SetEventMode ( oC_TIMER_Channel_t Channel , oC_TIMER_LLD_SubTimer_t SubTimer , GPTMCTL_TxEVENT_EventMode_t EventMode );
187 #undef _________________________________________LOCAL_PROTOTYPES_SECTION_________________________________________________________________ 195 #define _________________________________________INTERFACE_FUNCTIONS_SECTION________________________________________________________________ 203 oC_ErrorCode_t oC_TIMER_LLD_TurnOnDriver(
void )
205 oC_ErrorCode_t errorCode = oC_ErrorCode_ImplementError;
207 if(oC_AssignErrorCodeIfFalse(&errorCode , !
ModuleEnabledFlag , oC_ErrorCode_ModuleIsTurnedOn))
209 oC_TIMER_LLD_ForEachChannel(Channel)
212 EventHandlers[channelIndex][0] =
NULL;
213 EventHandlers[channelIndex][1] =
NULL;
214 Modes[channelIndex][0] = oC_TIMER_LLD_Mode_NotSelected;
215 Modes[channelIndex][1] = oC_TIMER_LLD_Mode_NotSelected;
216 EventFlagsArray[channelIndex][0] = 0;
217 EventFlagsArray[channelIndex][1] = 0;
221 errorCode = oC_ErrorCode_None;
233 oC_ErrorCode_t oC_TIMER_LLD_TurnOffDriver(
void )
235 oC_ErrorCode_t errorCode = oC_ErrorCode_ImplementError;
237 if(oC_AssignErrorCodeIfFalse(&errorCode ,
ModuleEnabledFlag , oC_ErrorCode_ModuleNotStartedYet))
241 oC_TIMER_LLD_ForEachChannel(Channel)
245 oC_TIMER_LLD_RestoreDefaultStateOnChannel(Channel,oC_TIMER_LLD_SubTimer_Both);
247 EventHandlers[channelIndex][0] =
NULL;
248 EventHandlers[channelIndex][1] =
NULL;
249 Modes[channelIndex][0] = oC_TIMER_LLD_Mode_NotSelected;
250 Modes[channelIndex][1] = oC_TIMER_LLD_Mode_NotSelected;
251 EventFlagsArray[channelIndex][0] = 0;
252 EventFlagsArray[channelIndex][1] = 0;
266 bool oC_TIMER_LLD_IsChannelCorrect( oC_TIMER_Channel_t Channel )
288 bool oC_TIMER_LLD_IsModulePinDefined( oC_TIMER_Pin_t ModulePin )
290 oC_Pin_t pin = oC_ModulePin_GetPin(ModulePin);
291 return oC_GPIO_LLD_IsPinDefined(pin);
300 bool oC_TIMER_LLD_IsSubTimerCorrect(oC_TIMER_LLD_SubTimer_t SubTimer)
302 return SubTimer > oC_TIMER_LLD_SubTimer_None && SubTimer <= oC_TIMER_LLD_SubTimer_Both;
311 oC_Pin_t oC_TIMER_LLD_GetPinOfModulePin( oC_TIMER_Pin_t ModulePin )
313 return oC_ModulePin_GetPin(ModulePin);
322 const char * oC_TIMER_LLD_GetModulePinName( oC_TIMER_Pin_t ModulePin )
324 return oC_GPIO_LLD_GetPinName( oC_ModulePin_GetPin(ModulePin) );
333 const char * oC_TIMER_LLD_GetChannelName( oC_TIMER_Channel_t Channel )
344 oC_TIMER_Channel_t oC_TIMER_LLD_GetChannelOfModulePin( oC_TIMER_Pin_t ModulePin )
346 return oC_ModulePin_GetChannel(ModulePin);
355 oC_ChannelIndex_t oC_TIMER_LLD_ChannelToChannelIndex( oC_TIMER_Channel_t Channel )
366 oC_TIMER_Channel_t oC_TIMER_LLD_ChannelIndexToChannel( oC_TIMER_LLD_ChannelIndex_t Channel )
377 oC_ErrorCode_t oC_TIMER_LLD_SetPower( oC_TIMER_Channel_t Channel ,
oC_Power_t Power )
379 oC_ErrorCode_t errorCode = oC_ErrorCode_ImplementError;
382 oC_AssignErrorCodeIfFalse(&errorCode ,
ModuleEnabledFlag , oC_ErrorCode_ModuleNotStartedYet) &&
383 oC_AssignErrorCodeIfFalse(&errorCode ,
oC_Channel_IsCorrect(TIMER,Channel) , oC_ErrorCode_WrongChannel) &&
384 oC_AssignErrorCodeIfFalse(&errorCode , Power ==
oC_Power_On || Power ==
oC_Power_Off , oC_ErrorCode_PowerStateNotCorrect) &&
388 errorCode = oC_ErrorCode_None;
400 oC_ErrorCode_t oC_TIMER_LLD_ReadPower( oC_TIMER_Channel_t Channel ,
oC_Power_t * outPower )
402 oC_ErrorCode_t errorCode = oC_ErrorCode_ImplementError;
405 oC_AssignErrorCodeIfFalse(&errorCode ,
ModuleEnabledFlag , oC_ErrorCode_ModuleNotStartedYet) &&
406 oC_AssignErrorCodeIfFalse(&errorCode ,
oC_Channel_IsCorrect(TIMER,Channel) , oC_ErrorCode_WrongChannel) &&
411 errorCode = oC_ErrorCode_None;
423 bool oC_TIMER_LLD_RestoreDefaultStateOnChannel( oC_TIMER_Channel_t Channel , oC_TIMER_LLD_SubTimer_t SubTimer )
425 bool stateRestored =
false;
429 SetMode(Channel,SubTimer,oC_TIMER_LLD_Mode_NotSelected);
430 DisableTimer(Channel,SubTimer);
431 DisableEvents(Channel,SubTimer,oC_TIMER_LLD_EventFlags_All);
435 stateRestored =
true;
440 return stateRestored;
449 oC_ErrorCode_t oC_TIMER_LLD_TimerStart( oC_TIMER_Channel_t Channel , oC_TIMER_LLD_SubTimer_t SubTimer )
451 oC_ErrorCode_t errorCode = oC_ErrorCode_ImplementError;
454 oC_AssignErrorCodeIfFalse(&errorCode ,
ModuleEnabledFlag , oC_ErrorCode_ModuleNotStartedYet ) &&
455 oC_AssignErrorCodeIfFalse(&errorCode ,
oC_Channel_IsCorrect(TIMER,Channel) , oC_ErrorCode_WrongChannel ) &&
456 oC_AssignErrorCodeIfFalse(&errorCode , oC_TIMER_LLD_IsSubTimerCorrect(SubTimer) , oC_ErrorCode_TIMERSubTimerNotCorrect) &&
457 oC_AssignErrorCodeIfFalse(&errorCode , IsChannelPoweredOn(Channel) , oC_ErrorCode_ChannelNotPoweredOn ) &&
458 oC_AssignErrorCodeIfFalse(&errorCode , IsModeSelected(Channel,SubTimer) , oC_ErrorCode_TIMERModeNotSelected )
461 EnableTimer(Channel,SubTimer);
462 errorCode = oC_ErrorCode_None;
474 oC_ErrorCode_t oC_TIMER_LLD_TimerStop( oC_TIMER_Channel_t Channel , oC_TIMER_LLD_SubTimer_t SubTimer )
476 oC_ErrorCode_t errorCode = oC_ErrorCode_ImplementError;
479 oC_AssignErrorCodeIfFalse(&errorCode ,
ModuleEnabledFlag , oC_ErrorCode_ModuleNotStartedYet ) &&
480 oC_AssignErrorCodeIfFalse(&errorCode ,
oC_Channel_IsCorrect(TIMER,Channel) , oC_ErrorCode_WrongChannel ) &&
481 oC_AssignErrorCodeIfFalse(&errorCode , oC_TIMER_LLD_IsSubTimerCorrect(SubTimer) , oC_ErrorCode_TIMERSubTimerNotCorrect) &&
482 oC_AssignErrorCodeIfFalse(&errorCode , IsChannelPoweredOn(Channel) , oC_ErrorCode_ChannelNotPoweredOn )
485 DisableTimer(Channel,SubTimer);
486 errorCode = oC_ErrorCode_None;
498 oC_ErrorCode_t oC_TIMER_LLD_ChangeFrequency( oC_TIMER_Channel_t Channel , oC_TIMER_LLD_SubTimer_t SubTimer ,
oC_Frequency_t Frequency ,
oC_Frequency_t PermissibleDifference )
500 oC_ErrorCode_t errorCode = oC_ErrorCode_ImplementError;
504 oC_AssignErrorCodeIfFalse(&errorCode ,
ModuleEnabledFlag , oC_ErrorCode_ModuleNotStartedYet ) &&
505 oC_AssignErrorCodeIfFalse(&errorCode ,
oC_Channel_IsCorrect(TIMER,Channel) , oC_ErrorCode_WrongChannel ) &&
506 oC_AssignErrorCodeIfFalse(&errorCode , oC_TIMER_LLD_IsSubTimerCorrect(SubTimer) , oC_ErrorCode_TIMERSubTimerNotCorrect ) &&
507 oC_AssignErrorCodeIfFalse(&errorCode , IsChannelPoweredOn(Channel) , oC_ErrorCode_ChannelNotPoweredOn ) &&
508 oC_AssignErrorCodeIfFalse(&errorCode , !IsTimerEnabled(Channel) , oC_ErrorCode_TIMERChannelNotStopped ) &&
509 oC_AssignErrorCodeIfFalse(&errorCode , IsModeSelected(Channel,SubTimer) , oC_ErrorCode_TIMERModeNotSelected ) &&
510 oC_AssignErrorCodeIfFalse(&errorCode , (Frequency > 0) , oC_ErrorCode_WrongFrequency )
513 uint32_t prescaler = (uint32_t)(clockFrequency / Frequency);
516 if(prescaler <= prescalerMax && (prescaler > 0))
520 if(
oC_ABS(realFrequency,Frequency) <= PermissibleDifference)
524 if(SubTimer & oC_TIMER_LLD_SubTimer_TimerA)
528 if(SubTimer & oC_TIMER_LLD_SubTimer_TimerB)
532 errorCode = oC_ErrorCode_None;
534 else if(GetCountDirection(Channel,SubTimer) == oC_TIMER_LLD_CountDirection_Up)
539 errorCode = oC_ErrorCode_TIMERCountsDirNotPossible;
541 else if(GetTimerWidth(Channel) != GPTMCFG_TimerWidth_Half)
543 errorCode = oC_ErrorCode_TIMERFrequencyNotPossibleInFullMode;
547 if(SubTimer & oC_TIMER_LLD_SubTimer_TimerA)
551 if(SubTimer & oC_TIMER_LLD_SubTimer_TimerB)
555 errorCode = oC_ErrorCode_None;
560 errorCode = oC_ErrorCode_FrequencyNotPossible;
565 errorCode = oC_ErrorCode_FrequencyNotPossible;
578 oC_ErrorCode_t oC_TIMER_LLD_ReadFrequency( oC_TIMER_Channel_t Channel , oC_TIMER_LLD_SubTimer_t SubTimer ,
oC_Frequency_t * outFrequency )
580 oC_ErrorCode_t errorCode = oC_ErrorCode_ImplementError;
583 oC_AssignErrorCodeIfFalse(&errorCode ,
ModuleEnabledFlag , oC_ErrorCode_ModuleNotStartedYet ) &&
584 oC_AssignErrorCodeIfFalse(&errorCode ,
oC_Channel_IsCorrect(TIMER,Channel) , oC_ErrorCode_WrongChannel ) &&
585 oC_AssignErrorCodeIfFalse(&errorCode , oC_TIMER_LLD_IsSubTimerCorrect(SubTimer) , oC_ErrorCode_TIMERSubTimerNotCorrect ) &&
586 oC_AssignErrorCodeIfFalse(&errorCode , IsChannelPoweredOn(Channel) , oC_ErrorCode_ChannelNotPoweredOn ) &&
587 oC_AssignErrorCodeIfFalse(&errorCode ,
oC_MEM_LLD_IsRamAddress(outFrequency) , oC_ErrorCode_OutputAddressNotInRAM )
591 uint32_t prescaler = GetPrescaler(Channel,SubTimer);
593 *outFrequency = clockFrequency / prescaler;
594 errorCode = oC_ErrorCode_None;
606 oC_ErrorCode_t oC_TIMER_LLD_ChangeMaximumValue( oC_TIMER_Channel_t Channel , oC_TIMER_LLD_SubTimer_t SubTimer , uint64_t Value )
608 oC_ErrorCode_t errorCode = oC_ErrorCode_ImplementError;
611 oC_AssignErrorCodeIfFalse(&errorCode ,
ModuleEnabledFlag , oC_ErrorCode_ModuleNotStartedYet ) &&
612 oC_AssignErrorCodeIfFalse(&errorCode ,
oC_Channel_IsCorrect(TIMER,Channel) , oC_ErrorCode_WrongChannel ) &&
613 oC_AssignErrorCodeIfFalse(&errorCode , oC_TIMER_LLD_IsSubTimerCorrect(SubTimer) , oC_ErrorCode_TIMERSubTimerNotCorrect ) &&
614 oC_AssignErrorCodeIfFalse(&errorCode , IsChannelPoweredOn(Channel) , oC_ErrorCode_ChannelNotPoweredOn ) &&
615 oC_AssignErrorCodeIfFalse(&errorCode , IsModeSelected(Channel,SubTimer) , oC_ErrorCode_TIMERModeNotSelected )
620 if(GetMode(Channel,SubTimer) != oC_TIMER_LLD_Mode_RealTimeClock)
622 SetTimerWidth(Channel , GPTMCFG_TimerWidth_Half);
624 errorCode = oC_ErrorCode_None;
626 else if ( CanBeFullWidth(Channel,SubTimer) && ( (!IsWideChannel(Channel) && (Value <=
oC_uint32_MAX)) || IsWideChannel(Channel) ) )
628 if(SubTimer & oC_TIMER_LLD_SubTimer_Both)
630 SetTimerWidth(Channel , GPTMCFG_TimerWidth_Full);
631 errorCode = oC_ErrorCode_None;
635 errorCode = oC_ErrorCode_TIMERBothSubTimersNeeeded;
640 errorCode = oC_ErrorCode_TIMERMaximumValueTooBig;
643 if(errorCode == oC_ErrorCode_None)
645 SetMaxValue(Channel,SubTimer,Value);
658 oC_ErrorCode_t oC_TIMER_LLD_ReadMaximumValue( oC_TIMER_Channel_t Channel , oC_TIMER_LLD_SubTimer_t SubTimer , uint64_t * outValue )
660 oC_ErrorCode_t errorCode = oC_ErrorCode_ImplementError;
663 oC_AssignErrorCodeIfFalse(&errorCode ,
ModuleEnabledFlag , oC_ErrorCode_ModuleNotStartedYet ) &&
664 oC_AssignErrorCodeIfFalse(&errorCode ,
oC_Channel_IsCorrect(TIMER,Channel) , oC_ErrorCode_WrongChannel ) &&
665 oC_AssignErrorCodeIfFalse(&errorCode , oC_TIMER_LLD_IsSubTimerCorrect(SubTimer) , oC_ErrorCode_TIMERSubTimerNotCorrect ) &&
666 oC_AssignErrorCodeIfFalse(&errorCode , IsChannelPoweredOn(Channel) , oC_ErrorCode_ChannelNotPoweredOn ) &&
667 oC_AssignErrorCodeIfFalse(&errorCode ,
oC_MEM_LLD_IsRamAddress(outValue) , oC_ErrorCode_OutputAddressNotInRAM )
670 *outValue = GetMaxValue(Channel,SubTimer);
671 errorCode = oC_ErrorCode_None;
683 oC_ErrorCode_t oC_TIMER_LLD_ChangeCurrentValue( oC_TIMER_Channel_t Channel , oC_TIMER_LLD_SubTimer_t SubTimer , uint64_t Value )
685 oC_ErrorCode_t errorCode = oC_ErrorCode_ImplementError;
688 oC_AssignErrorCodeIfFalse(&errorCode ,
ModuleEnabledFlag , oC_ErrorCode_ModuleNotStartedYet ) &&
689 oC_AssignErrorCodeIfFalse(&errorCode ,
oC_Channel_IsCorrect(TIMER,Channel) , oC_ErrorCode_WrongChannel ) &&
690 oC_AssignErrorCodeIfFalse(&errorCode , oC_TIMER_LLD_IsSubTimerCorrect(SubTimer) , oC_ErrorCode_TIMERSubTimerNotCorrect ) &&
691 oC_AssignErrorCodeIfFalse(&errorCode , IsChannelPoweredOn(Channel) , oC_ErrorCode_ChannelNotPoweredOn ) &&
692 oC_AssignErrorCodeIfFalse(&errorCode , IsModeSelected(Channel,SubTimer) , oC_ErrorCode_TIMERModeNotSelected )
697 if(GetMode(Channel,SubTimer) != oC_TIMER_LLD_Mode_RealTimeClock)
699 SetTimerWidth(Channel , GPTMCFG_TimerWidth_Half);
701 errorCode = oC_ErrorCode_None;
703 else if ( CanBeFullWidth(Channel,SubTimer) && ( (!IsWideChannel(Channel) && (Value <=
oC_uint32_MAX)) || IsWideChannel(Channel) ) )
705 if(SubTimer & oC_TIMER_LLD_SubTimer_Both)
707 SetTimerWidth(Channel , GPTMCFG_TimerWidth_Full);
708 errorCode = oC_ErrorCode_None;
712 errorCode = oC_ErrorCode_TIMERBothSubTimersNeeeded;
717 errorCode = oC_ErrorCode_TIMERMaximumValueTooBig;
720 if(errorCode == oC_ErrorCode_None)
722 SetValue(Channel,SubTimer,Value);
735 oC_ErrorCode_t oC_TIMER_LLD_ReadCurrentValue( oC_TIMER_Channel_t Channel , oC_TIMER_LLD_SubTimer_t SubTimer , uint64_t * outValue )
737 oC_ErrorCode_t errorCode = oC_ErrorCode_ImplementError;
740 oC_AssignErrorCodeIfFalse(&errorCode ,
ModuleEnabledFlag , oC_ErrorCode_ModuleNotStartedYet ) &&
741 oC_AssignErrorCodeIfFalse(&errorCode ,
oC_Channel_IsCorrect(TIMER,Channel) , oC_ErrorCode_WrongChannel ) &&
742 oC_AssignErrorCodeIfFalse(&errorCode , oC_TIMER_LLD_IsSubTimerCorrect(SubTimer) , oC_ErrorCode_TIMERSubTimerNotCorrect ) &&
743 oC_AssignErrorCodeIfFalse(&errorCode , IsChannelPoweredOn(Channel) , oC_ErrorCode_ChannelNotPoweredOn ) &&
744 oC_AssignErrorCodeIfFalse(&errorCode ,
oC_MEM_LLD_IsRamAddress(outValue) , oC_ErrorCode_OutputAddressNotInRAM )
747 *outValue = GetValue(Channel,SubTimer);
748 errorCode = oC_ErrorCode_None;
760 oC_ErrorCode_t oC_TIMER_LLD_ChangeMatchValue( oC_TIMER_Channel_t Channel , oC_TIMER_LLD_SubTimer_t SubTimer , uint64_t Value )
762 oC_ErrorCode_t errorCode = oC_ErrorCode_ImplementError;
765 oC_AssignErrorCodeIfFalse(&errorCode ,
ModuleEnabledFlag , oC_ErrorCode_ModuleNotStartedYet ) &&
766 oC_AssignErrorCodeIfFalse(&errorCode ,
oC_Channel_IsCorrect(TIMER,Channel) , oC_ErrorCode_WrongChannel ) &&
767 oC_AssignErrorCodeIfFalse(&errorCode , oC_TIMER_LLD_IsSubTimerCorrect(SubTimer) , oC_ErrorCode_TIMERSubTimerNotCorrect ) &&
768 oC_AssignErrorCodeIfFalse(&errorCode , IsChannelPoweredOn(Channel) , oC_ErrorCode_ChannelNotPoweredOn ) &&
769 oC_AssignErrorCodeIfFalse(&errorCode , IsModeSelected(Channel,SubTimer) , oC_ErrorCode_TIMERModeNotSelected )
774 if(GetMode(Channel,SubTimer) != oC_TIMER_LLD_Mode_RealTimeClock)
776 SetTimerWidth(Channel , GPTMCFG_TimerWidth_Half);
778 errorCode = oC_ErrorCode_None;
780 else if ( CanBeFullWidth(Channel,SubTimer) && ( (!IsWideChannel(Channel) && (Value <=
oC_uint32_MAX)) || IsWideChannel(Channel) ) )
782 if(SubTimer & oC_TIMER_LLD_SubTimer_Both)
784 SetTimerWidth(Channel , GPTMCFG_TimerWidth_Full);
785 errorCode = oC_ErrorCode_None;
789 errorCode = oC_ErrorCode_TIMERBothSubTimersNeeeded;
794 errorCode = oC_ErrorCode_TIMERMaximumValueTooBig;
797 if(errorCode == oC_ErrorCode_None)
799 SetMatchValue(Channel,SubTimer,Value);
812 oC_ErrorCode_t oC_TIMER_LLD_ReadMatchValue( oC_TIMER_Channel_t Channel , oC_TIMER_LLD_SubTimer_t SubTimer , uint64_t * outValue )
814 oC_ErrorCode_t errorCode = oC_ErrorCode_ImplementError;
817 oC_AssignErrorCodeIfFalse(&errorCode ,
ModuleEnabledFlag , oC_ErrorCode_ModuleNotStartedYet ) &&
818 oC_AssignErrorCodeIfFalse(&errorCode ,
oC_Channel_IsCorrect(TIMER,Channel) , oC_ErrorCode_WrongChannel ) &&
819 oC_AssignErrorCodeIfFalse(&errorCode , oC_TIMER_LLD_IsSubTimerCorrect(SubTimer) , oC_ErrorCode_TIMERSubTimerNotCorrect ) &&
820 oC_AssignErrorCodeIfFalse(&errorCode , IsChannelPoweredOn(Channel) , oC_ErrorCode_ChannelNotPoweredOn ) &&
821 oC_AssignErrorCodeIfFalse(&errorCode ,
oC_MEM_LLD_IsRamAddress(outValue) , oC_ErrorCode_OutputAddressNotInRAM )
824 *outValue = GetMatchValue(Channel,SubTimer);
825 errorCode = oC_ErrorCode_None;
837 oC_ErrorCode_t oC_TIMER_LLD_ChangeMode( oC_TIMER_Channel_t Channel , oC_TIMER_LLD_SubTimer_t SubTimer , oC_TIMER_LLD_Mode_t Mode )
839 oC_ErrorCode_t errorCode = oC_ErrorCode_ImplementError;
842 oC_AssignErrorCodeIfFalse(&errorCode ,
ModuleEnabledFlag , oC_ErrorCode_ModuleNotStartedYet ) &&
843 oC_AssignErrorCodeIfFalse(&errorCode ,
oC_Channel_IsCorrect(TIMER,Channel) , oC_ErrorCode_WrongChannel ) &&
844 oC_AssignErrorCodeIfFalse(&errorCode , oC_TIMER_LLD_IsSubTimerCorrect(SubTimer) , oC_ErrorCode_TIMERSubTimerNotCorrect ) &&
845 oC_AssignErrorCodeIfFalse(&errorCode , !IsTimerEnabled(Channel) , oC_ErrorCode_TIMERChannelNotStopped ) &&
846 oC_AssignErrorCodeIfFalse(&errorCode , IsChannelPoweredOn(Channel) , oC_ErrorCode_ChannelNotPoweredOn )
849 SetMode(Channel,SubTimer,Mode);
850 errorCode = InitializeMode(Channel,SubTimer,Mode);
862 oC_ErrorCode_t oC_TIMER_LLD_ReadMode( oC_TIMER_Channel_t Channel , oC_TIMER_LLD_SubTimer_t SubTimer , oC_TIMER_LLD_Mode_t * outMode )
864 oC_ErrorCode_t errorCode = oC_ErrorCode_ImplementError;
867 oC_AssignErrorCodeIfFalse(&errorCode ,
ModuleEnabledFlag , oC_ErrorCode_ModuleNotStartedYet ) &&
868 oC_AssignErrorCodeIfFalse(&errorCode ,
oC_Channel_IsCorrect(TIMER,Channel) , oC_ErrorCode_WrongChannel ) &&
869 oC_AssignErrorCodeIfFalse(&errorCode , oC_TIMER_LLD_IsSubTimerCorrect(SubTimer) , oC_ErrorCode_TIMERSubTimerNotCorrect ) &&
873 *outMode = GetMode(Channel,SubTimer);
874 errorCode = oC_ErrorCode_None;
886 oC_ErrorCode_t oC_TIMER_LLD_ChangeCountDirection( oC_TIMER_Channel_t Channel , oC_TIMER_LLD_SubTimer_t SubTimer , oC_TIMER_LLD_CountDirection_t CountDirection )
888 oC_ErrorCode_t errorCode = oC_ErrorCode_ImplementError;
891 oC_AssignErrorCodeIfFalse(&errorCode ,
ModuleEnabledFlag , oC_ErrorCode_ModuleNotStartedYet ) &&
892 oC_AssignErrorCodeIfFalse(&errorCode ,
oC_Channel_IsCorrect(TIMER,Channel) , oC_ErrorCode_WrongChannel ) &&
893 oC_AssignErrorCodeIfFalse(&errorCode , oC_TIMER_LLD_IsSubTimerCorrect(SubTimer) , oC_ErrorCode_TIMERSubTimerNotCorrect ) &&
894 oC_AssignErrorCodeIfFalse(&errorCode , CountDirection <= oC_TIMER_LLD_CountDirection_Down , oC_ErrorCode_TIMERCountsDirNotCorrect ) &&
895 oC_AssignErrorCodeIfFalse(&errorCode , IsChannelPoweredOn(Channel) , oC_ErrorCode_ChannelNotPoweredOn ) &&
896 oC_AssignErrorCodeIfFalse(&errorCode , !IsTimerEnabled(Channel) , oC_ErrorCode_TIMERChannelNotStopped ) &&
897 oC_AssignErrorCodeIfFalse(&errorCode , IsModeSelected(Channel,SubTimer) , oC_ErrorCode_TIMERModeNotSelected )
900 uint32_t prescaler = GetPrescaler(Channel,SubTimer);
903 switch(GetMode(Channel,SubTimer))
911 if((prescaler > 1) && (CountDirection == oC_TIMER_LLD_CountDirection_Up))
913 errorCode = oC_ErrorCode_TIMERCountsDirNotPossible;
918 if(CountDirection == oC_TIMER_LLD_CountDirection_DoesntMatter)
920 CountDirection = oC_TIMER_LLD_CountDirection_Down;
923 errorCode = oC_ErrorCode_None;
933 case oC_TIMER_LLD_Mode_PWM:
934 if(CountDirection == oC_TIMER_LLD_CountDirection_Up)
936 errorCode = oC_ErrorCode_TIMERCountsDirNotPossible;
940 CountDirection = oC_TIMER_LLD_CountDirection_Down;
941 errorCode = oC_ErrorCode_None;
950 case oC_TIMER_LLD_Mode_RealTimeClock:
952 if(CountDirection == oC_TIMER_LLD_CountDirection_Down)
954 errorCode = oC_ErrorCode_TIMERCountsDirNotPossible;
958 CountDirection = oC_TIMER_LLD_CountDirection_Up;
959 errorCode = oC_ErrorCode_None;
966 if(errorCode == oC_ErrorCode_None)
968 SetCountDirection(Channel,SubTimer,CountDirection);
982 oC_ErrorCode_t oC_TIMER_LLD_ReadCountDirection( oC_TIMER_Channel_t Channel , oC_TIMER_LLD_SubTimer_t SubTimer , oC_TIMER_LLD_CountDirection_t * outCountDirection )
984 oC_ErrorCode_t errorCode = oC_ErrorCode_ImplementError;
987 oC_AssignErrorCodeIfFalse(&errorCode ,
ModuleEnabledFlag , oC_ErrorCode_ModuleNotStartedYet ) &&
988 oC_AssignErrorCodeIfFalse(&errorCode ,
oC_Channel_IsCorrect(TIMER,Channel) , oC_ErrorCode_WrongChannel ) &&
989 oC_AssignErrorCodeIfFalse(&errorCode , oC_TIMER_LLD_IsSubTimerCorrect(SubTimer) , oC_ErrorCode_TIMERSubTimerNotCorrect ) &&
990 oC_AssignErrorCodeIfFalse(&errorCode , IsChannelPoweredOn(Channel) , oC_ErrorCode_ChannelNotPoweredOn ) &&
991 oC_AssignErrorCodeIfFalse(&errorCode ,
oC_MEM_LLD_IsRamAddress(outCountDirection) , oC_ErrorCode_OutputAddressNotInRAM)
994 *outCountDirection = GetCountDirection(Channel,SubTimer);
995 errorCode = oC_ErrorCode_None;
1007 oC_ErrorCode_t oC_TIMER_LLD_ChangeTrigger( oC_TIMER_Channel_t Channel , oC_TIMER_LLD_SubTimer_t SubTimer , oC_TIMER_LLD_Trigger_t Trigger )
1009 oC_ErrorCode_t errorCode = oC_ErrorCode_ImplementError;
1012 oC_AssignErrorCodeIfFalse(&errorCode ,
ModuleEnabledFlag , oC_ErrorCode_ModuleNotStartedYet ) &&
1013 oC_AssignErrorCodeIfFalse(&errorCode ,
oC_Channel_IsCorrect(TIMER,Channel) , oC_ErrorCode_WrongChannel ) &&
1014 oC_AssignErrorCodeIfFalse(&errorCode , oC_TIMER_LLD_IsSubTimerCorrect(SubTimer) , oC_ErrorCode_TIMERSubTimerNotCorrect ) &&
1015 oC_AssignErrorCodeIfFalse(&errorCode , IsChannelPoweredOn(Channel) , oC_ErrorCode_ChannelNotPoweredOn ) &&
1016 oC_AssignErrorCodeIfFalse(&errorCode , IsModeSelected(Channel,SubTimer) , oC_ErrorCode_TIMERModeNotSelected )
1020 if(Trigger == oC_TIMER_LLD_Trigger_None)
1022 errorCode = oC_ErrorCode_None;
1026 switch(GetMode(Channel,SubTimer))
1033 case oC_TIMER_LLD_Mode_InputEdgeCount:
1034 case oC_TIMER_LLD_Mode_InputEdgeTime:
1035 case oC_TIMER_LLD_Mode_PWM:
1037 if(Trigger == oC_TIMER_LLD_Trigger_Both)
1039 SetInputTrigger(Channel,SubTimer,GPTMCTL_TxEVENT_BothEdges);
1040 errorCode = oC_ErrorCode_None;
1042 else if(Trigger == oC_TIMER_LLD_Trigger_RisingEdge)
1044 SetInputTrigger(Channel,SubTimer,GPTMCTL_TxEVENT_PositiveEdge);
1045 errorCode = oC_ErrorCode_None;
1047 else if(Trigger == oC_TIMER_LLD_Trigger_FallingEdge)
1049 SetInputTrigger(Channel,SubTimer,GPTMCTL_TxEVENT_NegativeEdge);
1050 errorCode = oC_ErrorCode_None;
1054 errorCode = oC_ErrorCode_TIMERTriggerNotCorrect;
1064 errorCode = oC_ErrorCode_TIMERModeNotCorrect;
1080 oC_ErrorCode_t oC_TIMER_LLD_ReadTrigger( oC_TIMER_Channel_t Channel , oC_TIMER_LLD_SubTimer_t SubTimer , oC_TIMER_LLD_Trigger_t * outTrigger )
1082 oC_ErrorCode_t errorCode = oC_ErrorCode_ImplementError;
1085 oC_AssignErrorCodeIfFalse(&errorCode ,
ModuleEnabledFlag , oC_ErrorCode_ModuleNotStartedYet ) &&
1086 oC_AssignErrorCodeIfFalse(&errorCode ,
oC_Channel_IsCorrect(TIMER,Channel) , oC_ErrorCode_WrongChannel ) &&
1087 oC_AssignErrorCodeIfFalse(&errorCode , oC_TIMER_LLD_IsSubTimerCorrect(SubTimer) , oC_ErrorCode_TIMERSubTimerNotCorrect ) &&
1088 oC_AssignErrorCodeIfFalse(&errorCode , IsChannelPoweredOn(Channel) , oC_ErrorCode_ChannelNotPoweredOn ) &&
1089 oC_AssignErrorCodeIfFalse(&errorCode , IsModeSelected(Channel,SubTimer) , oC_ErrorCode_TIMERModeNotSelected ) &&
1090 oC_AssignErrorCodeIfFalse(&errorCode ,
oC_MEM_LLD_IsRamAddress(outTrigger) , oC_ErrorCode_OutputAddressNotInRAM )
1093 GPTMCTL_TxEVENT_t trigger = GetInputTrigger(Channel,SubTimer);
1095 errorCode = oC_ErrorCode_None;
1099 case GPTMCTL_TxEVENT_NegativeEdge: *outTrigger = oC_TIMER_LLD_Trigger_FallingEdge;
break;
1100 case GPTMCTL_TxEVENT_PositiveEdge: *outTrigger = oC_TIMER_LLD_Trigger_RisingEdge;
break;
1101 case GPTMCTL_TxEVENT_BothEdges: *outTrigger = oC_TIMER_LLD_Trigger_Both;
break;
1102 default: errorCode = oC_ErrorCode_MachineCanBeDamaged;
break;
1115 oC_ErrorCode_t oC_TIMER_LLD_ChangeEventHandler( oC_TIMER_Channel_t Channel , oC_TIMER_LLD_SubTimer_t SubTimer , oC_TIMER_LLD_EventHandler_t EventHandler , oC_TIMER_LLD_EventFlags_t EventFlags )
1117 oC_ErrorCode_t errorCode = oC_ErrorCode_ImplementError;
1120 oC_AssignErrorCodeIfFalse(&errorCode ,
ModuleEnabledFlag , oC_ErrorCode_ModuleNotStartedYet ) &&
1121 oC_AssignErrorCodeIfFalse(&errorCode ,
oC_Channel_IsCorrect(TIMER,Channel) , oC_ErrorCode_WrongChannel ) &&
1122 oC_AssignErrorCodeIfFalse(&errorCode , oC_TIMER_LLD_IsSubTimerCorrect(SubTimer) , oC_ErrorCode_TIMERSubTimerNotCorrect ) &&
1123 oC_AssignErrorCodeIfFalse(&errorCode , IsChannelPoweredOn(Channel) , oC_ErrorCode_ChannelNotPoweredOn ) &&
1127 if(SubTimer & oC_TIMER_LLD_SubTimer_TimerA)
1129 EventHandlers[oC_TIMER_LLD_ChannelToChannelIndex(Channel)][0] = EventHandler;
1131 if(SubTimer & oC_TIMER_LLD_SubTimer_TimerB)
1133 EventHandlers[oC_TIMER_LLD_ChannelToChannelIndex(Channel)][1] = EventHandler;
1135 EnableEvents(Channel,SubTimer,EventFlags);
1136 errorCode = oC_ErrorCode_None;
1148 oC_ErrorCode_t oC_TIMER_LLD_ReadEventHandler(oC_TIMER_Channel_t Channel , oC_TIMER_LLD_SubTimer_t SubTimer , oC_TIMER_LLD_EventHandler_t * outEventHandler , oC_TIMER_LLD_EventFlags_t * outEventFlags )
1150 oC_ErrorCode_t errorCode = oC_ErrorCode_ImplementError;
1153 oC_AssignErrorCodeIfFalse(&errorCode ,
ModuleEnabledFlag , oC_ErrorCode_ModuleNotStartedYet ) &&
1154 oC_AssignErrorCodeIfFalse(&errorCode ,
oC_Channel_IsCorrect(TIMER,Channel) , oC_ErrorCode_WrongChannel ) &&
1155 oC_AssignErrorCodeIfFalse(&errorCode , oC_TIMER_LLD_IsSubTimerCorrect(SubTimer) , oC_ErrorCode_TIMERSubTimerNotCorrect ) &&
1156 oC_AssignErrorCodeIfFalse(&errorCode , IsChannelPoweredOn(Channel) , oC_ErrorCode_ChannelNotPoweredOn ) &&
1157 oC_AssignErrorCodeIfFalse(&errorCode ,
oC_MEM_LLD_IsRamAddress(outEventHandler) , oC_ErrorCode_OutputAddressNotInRAM ) &&
1158 oC_AssignErrorCodeIfFalse(&errorCode ,
oC_MEM_LLD_IsRamAddress(outEventFlags) , oC_ErrorCode_OutputAddressNotInRAM )
1161 if(SubTimer & oC_TIMER_LLD_SubTimer_TimerA)
1163 *outEventHandler = EventHandlers[oC_TIMER_LLD_ChannelToChannelIndex(Channel)][0];
1164 *outEventFlags = EventFlagsArray[oC_TIMER_LLD_ChannelToChannelIndex(Channel)][0];
1166 else if(SubTimer & oC_TIMER_LLD_SubTimer_TimerB)
1168 *outEventHandler = EventHandlers[oC_TIMER_LLD_ChannelToChannelIndex(Channel)][1];
1169 *outEventFlags = EventFlagsArray[oC_TIMER_LLD_ChannelToChannelIndex(Channel)][1];
1171 errorCode = oC_ErrorCode_None;
1183 oC_ErrorCode_t oC_TIMER_LLD_ChangeStartPwmState( oC_TIMER_Channel_t Channel , oC_TIMER_LLD_SubTimer_t SubTimer , oC_TIMER_LLD_PwmState_t State)
1185 oC_ErrorCode_t errorCode = oC_ErrorCode_ImplementError;
1188 oC_AssignErrorCodeIfFalse(&errorCode ,
ModuleEnabledFlag , oC_ErrorCode_ModuleNotStartedYet ) &&
1189 oC_AssignErrorCodeIfFalse(&errorCode ,
oC_Channel_IsCorrect(TIMER,Channel) , oC_ErrorCode_WrongChannel ) &&
1190 oC_AssignErrorCodeIfFalse(&errorCode , oC_TIMER_LLD_IsSubTimerCorrect(SubTimer) , oC_ErrorCode_TIMERSubTimerNotCorrect ) &&
1191 oC_AssignErrorCodeIfFalse(&errorCode , IsChannelPoweredOn(Channel) , oC_ErrorCode_ChannelNotPoweredOn ) &&
1192 oC_AssignErrorCodeIfFalse(&errorCode , IsModeSelected(Channel,SubTimer) , oC_ErrorCode_TIMERModeNotSelected ) &&
1193 oC_AssignErrorCodeIfFalse(&errorCode , GetMode(Channel,SubTimer) == oC_TIMER_LLD_Mode_PWM , oC_ErrorCode_TIMERModeNotCorrect )
1196 if(oC_TIMER_LLD_PwmState_Low == State)
1198 SetPwmOutput(Channel,SubTimer,GPTMCTL_TxPWML_PwmOutput_Inverted);
1202 SetPwmOutput(Channel,SubTimer,GPTMCTL_TxPWML_PwmOutput_Unaffected);
1204 errorCode = oC_ErrorCode_None;
1216 oC_ErrorCode_t oC_TIMER_LLD_ReadStartPwmState( oC_TIMER_Channel_t Channel , oC_TIMER_LLD_SubTimer_t SubTimer , oC_TIMER_LLD_PwmState_t * outState)
1218 oC_ErrorCode_t errorCode = oC_ErrorCode_ImplementError;
1221 oC_AssignErrorCodeIfFalse(&errorCode ,
ModuleEnabledFlag , oC_ErrorCode_ModuleNotStartedYet ) &&
1222 oC_AssignErrorCodeIfFalse(&errorCode ,
oC_Channel_IsCorrect(TIMER,Channel) , oC_ErrorCode_WrongChannel ) &&
1223 oC_AssignErrorCodeIfFalse(&errorCode , oC_TIMER_LLD_IsSubTimerCorrect(SubTimer) , oC_ErrorCode_TIMERSubTimerNotCorrect ) &&
1224 oC_AssignErrorCodeIfFalse(&errorCode , IsChannelPoweredOn(Channel) , oC_ErrorCode_ChannelNotPoweredOn ) &&
1225 oC_AssignErrorCodeIfFalse(&errorCode ,
oC_MEM_LLD_IsRamAddress(outState) , oC_ErrorCode_OutputAddressNotInRAM) &&
1226 oC_AssignErrorCodeIfFalse(&errorCode , IsModeSelected(Channel,SubTimer) , oC_ErrorCode_TIMERModeNotSelected ) &&
1227 oC_AssignErrorCodeIfFalse(&errorCode , GetMode(Channel,SubTimer) == oC_TIMER_LLD_Mode_PWM , oC_ErrorCode_TIMERModeNotCorrect )
1230 if(GPTMCTL_TxPWML_PwmOutput_Inverted == GetPwmOutput(Channel,SubTimer))
1232 *outState = oC_TIMER_LLD_PwmState_Low;
1236 *outState = oC_TIMER_LLD_PwmState_High;
1238 errorCode = oC_ErrorCode_None;
1250 oC_ErrorCode_t oC_TIMER_LLD_ConnectModulePin(oC_TIMER_Pin_t ModulePin )
1252 oC_ErrorCode_t errorCode = oC_ErrorCode_ImplementError;
1253 oC_TIMER_Channel_t channel = oC_TIMER_LLD_GetChannelOfModulePin(ModulePin);
1254 oC_TIMER_LLD_SubTimer_t subTimer;
1256 if( oC_AssignErrorCodeIfFalse(&errorCode ,
ModuleEnabledFlag , oC_ErrorCode_ModuleNotStartedYet ) )
1258 oC_Pin_t pin = oC_ModulePin_GetPin(ModulePin);
1261 ErrorCondition( IsChannelCorrect(channel) , oC_ErrorCode_WrongChannel ) &&
1262 ErrorCondition( oC_GPIO_LLD_IsPinDefined(pin) , oC_ErrorCode_PinNotDefined )
1265 bool unused =
false;
1270 oC_AssignErrorCode( &errorCode , oC_GPIO_LLD_ArePinsUnused(pin,&unused) ) &&
1271 ErrorCondition( unused , oC_ErrorCode_PinIsUsed ) &&
1272 oC_AssignErrorCode( &errorCode , oC_GPIO_LLD_SetPinsUsed(pin) ) &&
1273 oC_AssignErrorCode( &errorCode , oC_TIMER_LLD_ReadSubTimerOfModulePin(ModulePin,&subTimer)) &&
1274 oC_AssignErrorCodeIfFalse( &errorCode , oC_TIMER_LLD_IsSubTimerCorrect(subTimer) , oC_ErrorCode_TIMERSubTimerNotCorrect ) &&
1275 oC_AssignErrorCodeIfFalse( &errorCode , IsModeSelected(channel,subTimer) , oC_ErrorCode_TIMERModeNotSelected ) &&
1276 oC_AssignErrorCodeIfFalse( &errorCode , IsChannelPoweredOn(channel) , oC_ErrorCode_ChannelNotPoweredOn ) &&
1277 oC_AssignErrorCode( &errorCode , oC_GPIO_MSLLD_ConnectModulePin(ModulePin) )
1280 errorCode = oC_ErrorCode_None;
1284 oC_GPIO_LLD_SetPinsUnused(pin);
1299 oC_ErrorCode_t oC_TIMER_LLD_ReadSubTimerOfModulePin(oC_TIMER_Pin_t PeripheralPin , oC_TIMER_LLD_SubTimer_t * outSubTimer )
1301 oC_ErrorCode_t errorCode = oC_ErrorCode_ImplementError;
1302 oC_TIMER_Channel_t channel = oC_TIMER_LLD_GetChannelOfModulePin(PeripheralPin);
1305 oC_AssignErrorCodeIfFalse(&errorCode ,
ModuleEnabledFlag , oC_ErrorCode_ModuleNotStartedYet ) &&
1306 oC_AssignErrorCodeIfFalse(&errorCode ,
oC_Channel_IsCorrect(TIMER,channel) , oC_ErrorCode_WrongChannel ) &&
1307 oC_AssignErrorCodeIfFalse(&errorCode , oC_TIMER_LLD_IsModulePinDefined(PeripheralPin) , oC_ErrorCode_PeripheralPinNotDefined ) &&
1308 oC_AssignErrorCodeIfFalse(&errorCode ,
oC_MEM_LLD_IsRamAddress(outSubTimer) , oC_ErrorCode_OutputAddressNotInRAM)
1312 oC_PinFunction_t pinFunction = oC_ModulePin_GetPinFunction(PeripheralPin);
1319 *outSubTimer = oC_TIMER_LLD_SubTimer_TimerB;
1323 *outSubTimer = oC_TIMER_LLD_SubTimer_TimerA;
1326 errorCode = oC_ErrorCode_None;
1338 oC_ErrorCode_t oC_TIMER_LLD_SetChannelUsed( oC_TIMER_Channel_t Channel , oC_TIMER_LLD_SubTimer_t SubTimer )
1340 oC_ErrorCode_t errorCode = oC_ErrorCode_ImplementError;
1343 oC_AssignErrorCodeIfFalse(&errorCode ,
ModuleEnabledFlag , oC_ErrorCode_ModuleNotStartedYet) &&
1344 oC_AssignErrorCodeIfFalse(&errorCode ,
oC_Channel_IsCorrect(TIMER,Channel) , oC_ErrorCode_WrongChannel ) &&
1345 oC_AssignErrorCodeIfFalse(&errorCode , oC_TIMER_LLD_IsSubTimerCorrect(SubTimer) , oC_ErrorCode_TIMERSubTimerNotCorrect) &&
1346 oC_AssignErrorCodeIfFalse(&errorCode , !oC_TIMER_LLD_IsChannelUsed(Channel,SubTimer), oC_ErrorCode_ChannelIsUsed)
1349 SetMode(Channel,SubTimer,oC_TIMER_LLD_Mode_Reserved);
1350 errorCode = oC_ErrorCode_None;
1362 oC_ErrorCode_t oC_TIMER_LLD_SetChannelUnused( oC_TIMER_Channel_t Channel , oC_TIMER_LLD_SubTimer_t SubTimer )
1364 oC_ErrorCode_t errorCode = oC_ErrorCode_ImplementError;
1367 oC_AssignErrorCodeIfFalse(&errorCode ,
ModuleEnabledFlag , oC_ErrorCode_ModuleNotStartedYet) &&
1368 oC_AssignErrorCodeIfFalse(&errorCode ,
oC_Channel_IsCorrect(TIMER,Channel) , oC_ErrorCode_WrongChannel ) &&
1369 oC_AssignErrorCodeIfFalse(&errorCode , oC_TIMER_LLD_IsSubTimerCorrect(SubTimer) , oC_ErrorCode_TIMERSubTimerNotCorrect)
1372 SetMode(Channel,SubTimer,oC_TIMER_LLD_Mode_NotSelected);
1373 errorCode = oC_ErrorCode_None;
1385 bool oC_TIMER_LLD_IsChannelUsed( oC_TIMER_Channel_t Channel , oC_TIMER_LLD_SubTimer_t SubTimer )
1387 return oC_Channel_IsCorrect(TIMER,Channel) && oC_TIMER_LLD_IsSubTimerCorrect(SubTimer) && (GetMode(Channel,SubTimer) != oC_TIMER_LLD_Mode_NotSelected);
1396 oC_ErrorCode_t oC_TIMER_LLD_ReadModulePinsOfPin( oC_Pins_t Pin , oC_TIMER_Pin_t * outPeripheralPinsArray , uint32_t * ArraySize )
1398 oC_ErrorCode_t errorCode = oC_ErrorCode_ImplementError;
1401 oC_AssignErrorCodeIfFalse(&errorCode , oC_GPIO_LLD_IsSinglePin(Pin) , oC_ErrorCode_NotSinglePin ) &&
1402 oC_AssignErrorCodeIfFalse(&errorCode , oC_TIMER_LLD_IsModulePinDefined(Pin) , oC_ErrorCode_PinNotDefined ) &&
1403 oC_AssignErrorCodeIfFalse(&errorCode ,
oC_MEM_LLD_IsRamAddress(outPeripheralPinsArray) , oC_ErrorCode_OutputAddressNotInRAM ) &&
1404 oC_AssignErrorCodeIfFalse(&errorCode ,
oC_MEM_LLD_IsRamAddress(ArraySize) , oC_ErrorCode_OutputAddressNotInRAM ) &&
1405 oC_AssignErrorCodeIfFalse(&errorCode , (*ArraySize) < 255 , oC_ErrorCode_ValueTooBig )
1408 uint8_t outArrayIndex = 0;
1410 errorCode = oC_ErrorCode_None;
1412 oC_ModulePin_ForeachDefined(modulePin)
1416 if(outArrayIndex < (*ArraySize))
1418 outPeripheralPinsArray[outArrayIndex++] = modulePin->ModulePinIndex;
1422 errorCode = oC_ErrorCode_OutputArrayToSmall;
1427 if(outArrayIndex == 0)
1429 errorCode = oC_ErrorCode_PeripheralPinNotDefined;
1432 *ArraySize = outArrayIndex;
1438 #undef _________________________________________INTERFACE_FUNCTIONS_SECTION________________________________________________________________ 1446 #define _________________________________________LOCAL_FUNCTIONS_SECTION____________________________________________________________________ 1453 static inline bool IsModeSelected( oC_TIMER_Channel_t Channel , oC_TIMER_LLD_SubTimer_t SubTimer)
1455 oC_TIMER_LLD_Mode_t mode = GetMode(Channel,SubTimer);
1456 return (mode > oC_TIMER_LLD_Mode_Reserved) &&
1457 (mode <= oC_TIMER_LLD_Mode_PWM);
1465 static inline bool IsTimerEnabled( oC_TIMER_Channel_t Channel )
1467 return GPTMCTL(Channel)->TAEN && GPTMCTL(Channel)->TBEN;
1475 static inline bool IsWideChannel( oC_TIMER_Channel_t Channel )
1477 return GPTMPP(Channel)->SIZE == 1;
1485 static inline bool CanBeFullWidth( oC_TIMER_Channel_t Channel , oC_TIMER_LLD_SubTimer_t SubTimer )
1487 oC_TIMER_LLD_Mode_t mode = GetMode(Channel,SubTimer);
1488 uint32_t prescaler = GetPrescaler(Channel,SubTimer);
1492 mode == oC_TIMER_LLD_Mode_RealTimeClock ||
1493 mode == oC_TIMER_LLD_Mode_PeriodicTimer
1504 static inline void SetCountDirection( oC_TIMER_Channel_t Channel , oC_TIMER_LLD_SubTimer_t SubTimer , oC_TIMER_LLD_CountDirection_t CountDirection )
1506 if(CountDirection == oC_TIMER_LLD_CountDirection_Up)
1508 if(SubTimer & oC_TIMER_LLD_SubTimer_TimerA)
1510 GPTMTAMR(Channel)->TACDIR = 1;
1512 if(SubTimer & oC_TIMER_LLD_SubTimer_TimerB)
1514 GPTMTBMR(Channel)->TBCDIR = 1;
1519 if(SubTimer & oC_TIMER_LLD_SubTimer_TimerA)
1521 GPTMTAMR(Channel)->TACDIR = 0;
1523 if(SubTimer & oC_TIMER_LLD_SubTimer_TimerB)
1525 GPTMTBMR(Channel)->TBCDIR = 0;
1535 static inline oC_TIMER_LLD_CountDirection_t GetCountDirection( oC_TIMER_Channel_t Channel , oC_TIMER_LLD_SubTimer_t SubTimer )
1537 oC_TIMER_LLD_CountDirection_t countDirection;
1539 if(SubTimer & oC_TIMER_LLD_SubTimer_TimerA)
1541 if(GPTMTAMR(Channel)->TACDIR == 1)
1543 countDirection = oC_TIMER_LLD_CountDirection_Up;
1547 countDirection = oC_TIMER_LLD_CountDirection_Down;
1552 if(GPTMTBMR(Channel)->TBCDIR == 1)
1554 countDirection = oC_TIMER_LLD_CountDirection_Up;
1558 countDirection = oC_TIMER_LLD_CountDirection_Down;
1562 return countDirection;
1570 static inline void SetTimersMode( oC_TIMER_Channel_t Channel , oC_TIMER_LLD_SubTimer_t SubTimer , GPTMTxMR_TxMR_t Mode )
1572 if(SubTimer & oC_TIMER_LLD_SubTimer_TimerA)
1574 GPTMTAMR(Channel)->TAMR = Mode;
1576 if(SubTimer & oC_TIMER_LLD_SubTimer_TimerA)
1578 GPTMTBMR(Channel)->TBMR = Mode;
1587 static inline void SetInputTrigger( oC_TIMER_Channel_t Channel , oC_TIMER_LLD_SubTimer_t SubTimer , GPTMCTL_TxEVENT_t Trigger )
1589 if(SubTimer & oC_TIMER_LLD_SubTimer_TimerA)
1591 GPTMCTL(Channel)->TAEVENT = Trigger;
1593 if(SubTimer & oC_TIMER_LLD_SubTimer_TimerB)
1595 GPTMCTL(Channel)->TBEVENT = Trigger;
1604 static inline GPTMCTL_TxEVENT_t GetInputTrigger( oC_TIMER_Channel_t Channel , oC_TIMER_LLD_SubTimer_t SubTimer )
1606 if(SubTimer & oC_TIMER_LLD_SubTimer_TimerA)
1608 return GPTMCTL(Channel)->TAEVENT;
1612 return GPTMCTL(Channel)->TBEVENT;
1621 static inline void EnableTimer( oC_TIMER_Channel_t Channel , oC_TIMER_LLD_SubTimer_t SubTimer )
1625 if(SubTimer & oC_TIMER_LLD_SubTimer_TimerA)
1627 GPTMCTL(Channel)->TAEN = 1;
1630 if(SubTimer & oC_TIMER_LLD_SubTimer_TimerB)
1632 GPTMCTL(Channel)->TBEN = 1;
1642 static inline void DisableTimer( oC_TIMER_Channel_t Channel , oC_TIMER_LLD_SubTimer_t SubTimer )
1644 if(SubTimer & oC_TIMER_LLD_SubTimer_TimerA)
1646 GPTMCTL(Channel)->TAEN = 0;
1649 if(SubTimer & oC_TIMER_LLD_SubTimer_TimerB)
1651 GPTMCTL(Channel)->TBEN = 0;
1660 static void CallEvent( oC_TIMER_Channel_t Channel , oC_TIMER_LLD_ChannelIndex_t ChannelIndex , oC_TIMER_LLD_SubTimer_t SubTimer , oC_TIMER_LLD_EventFlags_t EventFlags )
1662 oC_TIMER_LLD_EventHandler_t eventHandler =
NULL;
1663 oC_TIMER_LLD_EventFlags_t enabledEventFlags = 0;
1665 if(SubTimer & oC_TIMER_LLD_SubTimer_TimerA)
1667 eventHandler = EventHandlers[ChannelIndex][0];
1668 enabledEventFlags = EventFlagsArray[ChannelIndex][0];
1672 eventHandler = EventHandlers[ChannelIndex][1];
1673 enabledEventFlags = EventFlagsArray[ChannelIndex][1];
1676 if(eventHandler && (EventFlags & enabledEventFlags))
1678 eventHandler(Channel,SubTimer,EventFlags);
1687 static inline uint32_t GetPrescaler( oC_TIMER_Channel_t Channel , oC_TIMER_LLD_SubTimer_t SubTimer )
1689 if(SubTimer & oC_TIMER_LLD_SubTimer_TimerA)
1700 static inline void SetTimerWidth( oC_TIMER_Channel_t Channel , GPTMCFG_TimerWidth_t TimerWidth )
1710 static inline GPTMCFG_TimerWidth_t GetTimerWidth( oC_TIMER_Channel_t Channel )
1720 static inline void SetMaxValue( oC_TIMER_Channel_t Channel , oC_TIMER_LLD_SubTimer_t SubTimer , uint64_t MaxValue )
1722 uint32_t lowWord = 0;
1723 uint32_t highWord = 0;
1727 if(SubTimer & oC_TIMER_LLD_SubTimer_TimerA)
1735 else if (SubTimer & oC_TIMER_LLD_SubTimer_TimerB)
1746 static inline uint64_t GetMaxValue( oC_TIMER_Channel_t Channel , oC_TIMER_LLD_SubTimer_t SubTimer )
1748 uint64_t maxValue = 0;
1756 else if(SubTimer & oC_TIMER_LLD_SubTimer_TimerA)
1760 else if(SubTimer & oC_TIMER_LLD_SubTimer_TimerB)
1762 maxValue = highWord;
1773 static inline void SetValue( oC_TIMER_Channel_t Channel , oC_TIMER_LLD_SubTimer_t SubTimer , uint64_t Value )
1775 uint32_t lowWord = 0;
1776 uint32_t highWord = 0;
1780 if(SubTimer & oC_TIMER_LLD_SubTimer_TimerA)
1788 else if (SubTimer & oC_TIMER_LLD_SubTimer_TimerB)
1799 static inline uint64_t GetValue( oC_TIMER_Channel_t Channel , oC_TIMER_LLD_SubTimer_t SubTimer )
1801 uint64_t maxValue = 0;
1809 else if(SubTimer & oC_TIMER_LLD_SubTimer_TimerA)
1813 else if(SubTimer & oC_TIMER_LLD_SubTimer_TimerB)
1815 maxValue = highWord;
1826 static inline void SetMatchValue( oC_TIMER_Channel_t Channel , oC_TIMER_LLD_SubTimer_t SubTimer , uint64_t Value )
1828 uint32_t lowWord = 0;
1829 uint32_t highWord = 0;
1833 if(SubTimer & oC_TIMER_LLD_SubTimer_TimerA)
1841 else if (SubTimer & oC_TIMER_LLD_SubTimer_TimerB)
1852 static inline uint64_t GetMatchValue( oC_TIMER_Channel_t Channel , oC_TIMER_LLD_SubTimer_t SubTimer )
1854 uint64_t maxValue = 0;
1862 else if(SubTimer & oC_TIMER_LLD_SubTimer_TimerA)
1866 else if(SubTimer & oC_TIMER_LLD_SubTimer_TimerB)
1868 maxValue = highWord;
1879 static inline void SetAlternateMode( oC_TIMER_Channel_t Channel , oC_TIMER_LLD_SubTimer_t SubTimer , GPTMTxMR_TxAMS_AlternateMode_t Mode )
1881 if(SubTimer & oC_TIMER_LLD_SubTimer_TimerA)
1883 GPTMTAMR(Channel)->TAAMS = Mode;
1885 if(SubTimer & oC_TIMER_LLD_SubTimer_TimerB)
1887 GPTMTBMR(Channel)->TBAMS = Mode;
1896 static inline void SetCaptureMode( oC_TIMER_Channel_t Channel , oC_TIMER_LLD_SubTimer_t SubTimer , GPTMTxMR_TxCMR_CaptureMode_t Mode )
1898 if(SubTimer & oC_TIMER_LLD_SubTimer_TimerA)
1900 GPTMTAMR(Channel)->TACMR = Mode;
1902 if(SubTimer & oC_TIMER_LLD_SubTimer_TimerB)
1904 GPTMTBMR(Channel)->TBCMR = Mode;
1913 static inline void SetPwmOutput( oC_TIMER_Channel_t Channel , oC_TIMER_LLD_SubTimer_t SubTimer , GPTMCTL_TxPWML_PwmOutput_t PwmOutput )
1915 if(SubTimer & oC_TIMER_LLD_SubTimer_TimerA)
1917 GPTMCTL(Channel)->TAPWML = PwmOutput;
1921 GPTMCTL(Channel)->TBPWML = PwmOutput;
1930 static inline GPTMCTL_TxPWML_PwmOutput_t GetPwmOutput( oC_TIMER_Channel_t Channel , oC_TIMER_LLD_SubTimer_t SubTimer )
1932 GPTMCTL_TxPWML_PwmOutput_t pwmOutput;
1934 if(SubTimer & oC_TIMER_LLD_SubTimer_TimerA)
1936 pwmOutput = GPTMCTL(Channel)->TAPWML;
1940 pwmOutput = GPTMCTL(Channel)->TBPWML;
1951 static void EnableEvents( oC_TIMER_Channel_t Channel , oC_TIMER_LLD_SubTimer_t SubTimer , oC_TIMER_LLD_EventFlags_t EventFlags )
1953 if(SubTimer & oC_TIMER_LLD_SubTimer_TimerA)
1955 EventFlagsArray[oC_TIMER_LLD_ChannelToChannelIndex(Channel)][0] = EventFlags;
1956 oC_Channel_EnableInterrupt(Channel,TimerA);
1958 if(EventFlags & oC_TIMER_LLD_EventFlags_TimeoutInterrupt)
1960 GPTMIMR(Channel)->TATOIM = 1;
1963 if(EventFlags & oC_TIMER_LLD_EventFlags_MatchValueInterrupt)
1965 GPTMIMR(Channel)->TAMIM = 1;
1969 ( EventFlags & oC_TIMER_LLD_EventFlags_PwmPinInLowState ) ||
1970 ( EventFlags & oC_TIMER_LLD_EventFlags_PwmPinInHighState )
1974 GPTMIMR(Channel)->CAEIM = 1;
1975 GPTMIMR(Channel)->CAEIM = 1;
1978 if(SubTimer & oC_TIMER_LLD_SubTimer_TimerB)
1980 EventFlagsArray[oC_TIMER_LLD_ChannelToChannelIndex(Channel)][1] = EventFlags;
1981 oC_Channel_EnableInterrupt(Channel,TimerB);
1983 if(EventFlags & oC_TIMER_LLD_EventFlags_TimeoutInterrupt)
1985 GPTMIMR(Channel)->TBTOIM = 1;
1988 if(EventFlags & oC_TIMER_LLD_EventFlags_MatchValueInterrupt)
1990 GPTMIMR(Channel)->TBMIM = 1;
1994 ( EventFlags & oC_TIMER_LLD_EventFlags_PwmPinInLowState ) ||
1995 ( EventFlags & oC_TIMER_LLD_EventFlags_PwmPinInHighState )
1999 GPTMIMR(Channel)->CBEIM = 1;
2000 GPTMIMR(Channel)->CBEIM = 1;
2009 SetEventMode(Channel,SubTimer,GPTMCTL_TxEVENT_EventMode_BothEdges);
2013 SetEventMode(Channel,SubTimer,GPTMCTL_TxEVENT_EventMode_NegativeEdge);
2017 SetEventMode(Channel,SubTimer,GPTMCTL_TxEVENT_EventMode_PositiveEdge);
2026 static void DisableEvents( oC_TIMER_Channel_t Channel , oC_TIMER_LLD_SubTimer_t SubTimer , oC_TIMER_LLD_EventFlags_t EventFlags )
2028 if(SubTimer & oC_TIMER_LLD_SubTimer_TimerA)
2030 EventFlagsArray[oC_TIMER_LLD_ChannelToChannelIndex(Channel)][0] &= ~EventFlags;
2031 oC_Channel_EnableInterrupt(Channel,TimerA);
2033 if(EventFlags & oC_TIMER_LLD_EventFlags_TimeoutInterrupt)
2035 GPTMIMR(Channel)->TATOIM = 0;
2038 if(EventFlags & oC_TIMER_LLD_EventFlags_MatchValueInterrupt)
2040 GPTMIMR(Channel)->TAMIM = 0;
2044 ( EventFlags & oC_TIMER_LLD_EventFlags_PwmPinInLowState ) ||
2045 ( EventFlags & oC_TIMER_LLD_EventFlags_PwmPinInHighState )
2049 GPTMIMR(Channel)->CAEIM = 0;
2050 GPTMIMR(Channel)->CAEIM = 0;
2053 if(SubTimer & oC_TIMER_LLD_SubTimer_TimerB)
2055 EventFlagsArray[oC_TIMER_LLD_ChannelToChannelIndex(Channel)][1] &= ~EventFlags;
2056 oC_Channel_EnableInterrupt(Channel,TimerB);
2058 if(EventFlags & oC_TIMER_LLD_EventFlags_TimeoutInterrupt)
2060 GPTMIMR(Channel)->TBTOIM = 0;
2063 if(EventFlags & oC_TIMER_LLD_EventFlags_MatchValueInterrupt)
2065 GPTMIMR(Channel)->TBMIM = 0;
2069 ( EventFlags & oC_TIMER_LLD_EventFlags_PwmPinInLowState ) ||
2070 ( EventFlags & oC_TIMER_LLD_EventFlags_PwmPinInHighState )
2074 GPTMIMR(Channel)->CBEIM = 0;
2075 GPTMIMR(Channel)->CBEIM = 0;
2086 static void SetPwmInterrupt( oC_TIMER_Channel_t Channel , oC_TIMER_LLD_SubTimer_t SubTimer , GPTMTxMR_TxPWMIE_PwmInterruptEnable_t Enabled )
2088 if(SubTimer & oC_TIMER_LLD_SubTimer_TimerA)
2090 GPTMTAMR(Channel)->TAPWMIE = Enabled;
2092 if(SubTimer & oC_TIMER_LLD_SubTimer_TimerB)
2094 GPTMTBMR(Channel)->TBPWMIE = Enabled;
2103 static inline void SetPwmLegacyOperations( oC_TIMER_Channel_t Channel , oC_TIMER_LLD_SubTimer_t SubTimer , GPTMTxMR_TxPLO_PwmLegacyOperations_t Enabled )
2105 if(SubTimer & oC_TIMER_LLD_SubTimer_TimerA)
2107 GPTMTAMR(Channel)->TAPLO = Enabled;
2110 if(SubTimer & oC_TIMER_LLD_SubTimer_TimerB)
2112 GPTMTBMR(Channel)->TBPLO = Enabled;
2122 static inline oC_ErrorCode_t InitializeMode( oC_TIMER_Channel_t Channel , oC_TIMER_LLD_SubTimer_t SubTimer , oC_TIMER_LLD_Mode_t Mode )
2124 oC_ErrorCode_t errorCode = oC_ErrorCode_ImplementError;
2132 case oC_TIMER_LLD_Mode_PWM:
2133 SetTimerWidth(Channel , GPTMCFG_TimerWidth_Half);
2134 SetTimersMode(Channel , SubTimer , GPTMTxMR_TxMR_PeriodicTimerMode);
2135 SetAlternateMode(Channel , SubTimer , GPTMTxMR_TxAMS_AlternateMode_Pwm);
2136 SetPwmInterrupt(Channel , SubTimer , GPTMTxMR_TxPWMIE_PwmInterruptEnable_Enabled);
2137 SetCaptureMode(Channel , SubTimer , GPTMTxMR_TxCMR_CaptureMode_EdgeCount);
2138 SetPwmLegacyOperations(Channel, SubTimer , GPTMTxMR_TxPLO_PwmLegacyOperations_Enabled);
2139 SetPwmOutput(Channel, SubTimer , GPTMCTL_TxPWML_PwmOutput_Inverted);
2140 errorCode = oC_ErrorCode_None;
2147 case oC_TIMER_LLD_Mode_PeriodicTimer:
2149 ((SubTimer & oC_TIMER_LLD_SubTimer_TimerA) == oC_TIMER_LLD_SubTimer_TimerA) ||
2150 ((SubTimer & oC_TIMER_LLD_SubTimer_TimerB) == oC_TIMER_LLD_SubTimer_TimerB)
2153 SetTimerWidth(Channel , GPTMCFG_TimerWidth_Half);
2157 SetTimerWidth(Channel , GPTMCFG_TimerWidth_Full);
2160 SetTimersMode(Channel , SubTimer , GPTMTxMR_TxMR_PeriodicTimerMode);
2161 SetAlternateMode(Channel , SubTimer , GPTMTxMR_TxAMS_AlternateMode_CaptureOrCompare);
2162 SetPwmLegacyOperations(Channel , SubTimer, GPTMTxMR_TxPLO_PwmLegacyOperations_Disabled);
2163 errorCode = oC_ErrorCode_None;
2170 case oC_TIMER_LLD_Mode_RealTimeClock:
2173 SetTimerWidth(Channel,GPTMCFG_TimerWidth_FullRtc);
2174 SetAlternateMode(Channel , SubTimer , GPTMTxMR_TxAMS_AlternateMode_CaptureOrCompare);
2175 SetPwmLegacyOperations(Channel , SubTimer, GPTMTxMR_TxPLO_PwmLegacyOperations_Disabled);
2176 errorCode = oC_ErrorCode_None;
2180 errorCode = oC_ErrorCode_TIMERBothSubTimersNeeeded;
2188 case oC_TIMER_LLD_Mode_InputEdgeCount:
2189 SetTimerWidth(Channel , GPTMCFG_TimerWidth_Half);
2190 SetTimersMode(Channel , SubTimer , GPTMTxMR_TxMR_CaptureMode);
2191 SetAlternateMode(Channel , SubTimer , GPTMTxMR_TxAMS_AlternateMode_CaptureOrCompare);
2192 SetPwmLegacyOperations(Channel , SubTimer, GPTMTxMR_TxPLO_PwmLegacyOperations_Disabled);
2193 SetCaptureMode(Channel , SubTimer , GPTMTxMR_TxCMR_CaptureMode_EdgeCount);
2194 errorCode = oC_ErrorCode_None;
2201 case oC_TIMER_LLD_Mode_InputEdgeTime:
2202 SetTimerWidth(Channel , GPTMCFG_TimerWidth_Half);
2203 SetTimersMode(Channel , SubTimer , GPTMTxMR_TxMR_CaptureMode);
2204 SetAlternateMode(Channel , SubTimer , GPTMTxMR_TxAMS_AlternateMode_CaptureOrCompare);
2205 SetPwmLegacyOperations(Channel , SubTimer, GPTMTxMR_TxPLO_PwmLegacyOperations_Disabled);
2206 SetCaptureMode(Channel , SubTimer , GPTMTxMR_TxCMR_CaptureMode_EdgeTime);
2207 errorCode = oC_ErrorCode_None;
2215 errorCode = oC_ErrorCode_TIMERModeNotCorrect;
2227 static oC_TIMER_LLD_Mode_t GetMode( oC_TIMER_Channel_t Channel , oC_TIMER_LLD_SubTimer_t SubTimer )
2229 oC_TIMER_LLD_Mode_t Mode;
2231 if(SubTimer & oC_TIMER_LLD_SubTimer_TimerA)
2233 Mode = MODE(Channel)[0];
2235 else if(SubTimer & oC_TIMER_LLD_SubTimer_TimerB)
2237 Mode = MODE(Channel)[1];
2248 static void SetMode( oC_TIMER_Channel_t Channel , oC_TIMER_LLD_SubTimer_t SubTimer , oC_TIMER_LLD_Mode_t Mode )
2250 if(SubTimer & oC_TIMER_LLD_SubTimer_TimerA)
2252 MODE(Channel)[0] = Mode;
2256 MODE(Channel)[1] = Mode;
2265 static inline void SetEventMode( oC_TIMER_Channel_t Channel , oC_TIMER_LLD_SubTimer_t SubTimer , GPTMCTL_TxEVENT_EventMode_t EventMode )
2267 if(SubTimer & oC_TIMER_LLD_SubTimer_TimerA)
2269 GPTMCTL(Channel)->TAEVENT = EventMode;
2273 GPTMCTL(Channel)->TBEVENT = EventMode;
2278 #undef _________________________________________LOCAL_FUNCTIONS_SECTION____________________________________________________________________ 2280 #define MODULE_NAME TIMER 2281 #define INTERRUPT_TYPE TimerA 2283 #undef INTERRUPT_TYPE 2284 #define INTERRUPT_TYPE TimerB 2285 #undef INTERRUPT_TYPE 2293 #define _________________________________________INTERRUPTS_SECTION_________________________________________________________________________ 2294 #define MODULE_NAME TIMER 2295 #define INTERRUPT_TYPE_NAME TimerA 2299 oC_TIMER_LLD_EventFlags_t EventFlags = 0;
2302 if(GPTMMIS(Channel)->TAMMIS)
2304 EventFlags |= oC_TIMER_LLD_EventFlags_MatchValueInterrupt;
2305 GPTMICR(Channel)->TAMCINT = 1;
2308 if(GPTMMIS(Channel)->TATOMIS)
2310 EventFlags |= oC_TIMER_LLD_EventFlags_TimeoutInterrupt;
2311 GPTMICR(Channel)->TATOCINT = 1;
2314 if(GPTMMIS(Channel)->CAEMIS)
2316 oC_TIMER_LLD_Mode_t mode = GetMode(Channel,oC_TIMER_LLD_SubTimer_TimerA);
2317 if(mode == oC_TIMER_LLD_Mode_PWM)
2319 EventFlags |= oC_TIMER_LLD_EventFlags_PwmPinInHighState;
2320 EventFlags |= oC_TIMER_LLD_EventFlags_PwmPinInLowState;
2325 EventFlags |= oC_TIMER_LLD_EventFlags_EdgeDetect;
2327 GPTMICR(Channel)->CAECINT = 1;
2331 CallEvent(Channel,channelIndex,oC_TIMER_LLD_SubTimer_TimerA,EventFlags);
2332 GPTMICR(Channel)->TATOCINT = 1;
2334 #undef INTERRUPT_TYPE_NAME 2336 #define INTERRUPT_TYPE_NAME TimerB 2340 oC_TIMER_LLD_EventFlags_t EventFlags = 0;
2343 if(GPTMMIS(Channel)->TBMMIS)
2345 EventFlags |= oC_TIMER_LLD_EventFlags_MatchValueInterrupt;
2346 GPTMICR(Channel)->TBMCINT = 1;
2349 if(GPTMMIS(Channel)->TBTOMIS)
2351 EventFlags |= oC_TIMER_LLD_EventFlags_TimeoutInterrupt;
2352 GPTMICR(Channel)->TBTOCINT = 1;
2355 if(GPTMMIS(Channel)->CBEMIS)
2357 oC_TIMER_LLD_Mode_t mode = GetMode(Channel,oC_TIMER_LLD_SubTimer_TimerB);
2358 if(mode == oC_TIMER_LLD_Mode_PWM)
2360 EventFlags |= oC_TIMER_LLD_EventFlags_PwmPinInHighState;
2361 EventFlags |= oC_TIMER_LLD_EventFlags_PwmPinInLowState;
2366 EventFlags |= oC_TIMER_LLD_EventFlags_EdgeDetect;
2369 GPTMICR(Channel)->CBECINT = 1;
2373 CallEvent(Channel,channelIndex,oC_TIMER_LLD_SubTimer_TimerB,EventFlags);
2374 GPTMICR(Channel)->TBTOCINT = 1;
2376 #undef INTERRUPT_TYPE_NAME 2378 #undef _________________________________________INTERRUPTS_SECTION_________________________________________________________________________
static bool oC_Bits_AreBitsSetU32(uint32_t BitMask, uint32_t BitsToCheck)
checks if all bits in field are set
static bool ModuleEnabledFlag
The file with LLD interface for the TIMER driver.
double oC_Frequency_t
type to store frequency
#define oC_Machine_ReadRegister(Channel, REGISTER_NAME)
redefinition of oC_Machine_ReadRegisterDirectStaticOffset
bool oC_MEM_LLD_IsFlashAddress(const void *Address)
checks if the pointer is in flash section
#define oC_Channel_GetName(Channel)
returns name of channel
The file with LLD interface for the MEM driver.
The file with LLD interface for the GPIO driver.
#define oC_Machine_WriteRegister(Channel, REGISTER_NAME, Value)
redefinition of oC_Machine_WriteRegisterDirectStaticOffset
#define oC_uint8_MAX
machine memory size unsigned integer
static void oC_Bits_SplitU64ToU32(uint64_t Variable, uint32_t *outLow, uint32_t *outHigh)
oC_Frequency_t oC_CLOCK_LLD_GetClockFrequency(void)
returns frequency of the system clock
Something is powered off.
The file with LLD interface for the CLOCK driver.
oC_Channel_t
stores machine channel
#define oC_Channel_IsCorrect(MODULE_NAME, Channel)
checks if channel is correct
#define oC_uint32_MAX
maximum value for uint32_t type
static uint64_t oC_Bits_JoinU32ToU64(uint32_t LowPart, uint32_t HighPart)
#define oC_Channel_FromIndex(MODULE_NAME, ChannelIndex)
returns channel according to index in module
#define oC_ModuleChannel_NumberOfElements(MODULE_NAME)
Number of elements in module channel.
static void oC_MCS_EnterCriticalSection(void)
Enters to critical section.
Static array definitions.
static bool oC_Machine_IsChannelPoweredOn(oC_Channel_t Channel)
checks if channel is powered on
#define oC_uint16_MAX
maximum value for uint16_t type
static oC_Power_t oC_Machine_GetPowerStateForChannel(oC_Channel_t Channel)
returns power state for channel
static void CallEvent(void *Address, MemoryEventFlags_t EventFlags, const char *Function, uint32_t LineNumber)
static bool oC_MCS_ExitCriticalSection(void)
Exits from critical section.
#define oC_Channel_ToIndex(MODULE_NAME, Channel)
returns index in module according to channel
#define oC_Channel_InterruptHandler(ChannelVariableName)
creates common interrupt handler for channel
static bool oC_Machine_SetPowerStateForChannel(oC_Channel_t Channel, oC_Power_t Power)
configures power state for machine channel
oC_Power_t
stores registers power state
bool oC_MEM_LLD_IsRamAddress(const void *Address)
checks if the pointer is in ram section
#define NULL
pointer to a zero