HPM SDK
HPMicro Software Development Kit
hpm_pllctlv2_drv.h
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2022-2025 HPMicro
3  *
4  * SPDX-License-Identifier: BSD-3-Clause
5  *
6  */
7 
8 #ifndef HPM_PLLCTLV2_DRV_H
9 #define HPM_PLLCTLV2_DRV_H
10 
11 
12 #include "hpm_common.h"
13 #include "hpm_soc_feature.h"
14 #include "hpm_pllctlv2_regs.h"
15 
16 #define PLLCTLV2_CLK_SRC_XTAL24M (0U)
17 #define PLLCTLV2_CLK_SRC_IRC24M (1U)
18 
19 typedef enum {
28 
29 typedef enum {
35 
36 typedef enum {
37  pllctlv2_div_1p0, /* div 1.0 */
38  pllctlv2_div_1p2, /* div 1.2 */
39  pllctlv2_div_1p4, /* div 1.4 */
40  pllctlv2_div_1p6, /* div 1.6 */
41  pllctlv2_div_1p8, /* div 1.8 */
42  pllctlv2_div_2p0, /* div 2.0 */
43  pllctlv2_div_2p2, /* div 2.2 */
44  pllctlv2_div_2p4, /* div 2.4 */
45  pllctlv2_div_2p6, /* div 2.6 */
46  pllctlv2_div_2p8, /* div 2.8 */
47  pllctlv2_div_3p0, /* div 3.0 */
48  pllctlv2_div_3p2, /* div 3.2 */
49  pllctlv2_div_3p4, /* div 3.4 */
50  pllctlv2_div_3p6, /* div 3.6 */
51  pllctlv2_div_3p8, /* div 3.8 */
52  pllctlv2_div_4p0, /* div 4.0 */
53  pllctlv2_div_4p2, /* div 4.2 */
54  pllctlv2_div_4p4, /* div 4.4 */
55  pllctlv2_div_4p6, /* div 4.6 */
56  pllctlv2_div_4p8, /* div 4.8 */
57  pllctlv2_div_5p0, /* div 5.0 */
58  pllctlv2_div_5p2, /* div 5.2 */
59  pllctlv2_div_5p4, /* div 5.4 */
60  pllctlv2_div_5p6, /* div 5.6 */
61  pllctlv2_div_5p8, /* div 5.8 */
62  pllctlv2_div_6p0, /* div 6.0 */
63  pllctlv2_div_6p2, /* div 6.2 */
64  pllctlv2_div_6p4, /* div 6.4 */
65  pllctlv2_div_6p6, /* div 6.6 */
66  pllctlv2_div_6p8, /* div 6.8 */
67  pllctlv2_div_7p0, /* div 7.0 */
68  pllctlv2_div_7p2, /* div 7.2 */
69  pllctlv2_div_7p4, /* div 7.4 */
70  pllctlv2_div_7p6, /* div 7.6 */
71  pllctlv2_div_7p8, /* div 7.8 */
72  pllctlv2_div_8p0, /* div 8.0 */
73  pllctlv2_div_8p2, /* div 8.2 */
74  pllctlv2_div_8p4, /* div 8.4 */
75  pllctlv2_div_8p6, /* div 8.6 */
76  pllctlv2_div_8p8, /* div 8.8 */
77  pllctlv2_div_9p0, /* div 9.0 */
78  pllctlv2_div_9p2, /* div 9.2 */
79  pllctlv2_div_9p4, /* div 9.4 */
80  pllctlv2_div_9p6, /* div 9.6 */
81  pllctlv2_div_9p8, /* div 9.8 */
82  pllctlv2_div_10p0, /* div 10.0 */
83  pllctlv2_div_10p2, /* div 10.2 */
84  pllctlv2_div_10p4, /* div 10.4 */
85  pllctlv2_div_10p6, /* div 10.6 */
86  pllctlv2_div_10p8, /* div 10.8 */
87  pllctlv2_div_11p0, /* div 11.0 */
88  pllctlv2_div_11p2, /* div 11.2 */
89  pllctlv2_div_11p4, /* div 11.4 */
90  pllctlv2_div_11p6, /* div 11.6 */
91  pllctlv2_div_11p8, /* div 11.8 */
92  pllctlv2_div_12p0, /* div 12.0 */
93  pllctlv2_div_12p2, /* div 12.2 */
94  pllctlv2_div_12p4, /* div 12.4 */
95  pllctlv2_div_12p6, /* div 12.6 */
96  pllctlv2_div_12p8, /* div 12.8 */
97  pllctlv2_div_13p0, /* div 13.0 */
98  pllctlv2_div_13p2, /* div 13.2 */
99  pllctlv2_div_13p4, /* div 13.4 */
100  pllctlv2_div_13p6, /* div 13.6 */
101  } pllctlv2_div_t;
102 
114 static inline bool pllctlv2_xtal_is_stable(PLLCTLV2_Type *ptr)
115 {
116  uint32_t status = ptr->XTAL;
119 }
120 
126 static inline bool pllctlv2_xtal_is_enabled(PLLCTLV2_Type *ptr)
127 {
129 }
130 
137 static inline void pllctlv2_xtal_set_rampup_time(PLLCTLV2_Type *ptr, uint32_t rc24m_cycles)
138 {
139  ptr->XTAL = (ptr->XTAL & ~PLLCTLV2_XTAL_RAMP_TIME_MASK) | PLLCTLV2_XTAL_RAMP_TIME_SET(rc24m_cycles);
140 }
141 
149 {
150  uint32_t status = ptr->PLL[pll].MFI;
153 }
154 
162 {
164 }
165 
174 {
175  uint32_t status = ptr->PLL[pll].DIV[clk];
178 }
179 
188 static inline void pllctlv2_select_reference_clock(PLLCTLV2_Type *ptr, pllctlv2_pll_t pll, uint8_t src)
189 {
191 }
192 
201 void pllctlv2_enable_spread_spectrum(PLLCTLV2_Type *ptr, pllctlv2_pll_t pll, uint32_t step, uint32_t stop);
202 
209 {
211 }
212 
220 static inline void pllctlv2_set_pll_lock_time(PLLCTLV2_Type *ptr, pllctlv2_pll_t pll, uint32_t xtal_cycles)
221 {
222  ptr->PLL[pll].LOCKTIME = PLLCTLV2_PLL_LOCKTIME_LOCKTIME_SET(xtal_cycles);
223 }
224 
232 static inline void pllctlv2_set_pll_step_time(PLLCTLV2_Type *ptr, pllctlv2_pll_t pll, uint32_t xtal_cycles)
233 {
234  ptr->PLL[pll].STEPTIME = PLLCTLV2_PLL_STEPTIME_STEPTIME_SET(xtal_cycles);
235 }
236 
243 {
245 }
246 
253 {
255 }
256 
263 {
265 }
266 
273 {
275 }
276 
286 
297 hpm_stat_t pllctlv2_set_pll_with_mfi_mfn(PLLCTLV2_Type *ptr, pllctlv2_pll_t pll, uint32_t mfi, uint32_t mfn);
298 
309 
317 
326 
336 void pllctlv2_setup_spread_spectrum(PLLCTLV2_Type *ptr, pllctlv2_pll_t pll, uint8_t spread_range, uint32_t modulation_freq);
337 
341 #endif /* HPM_PLLCTLV2_DRV_H */
#define PLLCTLV2_XTAL_BUSY_MASK
Definition: hpm_pllctlv2_regs.h:40
#define PLLCTLV2_XTAL_RESPONSE_MASK
Definition: hpm_pllctlv2_regs.h:51
#define PLLCTLV2_PLL_DIV_BUSY_MASK
Definition: hpm_pllctlv2_regs.h:252
#define PLLCTLV2_PLL_DIV_ENABLE_MASK
Definition: hpm_pllctlv2_regs.h:274
#define PLLCTLV2_PLL_DIV_RESPONSE_MASK
Definition: hpm_pllctlv2_regs.h:263
#define PLLCTLV2_PLL_CONFIG_REFSEL_MASK
Definition: hpm_pllctlv2_regs.h:194
#define PLLCTLV2_PLL_MFI_ENABLE_MASK
Definition: hpm_pllctlv2_regs.h:110
#define PLLCTLV2_PLL_MFI_BUSY_MASK
Definition: hpm_pllctlv2_regs.h:88
#define PLLCTLV2_PLL_CONFIG_SPREAD_MASK
Definition: hpm_pllctlv2_regs.h:182
#define PLLCTLV2_PLL_ADVANCED_DITHER_MASK
Definition: hpm_pllctlv2_regs.h:239
#define PLLCTLV2_PLL_ADVANCED_SLOW_MASK
Definition: hpm_pllctlv2_regs.h:229
#define PLLCTLV2_PLL_MFI_RESPONSE_MASK
Definition: hpm_pllctlv2_regs.h:99
#define PLLCTLV2_PLL_STEPTIME_STEPTIME_SET(x)
Definition: hpm_pllctlv2_regs.h:218
#define PLLCTLV2_PLL_LOCKTIME_LOCKTIME_SET(x)
Definition: hpm_pllctlv2_regs.h:207
#define PLLCTLV2_XTAL_RAMP_TIME_MASK
Definition: hpm_pllctlv2_regs.h:75
#define PLLCTLV2_XTAL_RAMP_TIME_SET(x)
Definition: hpm_pllctlv2_regs.h:77
#define PLLCTLV2_XTAL_ENABLE_MASK
Definition: hpm_pllctlv2_regs.h:62
#define PLLCTLV2_PLL_CONFIG_REFSEL_SET(x)
Definition: hpm_pllctlv2_regs.h:196
uint32_t hpm_stat_t
Definition: hpm_common.h:135
#define IS_HPM_BITMASK_CLR(val, mask)
Definition: hpm_common.h:63
#define IS_HPM_BITMASK_SET(val, mask)
Definition: hpm_common.h:61
hpm_stat_t pllctlv2_init_pll_with_freq(PLLCTLV2_Type *ptr, pllctlv2_pll_t pll, uint32_t freq_in_hz)
Initializes the PLL to generate a specific output frequency.
Definition: hpm_pllctlv2_drv.c:45
void pllctlv2_setup_spread_spectrum(PLLCTLV2_Type *ptr, pllctlv2_pll_t pll, uint8_t spread_range, uint32_t modulation_freq)
Configures spread spectrum modulation parameters for a PLL.
Definition: hpm_pllctlv2_drv.c:146
static bool pllctlv2_pll_is_enabled(PLLCTLV2_Type *ptr, pllctlv2_pll_t pll)
Checks if the specified PLL is enabled.
Definition: hpm_pllctlv2_drv.h:161
static bool pllctlv2_xtal_is_enabled(PLLCTLV2_Type *ptr)
Checks if the external crystal oscillator is enabled.
Definition: hpm_pllctlv2_drv.h:126
static void pllctlv2_select_reference_clock(PLLCTLV2_Type *ptr, pllctlv2_pll_t pll, uint8_t src)
Selects the reference clock source for the specified PLL.
Definition: hpm_pllctlv2_drv.h:188
static void pllctlv2_enable_slow_lock(PLLCTLV2_Type *ptr, pllctlv2_pll_t pll)
Enable slow lock for the specified PLL.
Definition: hpm_pllctlv2_drv.h:262
static void pllctlv2_enable_dither(PLLCTLV2_Type *ptr, pllctlv2_pll_t pll)
Enable dither for the specified PLL.
Definition: hpm_pllctlv2_drv.h:242
uint32_t pllctlv2_get_pll_freq_in_hz(PLLCTLV2_Type *ptr, pllctlv2_pll_t pll)
Retrieves the current output frequency of the specified PLL.
Definition: hpm_pllctlv2_drv.c:101
void pllctlv2_enable_spread_spectrum(PLLCTLV2_Type *ptr, pllctlv2_pll_t pll, uint32_t step, uint32_t stop)
Enables and configures the spread spectrum modulation for the specified PLL.
Definition: hpm_pllctlv2_drv.c:71
static void pllctlv2_disable_slow_lock(PLLCTLV2_Type *ptr, pllctlv2_pll_t pll)
Disable slow lock for the specified PLL.
Definition: hpm_pllctlv2_drv.h:272
static bool pllctlv2_xtal_is_stable(PLLCTLV2_Type *ptr)
Checks the stability status of the external crystal oscillator.
Definition: hpm_pllctlv2_drv.h:114
static bool pllctlv2_pll_clk_is_stable(PLLCTLV2_Type *ptr, pllctlv2_pll_t pll, pllctlv2_clk_t clk)
Checks if the specified PLL CLK has achieved stable operation.
Definition: hpm_pllctlv2_drv.h:173
static void pllctlv2_set_pll_lock_time(PLLCTLV2_Type *ptr, pllctlv2_pll_t pll, uint32_t xtal_cycles)
Sets the lock time for the specified PLL.
Definition: hpm_pllctlv2_drv.h:220
hpm_stat_t pllctlv2_set_pll_with_mfi_mfn(PLLCTLV2_Type *ptr, pllctlv2_pll_t pll, uint32_t mfi, uint32_t mfn)
Configures the PLL frequency using direct MFI and MFN values.
Definition: hpm_pllctlv2_drv.c:25
static bool pllctlv2_pll_is_stable(PLLCTLV2_Type *ptr, pllctlv2_pll_t pll)
Checks if the specified PLL has achieved stable operation.
Definition: hpm_pllctlv2_drv.h:148
uint32_t pllctlv2_get_pll_postdiv_freq_in_hz(PLLCTLV2_Type *ptr, pllctlv2_pll_t pll, pllctlv2_clk_t clk)
Retrieves the frequency of a specific PLL post-divider output.
Definition: hpm_pllctlv2_drv.c:134
static void pllctlv2_disable_spread_spectrum(PLLCTLV2_Type *ptr, pllctlv2_pll_t pll)
Disables the spread spectrum modulation for the specified PLL.
Definition: hpm_pllctlv2_drv.h:208
static void pllctlv2_xtal_set_rampup_time(PLLCTLV2_Type *ptr, uint32_t rc24m_cycles)
Configures the ramp-up time for the external crystal oscillator.
Definition: hpm_pllctlv2_drv.h:137
void pllctlv2_set_postdiv(PLLCTLV2_Type *ptr, pllctlv2_pll_t pll, pllctlv2_clk_t clk, pllctlv2_div_t div_value)
Configures the post-divider for a specific PLL output clock.
Definition: hpm_pllctlv2_drv.c:89
static void pllctlv2_disable_dither(PLLCTLV2_Type *ptr, pllctlv2_pll_t pll)
Disable dither for the specified PLL.
Definition: hpm_pllctlv2_drv.h:252
static void pllctlv2_set_pll_step_time(PLLCTLV2_Type *ptr, pllctlv2_pll_t pll, uint32_t xtal_cycles)
Sets the step time for frequency changes in the specified PLL.
Definition: hpm_pllctlv2_drv.h:232
pllctlv2_pll_t
Definition: hpm_pllctlv2_drv.h:19
@ pllctlv2_pll1
Definition: hpm_pllctlv2_drv.h:21
@ pllctlv2_pll2
Definition: hpm_pllctlv2_drv.h:22
@ pllctlv2_pll6
Definition: hpm_pllctlv2_drv.h:26
@ pllctlv2_pll3
Definition: hpm_pllctlv2_drv.h:23
@ pllctlv2_pll4
Definition: hpm_pllctlv2_drv.h:24
@ pllctlv2_pll0
Definition: hpm_pllctlv2_drv.h:20
@ pllctlv2_pll5
Definition: hpm_pllctlv2_drv.h:25
pllctlv2_clk_t
Definition: hpm_pllctlv2_drv.h:29
@ pllctlv2_clk2
Definition: hpm_pllctlv2_drv.h:32
@ pllctlv2_clk3
Definition: hpm_pllctlv2_drv.h:33
@ pllctlv2_clk1
Definition: hpm_pllctlv2_drv.h:31
@ pllctlv2_clk0
Definition: hpm_pllctlv2_drv.h:30
pllctlv2_div_t
Definition: hpm_pllctlv2_drv.h:36
@ pllctlv2_div_7p6
Definition: hpm_pllctlv2_drv.h:70
@ pllctlv2_div_2p8
Definition: hpm_pllctlv2_drv.h:46
@ pllctlv2_div_13p4
Definition: hpm_pllctlv2_drv.h:99
@ pllctlv2_div_9p2
Definition: hpm_pllctlv2_drv.h:78
@ pllctlv2_div_12p6
Definition: hpm_pllctlv2_drv.h:95
@ pllctlv2_div_10p2
Definition: hpm_pllctlv2_drv.h:83
@ pllctlv2_div_8p6
Definition: hpm_pllctlv2_drv.h:75
@ pllctlv2_div_10p4
Definition: hpm_pllctlv2_drv.h:84
@ pllctlv2_div_5p4
Definition: hpm_pllctlv2_drv.h:59
@ pllctlv2_div_7p8
Definition: hpm_pllctlv2_drv.h:71
@ pllctlv2_div_7p2
Definition: hpm_pllctlv2_drv.h:68
@ pllctlv2_div_3p0
Definition: hpm_pllctlv2_drv.h:47
@ pllctlv2_div_13p0
Definition: hpm_pllctlv2_drv.h:97
@ pllctlv2_div_4p0
Definition: hpm_pllctlv2_drv.h:52
@ pllctlv2_div_11p4
Definition: hpm_pllctlv2_drv.h:89
@ pllctlv2_div_8p2
Definition: hpm_pllctlv2_drv.h:73
@ pllctlv2_div_5p6
Definition: hpm_pllctlv2_drv.h:60
@ pllctlv2_div_5p8
Definition: hpm_pllctlv2_drv.h:61
@ pllctlv2_div_12p2
Definition: hpm_pllctlv2_drv.h:93
@ pllctlv2_div_6p8
Definition: hpm_pllctlv2_drv.h:66
@ pllctlv2_div_6p2
Definition: hpm_pllctlv2_drv.h:63
@ pllctlv2_div_10p6
Definition: hpm_pllctlv2_drv.h:85
@ pllctlv2_div_9p0
Definition: hpm_pllctlv2_drv.h:77
@ pllctlv2_div_1p2
Definition: hpm_pllctlv2_drv.h:38
@ pllctlv2_div_11p6
Definition: hpm_pllctlv2_drv.h:90
@ pllctlv2_div_1p0
Definition: hpm_pllctlv2_drv.h:37
@ pllctlv2_div_4p4
Definition: hpm_pllctlv2_drv.h:54
@ pllctlv2_div_7p0
Definition: hpm_pllctlv2_drv.h:67
@ pllctlv2_div_8p0
Definition: hpm_pllctlv2_drv.h:72
@ pllctlv2_div_2p2
Definition: hpm_pllctlv2_drv.h:43
@ pllctlv2_div_7p4
Definition: hpm_pllctlv2_drv.h:69
@ pllctlv2_div_2p4
Definition: hpm_pllctlv2_drv.h:44
@ pllctlv2_div_11p8
Definition: hpm_pllctlv2_drv.h:91
@ pllctlv2_div_4p8
Definition: hpm_pllctlv2_drv.h:56
@ pllctlv2_div_8p8
Definition: hpm_pllctlv2_drv.h:76
@ pllctlv2_div_2p0
Definition: hpm_pllctlv2_drv.h:42
@ pllctlv2_div_13p2
Definition: hpm_pllctlv2_drv.h:98
@ pllctlv2_div_12p0
Definition: hpm_pllctlv2_drv.h:92
@ pllctlv2_div_9p8
Definition: hpm_pllctlv2_drv.h:81
@ pllctlv2_div_9p4
Definition: hpm_pllctlv2_drv.h:79
@ pllctlv2_div_13p6
Definition: hpm_pllctlv2_drv.h:100
@ pllctlv2_div_3p4
Definition: hpm_pllctlv2_drv.h:49
@ pllctlv2_div_2p6
Definition: hpm_pllctlv2_drv.h:45
@ pllctlv2_div_1p8
Definition: hpm_pllctlv2_drv.h:41
@ pllctlv2_div_6p6
Definition: hpm_pllctlv2_drv.h:65
@ pllctlv2_div_9p6
Definition: hpm_pllctlv2_drv.h:80
@ pllctlv2_div_12p4
Definition: hpm_pllctlv2_drv.h:94
@ pllctlv2_div_1p6
Definition: hpm_pllctlv2_drv.h:40
@ pllctlv2_div_3p2
Definition: hpm_pllctlv2_drv.h:48
@ pllctlv2_div_11p2
Definition: hpm_pllctlv2_drv.h:88
@ pllctlv2_div_11p0
Definition: hpm_pllctlv2_drv.h:87
@ pllctlv2_div_3p6
Definition: hpm_pllctlv2_drv.h:50
@ pllctlv2_div_10p0
Definition: hpm_pllctlv2_drv.h:82
@ pllctlv2_div_8p4
Definition: hpm_pllctlv2_drv.h:74
@ pllctlv2_div_1p4
Definition: hpm_pllctlv2_drv.h:39
@ pllctlv2_div_6p4
Definition: hpm_pllctlv2_drv.h:64
@ pllctlv2_div_6p0
Definition: hpm_pllctlv2_drv.h:62
@ pllctlv2_div_5p2
Definition: hpm_pllctlv2_drv.h:58
@ pllctlv2_div_5p0
Definition: hpm_pllctlv2_drv.h:57
@ pllctlv2_div_12p8
Definition: hpm_pllctlv2_drv.h:96
@ pllctlv2_div_3p8
Definition: hpm_pllctlv2_drv.h:51
@ pllctlv2_div_4p6
Definition: hpm_pllctlv2_drv.h:55
@ pllctlv2_div_10p8
Definition: hpm_pllctlv2_drv.h:86
@ pllctlv2_div_4p2
Definition: hpm_pllctlv2_drv.h:53
Definition: hpm_pllctlv2_regs.h:12
__RW uint32_t ADVANCED
Definition: hpm_pllctlv2_regs.h:24
__RW uint32_t CONFIG
Definition: hpm_pllctlv2_regs.h:21
__RW uint32_t XTAL
Definition: hpm_pllctlv2_regs.h:13
__RW uint32_t STEPTIME
Definition: hpm_pllctlv2_regs.h:23
__RW uint32_t MFI
Definition: hpm_pllctlv2_regs.h:16
__RW uint32_t DIV[3]
Definition: hpm_pllctlv2_regs.h:26
__RW uint32_t LOCKTIME
Definition: hpm_pllctlv2_regs.h:22
struct PLLCTLV2_Type::@325 PLL[2]