41 #define _________________________________________DEFINITIONS_SECTION________________________________________________________________________ 43 #define RCC_APB1ENR oC_Register(RCC,RCC_APB1ENR) 44 #define RCC_CR oC_Register(RCC,RCC_CR) 45 #define RCC_CFGR oC_Register(RCC,RCC_CFGR) 46 #define RCC_PLLCFGR oC_Register(RCC,RCC_PLLCFGR) 47 #define RCC_CSR oC_Register(RCC,RCC_CSR) 48 #define PWR_CR oC_Register(PWR,PWR_CR) 49 #define PWR_CSR oC_Register(PWR,PWR_CSR) 50 #define FLASH_ACR oC_Register(FLASH,FLASH_ACR) 51 #define MAX_FREQUENCY oC_MACHINE_MAXIMUM_FREQUENCY 52 #define HIBERNATION_FREQUENCY oC_MACHINE_HIBERNATION_OSCILLATOR_FREQUENCY 54 #undef _________________________________________DEFINITIONS_SECTION________________________________________________________________________ 61 #define _________________________________________MACROS_SECTION_____________________________________________________________________________ 63 #define IsRam(Address) (oC_LSF_IsRamAddress(Address) || oC_LSF_IsExternalAddress(Address)) 64 #define IsRom(Address) oC_LSF_IsRomAddress(Address) 66 #undef _________________________________________MACROS_SECTION_____________________________________________________________________________ 74 #define _________________________________________TYPES_SECTION______________________________________________________________________________ 78 MainClockSource_HSI = 0,
79 MainClockSource_HSE = 1 ,
80 MainClockSource_PLL = 2
103 #undef _________________________________________TYPES_SECTION______________________________________________________________________________ 110 #define _________________________________________LOCAL_PROTOTYPES_SECTION___________________________________________________________________ 112 static void SetPowerForInternalOscillator (
oC_Power_t Power );
113 static void SetPowerForExternalOscillator (
oC_Power_t Power );
114 static void SetPowerForHibernationOscillator (
oC_Power_t Power );
115 static void SetPowerForPll (
oC_Power_t Power );
116 static void SetPowerForOverDrive (
oC_Power_t Power );
117 static void SetFlashLatency ( uint8_t WaitStates );
118 static oC_ErrorCode_t FindFlashLatency (
oC_Frequency_t ClockFrequency , uint8_t * outWaitStates );
119 static void SetMainClockSource ( MainClockSource_t MainClockSource );
120 static void SetPllSource ( PllSource_t PllSource );
124 static void SetHpre ( uint8_t Hpre );
127 #undef _________________________________________LOCAL_PROTOTYPES_SECTION___________________________________________________________________ 134 #define _________________________________________VARIABLES_SECTION__________________________________________________________________________ 140 static bool UseEthernet =
false;
142 #undef _________________________________________VARIABLES_SECTION__________________________________________________________________________ 149 #define _________________________________________INTERFACE_FUNCTIONS_SECTION________________________________________________________________ 162 oC_ErrorCode_t errorCode = oC_ErrorCode_ImplementError;
174 ClockConfiguredHandler =
NULL;
178 RCC_APB1ENR->PWR_EN = 1;
183 errorCode = oC_ErrorCode_None;
199 oC_ErrorCode_t errorCode = oC_ErrorCode_ImplementError;
209 RCC_APB1ENR->PWR_EN = 0;
212 errorCode = oC_ErrorCode_None;
228 return CurrentClockSource;
239 return CurrentFrequency;
250 return CurrentOscillatorFrequency;
261 return MAX_FREQUENCY;
272 oC_ErrorCode_t errorCode = oC_ErrorCode_ImplementError;
277 oC_AssignErrorCodeIfFalse(&errorCode , ClockConfiguredHandler ==
NULL , oC_ErrorCode_InterruptHandlerAlreadySet ) &&
278 oC_AssignErrorCodeIfFalse(&errorCode , IsRom(Interrupt) || IsRam(Interrupt) , oC_ErrorCode_WrongEventHandlerAddress )
282 ClockConfiguredHandler = Interrupt;
283 errorCode = oC_ErrorCode_None;
299 oC_UInt_t numberOfCyclesPerMicrosecond = CurrentFrequency/1000000UL;
301 oC_MCS_Delay(numberOfCyclesPerMicrosecond*Microseconds);
314 oC_ErrorCode_t errorCode = oC_ErrorCode_ImplementError;
318 uint8_t latencyWaitStates = 0;
319 bool increasingFrequency = TargetFrequency >= CurrentFrequency;
321 .ResultDifference = PermissibleDifference + 1 ,
322 .TargetFrequency = TargetFrequency ,
323 .PermissibleDifference = PermissibleDifference ,
328 oC_AssignErrorCodeIfFalse(&errorCode , TargetFrequency > 0 , oC_ErrorCode_WrongFrequency ) &&
329 oC_AssignErrorCodeIfFalse(&errorCode , TargetFrequency <= MAX_FREQUENCY , oC_ErrorCode_FrequencyNotPossible) &&
330 oC_AssignErrorCodeIfFalse(&errorCode , CountClockConfiguration(&clockConfig) , oC_ErrorCode_FrequencyNotPossible) &&
331 oC_AssignErrorCode( &errorCode , FindFlashLatency(clockConfig.ResultFrequency , &latencyWaitStates))
339 if(clockConfig.UsePll)
341 SetPllSource(PllSource_HSI);
342 ConfigurePll(&clockConfig);
352 if(increasingFrequency)
354 SetFlashLatency(latencyWaitStates);
357 SetHpre(clockConfig.Hpre);
359 SetMainClockSource(MainClockSource_PLL);
368 if(increasingFrequency)
370 SetFlashLatency(latencyWaitStates);
373 SetHpre(clockConfig.Hpre);
375 SetMainClockSource(MainClockSource_HSI);
383 if(!increasingFrequency)
385 SetFlashLatency(latencyWaitStates);
390 errorCode = oC_ErrorCode_None;
407 oC_ErrorCode_t errorCode = oC_ErrorCode_ImplementError;
411 uint8_t latencyWaitStates = 0;
412 bool increasingFrequency = TargetFrequency >= CurrentFrequency;
414 .ResultDifference = PermissibleDifference + 1 ,
415 .TargetFrequency = TargetFrequency,
416 .PermissibleDifference = PermissibleDifference,
417 .OscillatorFrequency = OscillatorFrequency
421 oC_AssignErrorCodeIfFalse(&errorCode , TargetFrequency > 0 , oC_ErrorCode_WrongFrequency ) &&
422 oC_AssignErrorCodeIfFalse(&errorCode , OscillatorFrequency > 0 , oC_ErrorCode_WrongFrequency ) &&
423 oC_AssignErrorCodeIfFalse(&errorCode , TargetFrequency <= MAX_FREQUENCY , oC_ErrorCode_FrequencyNotPossible) &&
424 oC_AssignErrorCodeIfFalse(&errorCode , CountClockConfiguration(&clockConfig) , oC_ErrorCode_FrequencyNotPossible) &&
425 oC_AssignErrorCode( &errorCode , FindFlashLatency(clockConfig.ResultFrequency , &latencyWaitStates))
433 if(clockConfig.UsePll)
435 SetPllSource(PllSource_HSE);
436 ConfigurePll(&clockConfig);
455 if(increasingFrequency)
457 SetFlashLatency(latencyWaitStates);
460 SetHpre(clockConfig.Hpre);
462 SetMainClockSource(MainClockSource_PLL);
473 if(increasingFrequency)
475 SetFlashLatency(latencyWaitStates);
478 SetHpre(clockConfig.Hpre);
480 SetMainClockSource(MainClockSource_HSE);
488 if(!increasingFrequency)
490 SetFlashLatency(latencyWaitStates);
497 errorCode = oC_ErrorCode_None;
512 oC_ErrorCode_t errorCode = oC_ErrorCode_ImplementError;
516 if(TargetFrequency == 0)
518 TargetFrequency = HIBERNATION_FREQUENCY;
521 if(oC_AssignErrorCodeIfFalse(&errorCode , TargetFrequency != HIBERNATION_FREQUENCY , oC_ErrorCode_WrongFrequency ))
524 errorCode = oC_ErrorCode_NotImplemented;
531 #undef _________________________________________INTERFACE_FUNCTIONS_SECTION________________________________________________________________ 539 #define _________________________________________LOCAL_FUNCTIONS_SECTION____________________________________________________________________ 546 static void SetPowerForInternalOscillator(
oC_Power_t Power )
552 while(!RCC_CR->HSIRDY);
558 while(RCC_CR->HSIRDY);
567 static void SetPowerForExternalOscillator(
oC_Power_t Power )
573 while(RCC_CR->HSERDY);
578 while(!RCC_CR->HSERDY);
584 while(RCC_CR->HSERDY);
593 static void SetPowerForHibernationOscillator(
oC_Power_t Power )
599 while(!RCC_CSR->LSIRDY);
605 while(RCC_CSR->LSIRDY);
614 static void SetPowerForPll(
oC_Power_t Power )
620 while(!RCC_CR->PLLRDY);
626 while(RCC_CR->PLLRDY);
635 static void SetPowerForOverDrive(
oC_Power_t Power )
641 while(!PWR_CSR->ODRDY);
647 while(PWR_CSR->ODRDY);
656 static void SetFlashLatency( uint8_t WaitStates )
658 FLASH_ACR->LATENCY = WaitStates;
661 oC_ASSERT(FLASH_ACR->LATENCY == WaitStates);
669 static oC_ErrorCode_t FindFlashLatency(
oC_Frequency_t ClockFrequency , uint8_t * outWaitStates )
671 oC_ErrorCode_t errorCode = oC_ErrorCode_ImplementError;
683 } FlashLatencyCapabilities_t;
691 static const FlashLatencyCapabilities_t latencyArray[] = {
693 { .WaitStates = 0 , .VddMin = 2.7 , .VddMax = 3.6 , .SystemClockMin = 0 , .SystemClockMax =
MHz(30) } ,
694 { .WaitStates = 1 , .VddMin = 2.7 , .VddMax = 3.6 , .SystemClockMin =
MHz(30) , .SystemClockMax =
MHz(60) } ,
695 { .WaitStates = 2 , .VddMin = 2.7 , .VddMax = 3.6 , .SystemClockMin =
MHz(60) , .SystemClockMax =
MHz(90) } ,
696 { .WaitStates = 3 , .VddMin = 2.7 , .VddMax = 3.6 , .SystemClockMin =
MHz(90) , .SystemClockMax =
MHz(120) } ,
697 { .WaitStates = 4 , .VddMin = 2.7 , .VddMax = 3.6 , .SystemClockMin =
MHz(120) , .SystemClockMax =
MHz(150) } ,
698 { .WaitStates = 5 , .VddMin = 2.7 , .VddMax = 3.6 , .SystemClockMin =
MHz(150) , .SystemClockMax =
MHz(180) } ,
699 { .WaitStates = 6 , .VddMin = 2.7 , .VddMax = 3.6 , .SystemClockMin =
MHz(180) , .SystemClockMax =
MHz(210) } ,
700 { .WaitStates = 7 , .VddMin = 2.7 , .VddMax = 3.6 , .SystemClockMin =
MHz(210) , .SystemClockMax =
MHz(216) } ,
703 { .WaitStates = 0 , .VddMin = 2.4 , .VddMax = 2.7 , .SystemClockMin = 0 , .SystemClockMax =
MHz(24) } ,
704 { .WaitStates = 1 , .VddMin = 2.4 , .VddMax = 2.7 , .SystemClockMin =
MHz(24) , .SystemClockMax =
MHz(48) } ,
705 { .WaitStates = 2 , .VddMin = 2.4 , .VddMax = 2.7 , .SystemClockMin =
MHz(48) , .SystemClockMax =
MHz(72) } ,
706 { .WaitStates = 3 , .VddMin = 2.4 , .VddMax = 2.7 , .SystemClockMin =
MHz(72) , .SystemClockMax =
MHz(96) } ,
707 { .WaitStates = 4 , .VddMin = 2.4 , .VddMax = 2.7 , .SystemClockMin =
MHz(96) , .SystemClockMax =
MHz(120) } ,
708 { .WaitStates = 5 , .VddMin = 2.4 , .VddMax = 2.7 , .SystemClockMin =
MHz(120) , .SystemClockMax =
MHz(144) } ,
709 { .WaitStates = 6 , .VddMin = 2.4 , .VddMax = 2.7 , .SystemClockMin =
MHz(144) , .SystemClockMax =
MHz(168) } ,
710 { .WaitStates = 7 , .VddMin = 2.4 , .VddMax = 2.7 , .SystemClockMin =
MHz(168) , .SystemClockMax =
MHz(192) } ,
711 { .WaitStates = 8 , .VddMin = 2.4 , .VddMax = 2.7 , .SystemClockMin =
MHz(192) , .SystemClockMax =
MHz(216) } ,
714 { .WaitStates = 0 , .VddMin = 2.1 , .VddMax = 2.4 , .SystemClockMin = 0 , .SystemClockMax =
MHz(22) } ,
715 { .WaitStates = 1 , .VddMin = 2.1 , .VddMax = 2.4 , .SystemClockMin =
MHz(22) , .SystemClockMax =
MHz(44) } ,
716 { .WaitStates = 2 , .VddMin = 2.1 , .VddMax = 2.4 , .SystemClockMin =
MHz(44) , .SystemClockMax =
MHz(66) } ,
717 { .WaitStates = 3 , .VddMin = 2.1 , .VddMax = 2.4 , .SystemClockMin =
MHz(66) , .SystemClockMax =
MHz(88) } ,
718 { .WaitStates = 4 , .VddMin = 2.1 , .VddMax = 2.4 , .SystemClockMin =
MHz(88) , .SystemClockMax =
MHz(110) } ,
719 { .WaitStates = 5 , .VddMin = 2.1 , .VddMax = 2.4 , .SystemClockMin =
MHz(110) , .SystemClockMax =
MHz(132) } ,
720 { .WaitStates = 6 , .VddMin = 2.1 , .VddMax = 2.4 , .SystemClockMin =
MHz(132) , .SystemClockMax =
MHz(154) } ,
721 { .WaitStates = 7 , .VddMin = 2.1 , .VddMax = 2.4 , .SystemClockMin =
MHz(154) , .SystemClockMax =
MHz(176) } ,
722 { .WaitStates = 8 , .VddMin = 2.1 , .VddMax = 2.4 , .SystemClockMin =
MHz(176) , .SystemClockMax =
MHz(198) } ,
723 { .WaitStates = 9 , .VddMin = 2.1 , .VddMax = 2.4 , .SystemClockMin =
MHz(198) , .SystemClockMax =
MHz(216) } ,
726 { .WaitStates = 0 , .VddMin = 1.8 , .VddMax = 2.1 , .SystemClockMin = 0 , .SystemClockMax =
MHz(20) } ,
727 { .WaitStates = 1 , .VddMin = 1.8 , .VddMax = 2.1 , .SystemClockMin =
MHz(20) , .SystemClockMax =
MHz(40) } ,
728 { .WaitStates = 2 , .VddMin = 1.8 , .VddMax = 2.1 , .SystemClockMin =
MHz(40) , .SystemClockMax =
MHz(60) } ,
729 { .WaitStates = 3 , .VddMin = 1.8 , .VddMax = 2.1 , .SystemClockMin =
MHz(60) , .SystemClockMax =
MHz(80) } ,
730 { .WaitStates = 4 , .VddMin = 1.8 , .VddMax = 2.1 , .SystemClockMin =
MHz(80) , .SystemClockMax =
MHz(100) } ,
731 { .WaitStates = 5 , .VddMin = 1.8 , .VddMax = 2.1 , .SystemClockMin =
MHz(100) , .SystemClockMax =
MHz(120) } ,
732 { .WaitStates = 6 , .VddMin = 1.8 , .VddMax = 2.1 , .SystemClockMin =
MHz(120) , .SystemClockMax =
MHz(140) } ,
733 { .WaitStates = 7 , .VddMin = 1.8 , .VddMax = 2.1 , .SystemClockMin =
MHz(140) , .SystemClockMax =
MHz(160) } ,
734 { .WaitStates = 8 , .VddMin = 1.8 , .VddMax = 2.1 , .SystemClockMin =
MHz(160) , .SystemClockMax =
MHz(180) }
737 errorCode = oC_ErrorCode_VoltageNotCorrect;
739 oC_ARRAY_FOREACH_IN_ARRAY(latencyArray,latency)
741 if(vdd >= latency->VddMin && vdd < latency->VddMax)
743 if(ClockFrequency > latency->SystemClockMin && ClockFrequency < (latency->SystemClockMax +
MHz(1)))
745 *outWaitStates = latency->WaitStates;
746 errorCode = oC_ErrorCode_None;
761 static void SetMainClockSource( MainClockSource_t MainClockSource )
763 RCC_CFGR->SW = MainClockSource;
765 while(RCC_CFGR->SWS != MainClockSource);
773 static void SetPllSource( PllSource_t PllSource )
775 RCC_PLLCFGR->PLLSRC = PllSource;
785 bool configurationPossible =
false;
791 for(uint8_t PLLM = 2 ; PLLM < 64 ; PLLM++)
795 if(pllInputFrequency >= oC_MHz(1) && pllInputFrequency <= oC_MHz(2))
797 for(uint16_t PLLN = 0; PLLN < 511 ; PLLN++)
801 if(pllOutputFrequency >= oC_MHz(192) && pllOutputFrequency < oC_MHz(433))
803 for(uint8_t PLLP = 0 ; PLLP < 4 ; PLLP++)
807 if(FindHpre(pllClkFrequency , ClockConfiguration))
809 ClockConfiguration->UsePll =
true;
810 ClockConfiguration->PllM = PLLM;
811 ClockConfiguration->PllN = PLLN;
812 ClockConfiguration->PllP = PLLP;
814 configurationPossible =
true;
826 if(FindHpre(ClockConfiguration->OscillatorFrequency , ClockConfiguration))
828 ClockConfiguration->UsePll =
false;
829 ClockConfiguration->PllM = 0;
830 ClockConfiguration->PllN = 0;
831 ClockConfiguration->PllP = 0;
833 configurationPossible =
true;
837 return configurationPossible;
847 bool foundHpre =
false;
848 const uint16_t hpreDivisors[] = { 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 2 , 4 , 8 , 16 , 64 , 128 , 256 , 512 };
850 for(uint8_t HPRE = 0x0 ; HPRE <= 0xF ;HPRE++)
854 if((UseEthernet && mainClockFrequency >=
MHz(25)) || !UseEthernet)
856 if(!foundHpre ||
oC_ABS(mainClockFrequency,ClockConfiguration->TargetFrequency) <= ClockConfiguration->ResultDifference)
858 ClockConfiguration->ResultDifference=
oC_ABS(mainClockFrequency,ClockConfiguration->TargetFrequency);
860 if(ClockConfiguration->ResultDifference <= ClockConfiguration->PermissibleDifference)
862 ClockConfiguration->Hpre = HPRE;
863 ClockConfiguration->ResultFrequency = mainClockFrequency;
881 RCC_PLLCFGR->PLLM = ClockConfiguration->PllM;
882 RCC_PLLCFGR->PLLN = ClockConfiguration->PllN;
883 RCC_PLLCFGR->PLLP = ClockConfiguration->PllP;
891 static void SetHpre( uint8_t Hpre )
893 RCC_CFGR->HPRE = Hpre;
905 CurrentClockSource = ClockSource;
906 CurrentFrequency = RealFrequency;
907 CurrentOscillatorFrequency = OscillatorFrequency;
909 if(IsRom(ClockConfiguredHandler) || IsRam(ClockConfiguredHandler))
911 ClockConfiguredHandler(RealFrequency);
917 #undef _________________________________________LOCAL_FUNCTIONS_SECTION____________________________________________________________________
oC_ErrorCode_t oC_CLOCK_LLD_TurnOffDriver(void)
release the driver
double oC_Frequency_t
type to store frequency
oC_ErrorCode_t oC_CLOCK_LLD_SetClockConfiguredInterrupt(oC_CLOCK_LLD_Interrupt_t Interrupt)
configures an interrupt for clock configured event
oC_CLOCK_LLD_ClockSource_t oC_CLOCK_LLD_GetClockSource(void)
returns source of the system clock
#define MHz(Freq)
Number of MHz.
oC_CLOCK_LLD_ClockSource_t
type for storing source of the system clock
The file with interface for LSF module.
oC_Frequency_t oC_CLOCK_LLD_GetMaximumClockFrequency(void)
returns maximum frequency permissible for the machine
oC_ErrorCode_t oC_CLOCK_LLD_ConfigureInternalClock(oC_Frequency_t TargetFrequency, oC_Frequency_t PermissibleDifference)
configures system clock in internal mode
an external source of the clock is used
The file with LLD interface for the MEM driver.
an internal clock source is used
void oC_MCS_Delay(register oC_UInt_t Cycles)
delays operations for cycles
The file with interface for the module library.
oC_Frequency_t oC_CLOCK_LLD_GetClockFrequency(void)
returns frequency of the system clock
Something is powered off.
oC_ErrorCode_t oC_CLOCK_LLD_TurnOnDriver(void)
initializes the driver to work
The file with LLD interface for the CLOCK driver.
oC_ErrorCode_t oC_SYS_LLD_ReadPowerState(float *outVcc)
reads power state
oC_ErrorCode_t oC_CLOCK_LLD_ConfigureExternalClock(oC_Frequency_t TargetFrequency, oC_Frequency_t PermissibleDifference, oC_Frequency_t OscillatorFrequency)
configures system clock to work in external mode
static void oC_Module_TurnOn(oC_Module_t Module)
sets module as turned on
Contains machine core specific functions.
static void oC_MCS_EnterCriticalSection(void)
Enters to critical section.
oC_ErrorCode_t oC_CLOCK_LLD_ConfigureHibernationClock(oC_Frequency_t TargetFrequency, oC_Frequency_t PermissibleDifference, oC_Frequency_t OscillatorFrequency)
configures system clock to work in hibernation mode
The file with interface interrupt module.
static bool oC_Module_TurnOffVerification(oC_ErrorCode_t *outErrorCode, oC_Module_t Module)
verify if module is turned off
void(* oC_CLOCK_LLD_Interrupt_t)(oC_Frequency_t Frequency)
type for storing interrupts pointers
static bool oC_MCS_ExitCriticalSection(void)
Exits from critical section.
static bool oC_Module_TurnOnVerification(oC_ErrorCode_t *outErrorCode, oC_Module_t Module)
verify if module is turned on
The file with LLD interface for the SYS driver.
bool oC_CLOCK_LLD_DelayForMicroseconds(oC_UInt_t Microseconds)
perform a delay for us
oC_Power_t
stores registers power state
oC_Frequency_t oC_CLOCK_LLD_GetOscillatorFrequency(void)
returns frequency of the oscillator
#define oC_MACHINE_INTERNAL_OSCILLATOR_FREQUENCY
#define NULL
pointer to a zero
static void oC_Module_TurnOff(oC_Module_t Module)
sets module as turned off