|
SmartSnippets DA1459x SDK
|
Go to the documentation of this file.
42 #ifndef HW_CLK_DA1459x_H_
43 #define HW_CLK_DA1459x_H_
46 #if dg_configUSE_HW_CLK
50 #if (dg_configHW_FCU_WAIT_CYCLES_MODE)
51 #include "../src/hw_sys_internal.h"
54 #define HW_CLK_DELAY_OVERHEAD_CYCLES (72)
55 #define HW_CLK_CYCLES_PER_DELAY_REP (4)
67 #define XTAL32M_USEC_TO_250K_CYCLES(x) ((uint16_t)((x * (dg_configRC32M_FREQ/1000000) + 127) / 128))
79 #define XTALRDY_CYCLES_TO_LP_CLK_CYCLES(x, lp_freq) ((((uint32_t)(x)) * lp_freq + dg_configRC32M_FREQ_MIN/(128) - 1) / (dg_configRC32M_FREQ_MIN/128))
90 SYS_CLK_IS_XTAL32M = 0,
116 CALIBRATE_REF_DIVN = 0,
119 CALIBRATE_REF_XTAL32K,
167 return REG_GETF(CRG_TOP, CLK_RC32M_REG, RC32M_ENABLE);
210 uint32_t val = CRG_XTAL->XTAL32M_IRQ_CTRL_REG;
211 uint16_t cycles =
REG_GET_FIELD(CRG_XTAL, XTAL32M_IRQ_CTRL_REG, XTAL32M_IRQ_CNT, val);
213 if (
REG_GET_FIELD(CRG_XTAL, XTAL32M_IRQ_CTRL_REG, XTAL32M_IRQ_CLK, val) == 1) {
227 return REG_GETF(CRG_XTAL, XTAL32M_STAT0_REG, XTAL32M_READY) == 1;
236 if (
REG_GETF(CRG_TOP, CLK_CTRL_REG, RUNNING_AT_XTAL32M)) {
241 ASSERT_WARNING(
REG_GETF(CRG_TOP, SYS_STAT_REG, TIM_IS_UP));
246 REG_SET_BIT(CRG_XTAL, XTAL32M_CTRL_REG, XTAL32M_ENABLE);
254 REG_CLR_BIT(CRG_XTAL, XTAL32M_CTRL_REG, XTAL32M_ENABLE);
264 return (
REG_GETF(CRG_XTAL, XTAL32M_STAT0_REG, XTAL32M_READY) &&
265 REG_GETF(CRG_XTAL, XTAL32M_IRQ_STAT_REG, XTAL32M_IRQ_COUNT_STAT) == 0);
290 ASSERT_WARNING(index <= 4);
293 ASSERT_WARNING(clk != SYS_CLK_IS_INVALID);
314 return REG_GETF(CRG_TOP, CLK_XTAL32K_REG, XTAL32K_ENABLE) &&
315 (
REG_GETF(CRG_TOP, CLK_CTRL_REG, LP_CLK_SEL) == LP_CLK_IS_XTAL32K);
325 return (!
REG_GETF(CRG_TOP, CLK_RCLP_REG, RCLP_DISABLE)) &&
326 (
REG_GETF(CRG_TOP, CLK_CTRL_REG, LP_CLK_SEL) == LP_CLK_IS_RCLP);
336 return REG_GETF(CRG_TOP, CLK_RCX_REG, RCX_ENABLE) &&
337 (
REG_GETF(CRG_TOP, CLK_CTRL_REG, LP_CLK_SEL) == LP_CLK_IS_RCX);
347 return REG_GETF(CRG_TOP, CLK_CTRL_REG, LP_CLK_SEL) == LP_CLK_IS_EXTERNAL;
361 ASSERT_WARNING(
REG_GETF(CRG_TOP, CLK_RCX_REG, RCX_ENABLE));
363 REG_SETF(CRG_TOP, CLK_CTRL_REG, LP_CLK_SEL, LP_CLK_IS_RCX);
377 ASSERT_WARNING(
REG_GETF(CRG_TOP, CLK_XTAL32K_REG, XTAL32K_ENABLE));
379 REG_SETF(CRG_TOP, CLK_CTRL_REG, LP_CLK_SEL, LP_CLK_IS_XTAL32K);
392 REG_SETF(CRG_TOP, CLK_CTRL_REG, LP_CLK_SEL, LP_CLK_IS_EXTERNAL);
445 ASSERT_WARNING(
REG_GETF(CRG_TOP, CLK_CTRL_REG, LP_CLK_SEL) != LP_CLK_IS_RCLP);
461 ASSERT_WARNING(!
REG_GETF(CRG_TOP, CLK_RCLP_REG, RCLP_DISABLE));
463 REG_SETF(CRG_TOP, CLK_CTRL_REG, LP_CLK_SEL, LP_CLK_IS_RCLP);
489 ASSERT_WARNING(
REG_GETF(CRG_TOP, CLK_CTRL_REG, LP_CLK_SEL) != LP_CLK_IS_RCX);
500 uint32_t reg = CRG_TOP->CLK_XTAL32K_REG;
501 REG_SET_FIELD(CRG_TOP, CLK_XTAL32K_REG, XTAL32K_CUR, reg, 5);
502 REG_SET_FIELD(CRG_TOP, CLK_XTAL32K_REG, XTAL32K_RBIAS, reg, 3);
506 CRG_TOP->CLK_XTAL32K_REG = reg;
514 REG_SET_BIT(CRG_TOP, CLK_XTAL32K_REG, XTAL32K_ENABLE);
524 ASSERT_WARNING(
REG_GETF(CRG_TOP, CLK_CTRL_REG, LP_CLK_SEL) != LP_CLK_IS_XTAL32K);
525 REG_CLR_BIT(CRG_TOP, CLK_XTAL32K_REG, XTAL32K_ENABLE);
534 REG_SET_BIT(ANAMISC_BIF, CLK_CAL_IRQ_REG, CLK_CAL_IRQ_EN);
543 REG_SET_BIT(ANAMISC_BIF, CLK_CAL_IRQ_REG, CLK_CAL_IRQ_CLR);
553 return REG_GETF(ANAMISC_BIF, CLK_CAL_IRQ_REG, CLK_CAL_IRQ_STATUS) == 0;
563 return REG_GETF(ANAMISC_BIF, CLK_REF_SEL_REG, REF_CAL_START) == 0;
602 ASSERT_WARNING(
mode <= SYS_CLK_IS_DBLR);
605 ASSERT_WARNING(
mode != SYS_CLK_IS_DBLR ||
606 REG_GETF(CRG_TOP, CLK_CTRL_REG, RUNNING_AT_XTAL32M) ||
607 REG_GETF(CRG_TOP, CLK_CTRL_REG, RUNNING_AT_DBLR64M))
613 ASSERT_WARNING(!
REG_GETF(CRG_TOP, CLK_CTRL_REG, RUNNING_AT_DBLR64M) ||
614 mode == SYS_CLK_IS_XTAL32M ||
615 mode == SYS_CLK_IS_DBLR);
617 #if dg_configHW_FCU_WAIT_CYCLES_MODE
618 hw_sys_fcu_set_max_wait_cycles();
620 if (
mode == SYS_CLK_IS_XTAL32M &&
REG_GETF(CRG_TOP, CLK_CTRL_REG, RUNNING_AT_RC32M)) {
621 REG_SET_BIT(CRG_TOP, CLK_SWITCH2XTAL_REG, SWITCH2XTAL);
631 case SYS_CLK_IS_XTAL32M:
632 while (!
REG_GETF(CRG_TOP, CLK_CTRL_REG, RUNNING_AT_XTAL32M)) {
636 case SYS_CLK_IS_RC32:
637 while (!
REG_GETF(CRG_TOP, CLK_CTRL_REG, RUNNING_AT_RC32M)) {
642 while (!
REG_GETF(CRG_TOP, CLK_CTRL_REG, RUNNING_AT_LP_CLK)) {
646 case SYS_CLK_IS_DBLR:
647 while (!
REG_GETF(CRG_TOP, CLK_CTRL_REG, RUNNING_AT_DBLR64M)) {
653 #if dg_configHW_FCU_WAIT_CYCLES_MODE
654 hw_sys_fcu_set_optimum_wait_cycles();
667 #if dg_configHW_FCU_WAIT_CYCLES_MODE
668 hw_sys_fcu_set_max_wait_cycles();
669 REG_SETF(CRG_TOP, CLK_AMBA_REG, HCLK_DIV, div);
670 hw_sys_fcu_set_optimum_wait_cycles();
672 REG_SETF(CRG_TOP, CLK_AMBA_REG, HCLK_DIV, div);
685 ASSERT_WARNING(
REG_GETF(CRG_TOP, POWER_LEVEL_REG, XTAL32M_LDO_LEVEL) > 2);
706 ASSERT_WARNING(!
REG_GETF(CRG_TOP, CLK_CTRL_REG, RUNNING_AT_DBLR64M));
724 return REG_GETF(CRG_XTAL, CLKDBLR_CTRL1_REG, ENABLE);
734 return REG_GETF(CRG_XTAL, CLKDBLR_STATUS_REG , OUTPUT_READY);
745 case SYS_CLK_IS_XTAL32M:
748 case SYS_CLK_IS_RC32:
751 case SYS_CLK_IS_DBLR:
768 case SYS_CLK_IS_XTAL32M:
771 case SYS_CLK_IS_RC32:
774 case SYS_CLK_IS_DBLR:
791 case SYS_CLK_IS_XTAL32M:
793 case SYS_CLK_IS_RC32:
795 case SYS_CLK_IS_DBLR:
809 GPIO-> P1_14_MODE_REG = 0;
859 REG_SET_BIT(CRG_XTAL, XTAL32M_IRQ_CTRL_REG, XTAL32M_IRQ_ENABLE);
__STATIC_INLINE void hw_clk_configure_rcx(void)
Configure RCX. This must be done only once since the register is retained.
Definition: hw_clk_da1459x.h:469
#define REG_SET_MASKED(base, reg, mask, value)
Sets register bits, indicated by the mask, to a value.
Definition: sdk_defs.h:794
__STATIC_FORCEINLINE void hw_clk_disable_rc32(void)
Deactivate the RC32M.
Definition: hw_clk_da1459x.h:181
__STATIC_INLINE bool hw_clk_lp_is_xtal32k(void)
Check whether the XTAL32K is the Low Power clock.
Definition: hw_clk_da1459x.h:312
4 MHz
Definition: hw_clk_da1459x.h:153
#define REG_SETF(base, reg, field, new_val)
Set the value of a register field.
Definition: sdk_defs.h:738
#define REG_CLR_BIT(base, reg, field)
Clear a bit of a register.
Definition: sdk_defs.h:781
__STATIC_INLINE void hw_clk_calibration_enable_irq(void)
Enable the clock calibration interrupt.
Definition: hw_clk_da1459x.h:532
#define REG_SET_BIT(base, reg, field)
Set a bit of a register.
Definition: sdk_defs.h:766
__STATIC_INLINE bool hw_clk_is_enabled_sysclk(sys_clk_is_t clk)
Check if a System clock is enabled.
Definition: hw_clk_da1459x.h:788
__STATIC_INLINE void hw_clk_enable_xtalm(void)
Activate the XTAL32M.
Definition: hw_clk_da1459x.h:233
RC32.
Definition: hw_clk_da1459x.h:130
__STATIC_INLINE bool hw_clk_calibration_finished(void)
Check the status of a requested calibration.
Definition: hw_clk_da1459x.h:561
__STATIC_INLINE void hw_clk_enable_rcx(void)
Enable RCX but does not set it as the LP clock.
Definition: hw_clk_da1459x.h:477
System Driver header file.
void hw_clk_start_calibration(cal_clk_t clk_type, cal_ref_clk_t clk_ref_type, uint16_t cycles)
Start calibration of a clock.
__STATIC_INLINE bool hw_clk_check_xtalm_status(void)
Check if the XTAL32M is enabled.
Definition: hw_clk_da1459x.h:225
sysclk_type
The system clock type.
Definition: hw_clk_da1459x.h:129
Central include header file with platform definitions.
__STATIC_INLINE void hw_clk_set_rclp_mode(rclp_mode_t mode)
Configure RCLP.
Definition: hw_clk_da1459x.h:400
#define CRG_TOP_CLK_CTRL_REG_RUNNING_AT_LP_CLK_Pos
Definition: DA1459x-00.h:1958
32kHz
Definition: hw_clk_da1459x.h:143
__STATIC_INLINE void hw_clk_enable_xtal32k(void)
Enable XTAL32K but do not set it as the LP clock.
Definition: hw_clk_da1459x.h:512
64 MHz
Definition: hw_clk_da1459x.h:157
enum sys_clk_is_type sys_clk_is_t
The type of the system clock.
#define CRG_TOP_CLK_CTRL_REG_RUNNING_AT_LP_CLK_Msk
Definition: DA1459x-00.h:1959
__STATIC_FORCEINLINE sys_clk_is_t hw_clk_get_sysclk(void)
Return the clock used as the system clock.
Definition: hw_clk_da1459x.h:273
2 MHz
Definition: hw_clk_da1459x.h:152
__STATIC_INLINE void hw_clk_lp_set_ext32k(void)
Set an external digital clock as the Low Power clock.
Definition: hw_clk_da1459x.h:388
Divide by 1.
Definition: hw_clk.h:88
__STATIC_INLINE void hw_clk_configure_xtal32k(void)
Configure XTAL32K. This must be done only once since the register is retained.
Definition: hw_clk_da1459x.h:497
32MHz
Definition: hw_clk_da1459x.h:131
cal_ref_clk_sel_type
The reference clock used for calibration.
Definition: hw_clk_da1459x.h:115
__STATIC_INLINE bool hw_clk_lp_is_rclp(void)
Check whether the RCLP is the Low Power clock.
Definition: hw_clk_da1459x.h:323
__STATIC_INLINE bool hw_clk_check_dblr_status(void)
Check if the Doubler is enabled.
Definition: hw_clk_da1459x.h:722
#define CRG_TOP_CLK_CTRL_REG_RUNNING_AT_XTAL32M_Msk
Definition: DA1459x-00.h:1955
sys_clk_is_type
The type of the system clock.
Definition: hw_clk_da1459x.h:89
__STATIC_INLINE void hw_clk_xtalm_irq_enable(void)
Enable XTAL32M interrupt generation.
Definition: hw_clk_da1459x.h:857
__STATIC_FORCEINLINE apb_div_t hw_clk_get_pclk_div(void)
Get the divider of the AMBA Peripheral Bus.
Definition: hw_clk.h:110
__STATIC_INLINE void hw_clk_disable_xtal32k(void)
Disable XTAL32K.
Definition: hw_clk_da1459x.h:522
#define __RETAINED_CONST_INIT
Constant data retained memory attribute.
Definition: sdk_defs.h:329
__STATIC_FORCEINLINE void hw_clk_dblr_sys_on(void)
Enable the Doubler.
Definition: hw_clk_da1459x.h:680
__STATIC_INLINE rclp_mode_t hw_clk_get_rclp_mode(void)
Get RCLP mode of operation.
Definition: hw_clk_da1459x.h:425
enum cal_ref_clk_sel_type cal_ref_clk_t
The reference clock used for calibration.
__STATIC_INLINE void hw_clk_disable_rcx(void)
Disable RCX.
Definition: hw_clk_da1459x.h:487
__STATIC_INLINE void hw_clk_enable_rclp(void)
Enable RCLP.
Definition: hw_clk_da1459x.h:433
32 MHz
Definition: hw_clk_da1459x.h:156
16 MHz
Definition: hw_clk_da1459x.h:155
__STATIC_FORCEINLINE ahb_div_t hw_clk_get_hclk_div(void)
Get the divider of the AMBA High Speed Bus.
Definition: hw_clk.h:100
enum sysclk_type sys_clk_t
The system clock type.
#define CRG_TOP_CLK_CTRL_REG_RUNNING_AT_DBLR64M_Msk
Definition: DA1459x-00.h:1953
8 MHz
Definition: hw_clk_da1459x.h:154
void hw_clk_set_xtalm_settling_time(uint8_t cycles, bool high_clock)
Set the XTAL32M settling time.
enum ahbdiv_type ahb_div_t
The AMBA High-Performance Bus (AHB) clock divider.
__STATIC_INLINE bool hw_clk_is_dblr_ready(void)
Check if the Doubler is available.
Definition: hw_clk_da1459x.h:732
__STATIC_INLINE bool hw_clk_check_rc32_status(void)
Check if the RC32M is enabled.
Definition: hw_clk_da1459x.h:165
__STATIC_INLINE void hw_clk_disable_xtalm(void)
Deactivate the XTAL32M.
Definition: hw_clk_da1459x.h:252
#define REG_MSK(base, reg, field)
Access register field mask.
Definition: sdk_defs.h:583
HW_GPIO_MODE mode
Definition: hw_gpio.h:211
cal_clk_sel_type
The type of clock to be calibrated.
Definition: hw_clk_da1459x.h:104
uint32_t hw_clk_get_calibration_data(void)
Return the calibration results.
__STATIC_INLINE bool hw_clk_lp_is_external(void)
Check whether the RCX is the Low Power clock.
Definition: hw_clk_da1459x.h:345
enum rclp_mode_type rclp_mode_t
The RCLP mode.
#define REG_GET_FIELD(base, reg, field, var)
Access register field value.
Definition: sdk_defs.h:607
void hw_clk_xtalm_configure_irq(void)
Configure XTAL32M IRQ counter start value.
__STATIC_FORCEINLINE void hw_clk_set_hclk_div(ahb_div_t div)
Set the divider of the AMBA High Speed Bus.
Definition: hw_clk_da1459x.h:663
enum cal_clk_sel_type cal_clk_t
The type of clock to be calibrated.
__STATIC_INLINE void hw_clk_enable_rc32(void)
Activate the RC32M.
Definition: hw_clk_da1459x.h:173
__STATIC_INLINE bool hw_clk_lp_is_rcx(void)
Check whether the RCX is the Low Power clock.
Definition: hw_clk_da1459x.h:334
#define GLOBAL_INT_RESTORE()
Macro to restore all interrupts.
Definition: sdk_defs.h:477
__STATIC_FORCEINLINE uint16_t hw_clk_get_xtalm_settling_time(void)
Get the XTAL32M settling time (in 250kHz clock cycles).
Definition: hw_clk_da1459x.h:208
__STATIC_INLINE void hw_clk_lp_set_xtal32k(void)
Set XTAL32K as the Low Power clock.
Definition: hw_clk_da1459x.h:374
64MHz
Definition: hw_clk_da1459x.h:132
#define REG_GETF(base, reg, field)
Return the value of a register field.
Definition: sdk_defs.h:711
__STATIC_INLINE void hw_clk_disable_rclp(void)
Disable RCLP.
Definition: hw_clk_da1459x.h:443
__STATIC_INLINE void hw_clk_disable_sysclk(sys_clk_is_t clk)
Deactivate a System clock.
Definition: hw_clk_da1459x.h:765
__STATIC_INLINE void hw_clk_enable_sysclk(sys_clk_is_t clk)
Activate a System clock.
Definition: hw_clk_da1459x.h:742
__STATIC_INLINE void hw_clk_lp_set_rcx(void)
Set RCX as the Low Power clock.
Definition: hw_clk_da1459x.h:358
__STATIC_FORCEINLINE uint32_t __get_PRIMASK(void)
Get Priority Mask.
Definition: cmsis_gcc.h:390
__STATIC_FORCEINLINE void hw_clk_configure_ext32k_pins(void)
Configure pin to connect an external digital clock.
Definition: hw_clk_da1459x.h:807
__STATIC_INLINE void hw_clk_lp_set_rclp(void)
Set RCLP as the Low Power clock.
Definition: hw_clk_da1459x.h:458
not applicable
Definition: hw_clk_da1459x.h:133
rclp_mode_type
The RCLP mode.
Definition: hw_clk_da1459x.h:141
#define REG_SET_FIELD(base, reg, field, var, val)
Set register field value.
Definition: sdk_defs.h:626
#define CRG_TOP_CLK_CTRL_REG_RUNNING_AT_RC32M_Msk
Definition: DA1459x-00.h:1957
Divide by 1.
Definition: hw_clk.h:76
__STATIC_INLINE bool hw_clk_calibration_status_irq(void)
Read the status of the clock calibration interrupt.
Definition: hw_clk_da1459x.h:551
__STATIC_INLINE void hw_clk_calibration_clear_irq(void)
Clear the clock calibration interrupt.
Definition: hw_clk_da1459x.h:541
#define dg_configEXT_LP_IS_DIGITAL
External LP type.
Definition: bsp_defaults.h:174
32kHz/512kHz
Definition: hw_clk_da1459x.h:142
__STATIC_INLINE bool hw_clk_is_xtalm_started(void)
Check if the XTAL32M has settled.
Definition: hw_clk_da1459x.h:262
enum cpu_clk_type cpu_clk_t
The CPU clock type (speed)
#define GLOBAL_INT_DISABLE()
Macro to disable all interrupts.
Definition: sdk_defs.h:452
__STATIC_FORCEINLINE void hw_clk_dblr_sys_off(void)
Disable the Doubler.
Definition: hw_clk_da1459x.h:701
__STATIC_INLINE void hw_clk_set_sysclk(sys_clk_is_t mode)
Set System clock.
Definition: hw_clk_da1459x.h:599
int8_t hw_clk_xtalm_configure_cur_set(void)
Configure XTAL32M current setting.
cpu_clk_type
The CPU clock type (speed)
Definition: hw_clk_da1459x.h:151
512kHz
Definition: hw_clk_da1459x.h:144
__RETAINED_CODE sys_clk_t hw_clk_get_system_clock(void)
Get the current system clock.
Divide by 16.
Definition: hw_clk.h:80