G32R430 Device Driver Layer v1.0.4
G32R4xx Device Driver Layer API Reference
g32r4xx_ddl_rcm.c
Go to the documentation of this file.
1
42#if defined(USE_FULL_DDL_DRIVER)
43
44/* Includes ------------------------------------------------------------------*/
45#include "g32r4xx_ddl_rcm.h"
46#ifdef USE_FULL_ASSERT
47 #include "g32_assert.h"
48#else
49 #define ASSERT_PARAM(_PARAM_) ((void)0U)
50#endif
54
55#if defined(RCM)
56
60
61/* Private types -------------------------------------------------------------*/
62/* Private variables ---------------------------------------------------------*/
63/* Private constants ---------------------------------------------------------*/
64/* Private macros ------------------------------------------------------------*/
68#define DDL_RCM_TIMEOUT_VALUE 50000U
72
73/* Private function prototypes -----------------------------------------------*/
77uint32_t RCM_GetSystemClockFreq(void);
78uint32_t RCM_GetHCLKClockFreq(uint32_t SYSCLK_Frequency);
79uint32_t RCM_GetPCLKClockFreq(uint32_t HCLK_Frequency);
80uint32_t RCM_PLL_GetFreqDomain_SYS(uint32_t SYSCLK_Source);
84
85/* Exported functions --------------------------------------------------------*/
89
93
109ErrorStatus DDL_RCM_DeInit(void)
110{
111 __IO uint32_t vl_mask;
112 volatile uint32_t timeout = DDL_RCM_TIMEOUT_VALUE;
113 ErrorStatus status = SUCCESS;
114
115 /* Set HSIEN bit */
117
118 /* Wait for HSI READY bit */
119 timeout = DDL_RCM_TIMEOUT_VALUE;
120 while (DDL_RCM_HSI_IsReady() != 1U)
121 {
122 if (timeout-- == 0)
123 {
124 status = ERROR;
125 return status;
126 }
127 }
128
129 /* Reset CFG register */
130 DDL_RCM_WriteReg(SCCR, 0x00000000U);
131
132 /* Switch system clock source to HSI by configuring MCCR. */
133 DDL_RCM_WriteReg(MCCR, 0x00000001U);
134
135 /* Disable automatic clock switch back from HSI. */
136 DDL_RCM_WriteReg(MCCR, 0x00000000U);
137
138 /* Wait for the system clock switch to complete and stabilize. */
139 timeout = DDL_RCM_TIMEOUT_VALUE;
140 while ((READ_BIT(RCM->MCCR, RCM_MCCR_SWST) >> RCM_MCCR_SWST_Pos) != 0U)
141 {
142 if (timeout-- == 0)
143 {
144 status = ERROR;
145 return status;
146 }
147 }
148
149 /* Read CTRL register */
150 vl_mask = DDL_RCM_ReadReg(RCCR);
151
152 /* Reset HSEEN, PLLEN, CSSEN bits */
153 CLEAR_BIT(vl_mask, (RCM_RCCR_HSEON | RCM_RCCR_PLLON | RCM_RCCR_CSSON));
154
155 /* Write new value in CTRL register */
156 DDL_RCM_WriteReg(RCCR, vl_mask);
157
158 /* Wait for PLL READY bit to be reset */
159 timeout = DDL_RCM_TIMEOUT_VALUE;
160 while (DDL_RCM_PLL_IsReady() != 0U)
161 {
162 if (timeout-- == 0)
163 {
164 status = ERROR;
165 return status;
166 }
167 }
168
169 /* Reset PLLCR register */
170 DDL_RCM_WriteReg(PLLCR, RCM_PLLCR_RST_VALUE);
171
172 /* Disable all interrupts */
173 CLEAR_BIT(RCM->CIER,
174 (RCM_CIER_LSIRDYIE | RCM_CIER_LSERDYIE | RCM_CIER_HSIRDYIE | \
175 RCM_CIER_HSERDYIE | RCM_CIER_PLLRDYIE));
176
177 /* Clear all interrupt flags */
178 SET_BIT(RCM->CICR,
179 (RCM_CICR_LSIRDYF | RCM_CICR_LSERDYF | RCM_CICR_HSIRDYF | \
180 RCM_CICR_HSERDYF | RCM_CICR_PLLRDYF | RCM_CICR_HSECSSF | \
181 RCM_CICR_LSECSSF));
182
183 /* Reset all RSTFLGCLR flags */
184 SET_BIT(RCM->RSTCSR,
185 (RCM_RSTCSR_OPRSTF | RCM_RSTCSR_PINRSTF | RCM_RSTCSR_PORRSTF | \
186 RCM_RSTCSR_SFTRSTF | RCM_RSTCSR_IWDTRSTF | RCM_RSTCSR_WWDTRSTF));
187
188 return status;
189}
190
194
215
225{
226 /* Get SYSCLK frequency */
228
229 /* HCLK clock frequency */
230 RCM_Clocks->HCLK_Frequency = RCM_GetHCLKClockFreq(RCM_Clocks->SYSCLK_Frequency);
231
232 /* PCLK clock frequency */
233 RCM_Clocks->PCLK_Frequency = RCM_GetPCLKClockFreq(RCM_Clocks->HCLK_Frequency);
234}
235
239
243
247
253{
254 uint32_t frequency = 0U;
255
256 /* Get SYSCLK source -------------------------------------------------------*/
257 switch (DDL_RCM_GetSysClkSource())
258 {
259 case DDL_RCM_SYS_CLKSOURCE_HSI: /* HSI used as system clock source */
260 frequency = HSI_VALUE;
261 break;
262
263 case DDL_RCM_SYS_CLKSOURCE_HSE: /* HSE used as system clock source */
264 frequency = HSE_VALUE;
265 break;
266
267 case DDL_RCM_SYS_CLKSOURCE_PLL: /* PLL used as system clock source */
269 break;
270
271 default:
272 frequency = HSI_VALUE;
273 break;
274 }
275
276 return frequency;
277}
278
284uint32_t RCM_GetHCLKClockFreq(uint32_t SYSCLK_Frequency)
285{
286 /* HCLK clock frequency */
287 return __DDL_RCM_CALC_HCLK_FREQ(SYSCLK_Frequency, DDL_RCM_GetAHBPrescaler());
288}
289
295uint32_t RCM_GetPCLKClockFreq(uint32_t HCLK_Frequency)
296{
297 /* PCLK clock frequency */
298 return __DDL_RCM_CALC_PCLK_FREQ(HCLK_Frequency, DDL_RCM_GetAPBPrescaler());
299}
300
306uint32_t RCM_PLL_GetFreqDomain_SYS(uint32_t SYSCLK_Source)
307{
308 uint32_t pllinputfreq = 0U, pllsource = 0U, plloutputfreq = 0U, pllprescaler = 0U;
309
310 /* SYSCLK = ((HSE_VALUE or HSI_VALUE / PLLP) * PLLMUL */
311 pllsource = DDL_RCM_PLL_GetClkSource();
312
313 switch (pllsource)
314 {
315 case DDL_RCM_PLL_CLKSOURCE_HSI: /* HSI used as PLL clock source */
316 pllinputfreq = HSI_VALUE;
317 break;
318
319 case DDL_RCM_PLL_CLKSOURCE_HSE: /* HSE used as PLL clock source */
320 pllinputfreq = HSE_VALUE;
321 break;
322
323 default:
324 pllinputfreq = HSI_VALUE;
325 break;
326 }
327
328 if (SYSCLK_Source == DDL_RCM_SYS_CLKSOURCE_PLL)
329 {
330 pllprescaler = (DDL_RCM_PLL_GetPrescaler() >> RCM_PLLCR_PLLP_Pos);
331
332 if(pllprescaler == 0)
333 {
334 pllprescaler = 1;
335 }
336
337 plloutputfreq = __DDL_RCM_CALC_PLLCLK_FREQ(pllinputfreq, \
338 pllprescaler, DDL_RCM_PLL_GetMultiplier());
339 }
340
341 return plloutputfreq;
342}
343
347
351
352#endif /* defined(RCM) */
353
357
358#endif /* USE_FULL_DDL_DRIVER */
G32 assert template file. This file should be copied to the application folder and renamed to g32_ass...
Header file of RCM DDL module.
#define HSI_VALUE
#define HSE_VALUE
#define DDL_RCM_PLL_CLKSOURCE_HSI
#define DDL_RCM_PLL_CLKSOURCE_HSE
#define DDL_RCM_SYS_CLKSOURCE_HSE
#define DDL_RCM_SYS_CLKSOURCE_PLL
#define DDL_RCM_SYS_CLKSOURCE_HSI
void DDL_RCM_GetSystemClocksFreq(DDL_RCM_ClocksTypeDef *RCM_Clocks)
Return the frequencies of different on chip clocks; System, AHB, APB buses clocks.
__STATIC_INLINE void DDL_RCM_HSI_Enable(void)
Enable HSI oscillator.
__STATIC_INLINE uint32_t DDL_RCM_HSI_IsReady(void)
Check if HSI clock is ready.
ErrorStatus DDL_RCM_DeInit(void)
Reset the RCM clock configuration to the default reset state.
__STATIC_INLINE uint32_t DDL_RCM_PLL_GetMultiplier(void)
Get PLL multiplier.
__STATIC_INLINE uint32_t DDL_RCM_PLL_GetClkSource(void)
Get PLL control clock source.
__STATIC_INLINE uint32_t DDL_RCM_PLL_IsReady(void)
Check if PLL is Ready.
__STATIC_INLINE uint32_t DDL_RCM_PLL_GetPrescaler(void)
Get PLL clock source prescaler factor.
__STATIC_INLINE uint32_t DDL_RCM_GetAHBPrescaler(void)
Get AHB prescaler.
__STATIC_INLINE uint32_t DDL_RCM_GetAPBPrescaler(void)
Get APB prescaler.
__STATIC_INLINE uint32_t DDL_RCM_GetSysClkSource(void)
Get System clock source.
#define __DDL_RCM_CALC_HCLK_FREQ(__SYSCLKFREQ__, __AHBPRESCALER__)
Helper macro to calculate the HCLK frequency.
#define __DDL_RCM_CALC_PCLK_FREQ(__HCLKFREQ__, __APBPRESCALER__)
Helper macro to calculate the PCLK frequency (ABP).
#define __DDL_RCM_CALC_PLLCLK_FREQ(__INPUTFREQ__, __PLLP__, __PLLMUL__)
Helper macro to calculate the PLLCLK frequency on system domain.
#define DDL_RCM_ReadReg(__REG__)
Read a value in RCM register.
#define DDL_RCM_WriteReg(__REG__, __VALUE__)
Write a value in RCM register.
uint32_t RCM_GetSystemClockFreq(void)
Return SYSTEM clock frequency.
uint32_t RCM_GetHCLKClockFreq(uint32_t SYSCLK_Frequency)
Return HCLK clock frequency.
uint32_t RCM_GetPCLKClockFreq(uint32_t HCLK_Frequency)
Return PCLK clock frequency.
uint32_t RCM_PLL_GetFreqDomain_SYS(uint32_t SYSCLK_Source)
Return PLL clock frequency used for system domain.
#define DDL_RCM_TIMEOUT_VALUE
RCM Clocks Frequency Structure.