Loading...
Searching...
No Matches
clock_conf.h
Go to the documentation of this file.
1/*
2 * SPDX-FileCopyrightText: 2025 Tom Hert <git@annsann.eu>
3 * SPDX-FileCopyrightText: 2025 HAW Hamburg
4 * SPDX-License-Identifier: LGPL-2.1-only
5 */
6
7#pragma once
8
18
19#include <stdint.h>
20#include "macros/units.h"
21
25#define XOSC_CTRL_FREQ_RANGE_VALUE_1_15MHZ 0xaa0u
27#define XOSC_CTRL_FREQ_RANGE_VALUE_10_30MHZ 0xaa1u
29#define XOSC_CTRL_FREQ_RANGE_VALUE_25_60MHZ 0xaa2u
31#define XOSC_CTRL_FREQ_RANGE_VALUE_40_100MHZ 0xaa3u
33#define XOSC_CTRL_ENABLE_VALUE_DISABLE 0xd1eu
35#define XOSC_CTRL_ENABLE_VALUE_ENABLE 0xfabu
37#define XOSC_CTRL_ENABLE_LSB 12u
39#define XOSC_STATUS_STABLE_BITS 0x80000000u
41#define XOSC_HZ MHZ(12u)
43#define PLL_REF_DIV 1u
45#define PLL_VCO_FREQ ((XOSC_HZ / PLL_REF_DIV) * PLL_FEEDBACK_DIVIDER_VALUE)
47#define PLL_PD1 6u
49#define PLL_PD2 2u
51#define PLL_PWR_PD_BITS 0x00000001u
53#define PLL_PWR_VCOPD_BITS 0x00000020u
55#define PLL_CS_LOCK_BITS 0x80000000u
57#define PLL_PRIM_POSTDIV1_LSB 16u
59#define PLL_PRIM_POSTDIV2_LSB 12u
61#define PLL_PWR_POSTDIVPD_BITS 0x00000008u
63#define CLK_PERI_CTRL_ENABLE_BIT (1u << 11u)
65#define CPUFREQ CLOCK_CORECLOCK
67#define CLOCK_XOSC_MAX MHZ(15u)
69#define CLOCK_XOSC_MIN MHZ(5u)
71#define CLOCK_XOSC (XOSC_HZ)
73#define PLL_POSTDIV_MIN 1u
75#define PLL_POSTDIV_MAX 7u
77#define PLL_VCO_FEEDBACK_SCALE_MIN 16u
79#define PLL_VCO_FEEDBACK_SCALE_MAX 320u
82#define PLL_REF_DIV_MIN 1u
85#define PLL_REF_DIV_MAX 63u
87#define PLL_FEEDBACK_DIVIDER_VALUE 125u
90#define CLK_SYS_PERI_CTRL_ENABLE_BIT (1u << 0u)
93#define CLK_SYS_SELECTED_PERI_FIELD_VALUE 2u
95#define PLL_VCO_FREQ_MIN MHZ(750u)
97#define PLL_VCO_FREQ_MAX MHZ(1600u)
99#define CLOCK_CORECLOCK (PLL_VCO_FREQ / (PLL_PD1 * PLL_PD2))
101#define CLK_REF_DIV_VALUE 1u
103#define CLOCK_REF (CLOCK_XOSC / CLK_REF_DIV_VALUE)
105#define TICK_CYCLES (CLOCK_REF / MHZ(1u))
106
107#if (PLL_FEEDBACK_DIVIDER_VALUE < PLL_VCO_FEEDBACK_SCALE_MIN) || \
108 (PLL_FEEDBACK_DIVIDER_VALUE > PLL_VCO_FEEDBACK_SCALE_MAX)
109# error "Value for PLL_FEEDBACK_DIVIDER_VALUE out of range, check config"
110#endif
111#if (PLL_REF_DIV < PLL_REF_DIV_MIN) || (PLL_REF_DIV > PLL_REF_DIV_MAX)
112# error "Value for PLL_REF_DIV out of range, check config"
113#endif
114#if (PLL_PD1 < PLL_POSTDIV_MIN) || (PLL_PD1 > PLL_POSTDIV_MAX)
115# error "Value for PLL_PD1 out of range, check config"
116#endif
117#if (PLL_PD2 < PLL_POSTDIV_MIN) || (PLL_PD2 > PLL_POSTDIV_MAX)
118# error "Value for PLL_PD2 out of range, check config"
119#endif
120#if ((CLOCK_XOSC > CLOCK_XOSC_MAX) || (CLOCK_XOSC < CLOCK_XOSC_MIN))
121# error "Value for CLOCK_XOSC out of range, check config"
122#endif
123#if ((PLL_VCO_FREQ > PLL_VCO_FREQ_MAX) || (PLL_VCO_FREQ < PLL_VCO_FREQ_MIN))
124# error "Value for PLL_VCO_FREQ out of range, check config"
125#endif
126#if (CLOCK_REF % MHZ(1u))
127# error "CLOCK_REF must be a multiple of 1 MHz for 1 µs ticks"
128#endif
129
131#define PDIV ((PLL_PD1 << PLL_PRIM_POSTDIV1_LSB) | (PLL_PD2 << PLL_PRIM_POSTDIV2_LSB))
132
133#ifdef __cplusplus
134extern "C" {
135#endif
136
142void xosc_start(void);
143
147void xosc_stop(void);
148
153void xosc_sleep(uint32_t milliseconds);
154
161void clock_reset(void);
162
169void cpu_clock_init(void);
170
171#ifdef __cplusplus
172}
173#endif
174
void xosc_sleep(uint32_t milliseconds)
Sleep for a given time in milliseconds.
void xosc_start(void)
Configures the Crystal to run.
void cpu_clock_init(void)
Configures the XOSC and then sets CLK_SYS, PLL_SYS and CLK_PERI to it.
void xosc_stop(void)
Stop the crystal.
void clock_reset(void)
Reset the clock system.
Unit helper macros.