HPM SDK
HPMicro Software Development Kit
hpm_pllctlv2_drv.h
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2022-2024 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 {
117 }
118 
124 static inline bool pllctlv2_xtal_is_enabled(PLLCTLV2_Type *ptr)
125 {
127 }
128 
134 static inline void pllctlv2_xtal_set_rampup_time(PLLCTLV2_Type *ptr, uint32_t rc24m_cycles)
135 {
136  ptr->XTAL = (ptr->XTAL & ~PLLCTLV2_XTAL_RAMP_TIME_MASK) | PLLCTLV2_XTAL_RAMP_TIME_SET(rc24m_cycles);
137 }
138 
146 {
148 }
149 
157 {
159 }
160 
169 static inline void pllctlv2_select_reference_clock(PLLCTLV2_Type *ptr, pllctlv2_pll_t pll, uint8_t src)
170 {
172 }
173 
181 void pllctlv2_enable_spread_spectrum(PLLCTLV2_Type *ptr, pllctlv2_pll_t pll, uint32_t step, uint32_t stop);
182 
189 {
191 }
192 
199 static inline void pllctlv2_set_pll_lock_time(PLLCTLV2_Type *ptr, pllctlv2_pll_t pll, uint32_t xtal_cycles)
200 {
201  ptr->PLL[pll].LOCKTIME = PLLCTLV2_PLL_LOCKTIME_LOCKTIME_SET(xtal_cycles);
202 }
203 
210 static inline void pllctlv2_set_pll_step_time(PLLCTLV2_Type *ptr, pllctlv2_pll_t pll, uint32_t xtal_cycles)
211 {
212  ptr->PLL[pll].STEPTIME = PLLCTLV2_PLL_STEPTIME_STEPTIME_SET(xtal_cycles);
213 }
214 
223 
234 hpm_stat_t pllctlv2_set_pll_with_mfi_mfn(PLLCTLV2_Type *ptr, pllctlv2_pll_t pll, uint32_t mfi, uint32_t mfn);
235 
246 
254 
263 
264 
268 #endif /* HPM_PLLCTLV2_DRV_H */
#define PLLCTLV2_XTAL_RESPONSE_MASK
Definition: hpm_pllctlv2_regs.h:51
#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_CONFIG_SPREAD_MASK
Definition: hpm_pllctlv2_regs.h:182
#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:126
#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)
Initialize PLL to specified frequency Note: the specified PLL clock needs to be enabled before being ...
Definition: hpm_pllctlv2_drv.c:39
static bool pllctlv2_pll_is_enabled(PLLCTLV2_Type *ptr, pllctlv2_pll_t pll)
Check if PLL is enabled.
Definition: hpm_pllctlv2_drv.h:156
static bool pllctlv2_xtal_is_enabled(PLLCTLV2_Type *ptr)
Check if external crystal is enabled.
Definition: hpm_pllctlv2_drv.h:124
static void pllctlv2_select_reference_clock(PLLCTLV2_Type *ptr, pllctlv2_pll_t pll, uint8_t src)
Select the PLL reference clock.
Definition: hpm_pllctlv2_drv.h:169
uint32_t pllctlv2_get_pll_freq_in_hz(PLLCTLV2_Type *ptr, pllctlv2_pll_t pll)
Get the specified PLl clock frequency.
Definition: hpm_pllctlv2_drv.c:91
void pllctlv2_enable_spread_spectrum(PLLCTLV2_Type *ptr, pllctlv2_pll_t pll, uint32_t step, uint32_t stop)
Enable PLL Spread Spectrum feature.
Definition: hpm_pllctlv2_drv.c:64
static bool pllctlv2_xtal_is_stable(PLLCTLV2_Type *ptr)
Check if external crystal is stable.
Definition: hpm_pllctlv2_drv.h:114
static void pllctlv2_set_pll_lock_time(PLLCTLV2_Type *ptr, pllctlv2_pll_t pll, uint32_t xtal_cycles)
Set PLL lock time.
Definition: hpm_pllctlv2_drv.h:199
hpm_stat_t pllctlv2_set_pll_with_mfi_mfn(PLLCTLV2_Type *ptr, pllctlv2_pll_t pll, uint32_t mfi, uint32_t mfn)
Set the PLL via the low-level MFI, MFD and MFN PLL frequency = REF CLOCK * (mfi + 1....
Definition: hpm_pllctlv2_drv.c:21
static bool pllctlv2_pll_is_stable(PLLCTLV2_Type *ptr, pllctlv2_pll_t pll)
Check is PLL is stable.
Definition: hpm_pllctlv2_drv.h:145
uint32_t pllctlv2_get_pll_postdiv_freq_in_hz(PLLCTLV2_Type *ptr, pllctlv2_pll_t pll, pllctlv2_clk_t clk)
Get the selected PLL post divider frequency.
Definition: hpm_pllctlv2_drv.c:103
static void pllctlv2_disable_spread_spectrum(PLLCTLV2_Type *ptr, pllctlv2_pll_t pll)
Disable PLL Spread spectrum.
Definition: hpm_pllctlv2_drv.h:188
static void pllctlv2_xtal_set_rampup_time(PLLCTLV2_Type *ptr, uint32_t rc24m_cycles)
Set external crystal ramp-up time.
Definition: hpm_pllctlv2_drv.h:134
void pllctlv2_set_postdiv(PLLCTLV2_Type *ptr, pllctlv2_pll_t pll, pllctlv2_clk_t clk, pllctlv2_div_t div_value)
Set PLL Post divider.
Definition: hpm_pllctlv2_drv.c:82
static void pllctlv2_set_pll_step_time(PLLCTLV2_Type *ptr, pllctlv2_pll_t pll, uint32_t xtal_cycles)
Set PLL step time.
Definition: hpm_pllctlv2_drv.h:210
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 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
struct PLLCTLV2_Type::@315 PLL[2]
__RW uint32_t MFI
Definition: hpm_pllctlv2_regs.h:16
__RW uint32_t LOCKTIME
Definition: hpm_pllctlv2_regs.h:22