1 //***************************************************************************** 2 // 3 //! @file am_hal_clkgen.h 4 //! 5 //! @brief Functions for Interfacing with the CLKGEN. 6 //! 7 //! @addtogroup Clkgen3p Clkgen - Clock Generator 8 //! @ingroup apollo3p_hal 9 //! @{ 10 // 11 //***************************************************************************** 12 13 //***************************************************************************** 14 // 15 // Copyright (c) 2024, Ambiq Micro, Inc. 16 // All rights reserved. 17 // 18 // Redistribution and use in source and binary forms, with or without 19 // modification, are permitted provided that the following conditions are met: 20 // 21 // 1. Redistributions of source code must retain the above copyright notice, 22 // this list of conditions and the following disclaimer. 23 // 24 // 2. Redistributions in binary form must reproduce the above copyright 25 // notice, this list of conditions and the following disclaimer in the 26 // documentation and/or other materials provided with the distribution. 27 // 28 // 3. Neither the name of the copyright holder nor the names of its 29 // contributors may be used to endorse or promote products derived from this 30 // software without specific prior written permission. 31 // 32 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 33 // AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 34 // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 35 // ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE 36 // LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 37 // CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 38 // SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 39 // INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 40 // CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 41 // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 42 // POSSIBILITY OF SUCH DAMAGE. 43 // 44 // This is part of revision release_sdk_3_2_0-dd5f40c14b of the AmbiqSuite Development Package. 45 // 46 //***************************************************************************** 47 #ifndef AM_HAL_CLKGEN_H 48 #define AM_HAL_CLKGEN_H 49 50 #ifdef __cplusplus 51 extern "C" 52 { 53 #endif 54 55 56 // 57 //! Designate this peripheral. 58 // 59 #define AM_APOLLO3_CLKGEN 1 60 61 //***************************************************************************** 62 // 63 //! @name System Clock max frequency 64 //! @brief Defines the maximum clock frequency for this device. 65 //! 66 //! These macros provide a definition of the maximum clock frequency. 67 //! 68 //! @{ 69 // 70 //***************************************************************************** 71 #define AM_HAL_CLKGEN_FREQ_MAX_HZ 48000000 72 #define AM_HAL_CLKGEN_FREQ_MAX_KHZ (AM_HAL_CLKGEN_FREQ_MAX_HZ / 1000) 73 #define AM_HAL_CLKGEN_FREQ_MAX_MHZ (AM_HAL_CLKGEN_FREQ_MAX_HZ / 1000000) 74 #define AM_HAL_CLKGEN_CORESEL_MAXDIV 1 75 //! @} 76 77 // 78 //! Control operations. 79 // 80 typedef enum 81 { 82 AM_HAL_CLKGEN_CONTROL_SYSCLK_MAX, 83 AM_HAL_CLKGEN_CONTROL_XTAL_START, 84 AM_HAL_CLKGEN_CONTROL_LFRC_START, 85 AM_HAL_CLKGEN_CONTROL_XTAL_STOP, 86 AM_HAL_CLKGEN_CONTROL_LFRC_STOP, 87 AM_HAL_CLKGEN_CONTROL_SYSCLK_DIV2, 88 AM_HAL_CLKGEN_CONTROL_RTC_SEL_XTAL, 89 AM_HAL_CLKGEN_CONTROL_RTC_SEL_LFRC, 90 AM_HAL_CLKGEN_CONTROL_HFADJ_ENABLE, 91 AM_HAL_CLKGEN_CONTROL_HFADJ_DISABLE, 92 } am_hal_clkgen_control_e; 93 94 // 95 //! Current RTC oscillator. 96 // 97 typedef enum 98 { 99 AM_HAL_CLKGEN_STATUS_RTCOSC_XTAL, 100 AM_HAL_CLKGEN_STATUS_RTCOSC_LFRC, 101 } am_hal_clkgen_status_rtcosc_e; 102 103 // 104 //! CLKOUT 105 // 106 typedef enum 107 { 108 AM_HAL_CLKGEN_CLKOUT_LFRC_1024 = 0x0, // LFRC 109 AM_HAL_CLKGEN_CLKOUT_XTAL_16384, // XTAL / 2 110 AM_HAL_CLKGEN_CLKOUT_XTAL_8192, // XTAL / 4 111 AM_HAL_CLKGEN_CLKOUT_XTAL_4096, // XTAL / 8 112 AM_HAL_CLKGEN_CLKOUT_XTAL_2048, // XTAL / 16 113 AM_HAL_CLKGEN_CLKOUT_XTAL_1024, // XTAL / 32 114 AM_HAL_CLKGEN_CLKOUT_RTC_1HZ = 0x10, // RTC 115 AM_HAL_CLKGEN_CLKOUT_XTAL_0_015 = 0x16, // XTAL / 2097152 = 0.015625 Hz 116 AM_HAL_CLKGEN_CLKOUT_XTAL_32768, // XTAL 117 AM_HAL_CLKGEN_CLKOUT_CG_100, // ClkGen 100Hz 118 AM_HAL_CLKGEN_CLKOUT_LFRC_512 = 0x23, // LFRC / 2 = 512 Hz 119 AM_HAL_CLKGEN_CLKOUT_LFRC_32, // LFRC / 32 = 32 Hz 120 AM_HAL_CLKGEN_CLKOUT_LFRC_2, // LFRC / 512 = 2 Hz 121 AM_HAL_CLKGEN_CLKOUT_LFRC_0_03, // LFRC / 32768 = 0.03125 Hz 122 AM_HAL_CLKGEN_CLKOUT_XTAL_128, // XTAL / 256 = 128 Hz 123 AM_HAL_CLKGEN_CLKOUT_XTAL_4, // XTAL / 8192 = 4 Hz 124 AM_HAL_CLKGEN_CLKOUT_XTAL_0_5, // XTAL / 65536 = 0.5 Hz 125 // The next 5 are Uncalibrated LFRC 126 AM_HAL_CLKGEN_CLKOUT_ULFRC_64, // ULFRC / 16 = 64 Hz (uncal LFRC) 127 AM_HAL_CLKGEN_CLKOUT_ULFRC_8, // ULFRC / 128 = 8 Hz (uncal LFRC) 128 AM_HAL_CLKGEN_CLKOUT_ULFRC_1, // ULFRC / 1024 = 1 Hz (uncal LFRC) 129 AM_HAL_CLKGEN_CLKOUT_ULFRC_0_25, // ULFRC / 4096 = 0.25 Hz (uncal LFRC) 130 AM_HAL_CLKGEN_CLKOUT_ULFRC_0_0009, // ULFRC / 1M = 0.000976 Hz (uncal LFRC) 131 // 132 AM_HAL_CLKGEN_CLKOUT_LFRC_0_0004 = 0x31, // LFRC / 2M = 0.00048828125 Hz 133 // Following are Not Autoenabled ("NE") 134 AM_HAL_CLKGEN_CLKOUT_XTALNE_32768 = 0x35, // XTALNE / 1 = 32768 Hz 135 AM_HAL_CLKGEN_CLKOUT_XTALNE_2048, // XTALNE / 16 = 2048 Hz 136 AM_HAL_CLKGEN_CLKOUT_LFRCNE_32, // LFRCNE / 32 = 32 Hz 137 AM_HAL_CLKGEN_CLKOUT_LFRCNE_1024 = 0x39 // LFRCNE / 1 = 1024 Hz 138 } am_hal_clkgen_clkout_e; 139 140 // 141 //! ClkGen Interrupts 142 // 143 typedef enum 144 { 145 AM_HAL_CLKGEN_INTERRUPT_OF = CLKGEN_INTRPTEN_OF_Msk, 146 AM_HAL_CLKGEN_INTERRUPT_ACC = CLKGEN_INTRPTEN_ACC_Msk, 147 AM_HAL_CLKGEN_INTERRUPT_ACF = CLKGEN_INTRPTEN_ACF_Msk 148 } am_hal_clkgen_interrupt_e; 149 150 // 151 //! Status structure. 152 // 153 typedef struct 154 { 155 // 156 //! Returns the current system clock frequency, in hertz. 157 // 158 uint32_t ui32SysclkFreq; 159 160 // 161 //! Returns the current RTC oscillator as one of: 162 //! - AM_HAL_CLKGEN_STATUS_RTCOSC_LFRC 163 //! - AM_HAL_CLKGEN_STATUS_RTCOSC_XTAL 164 // 165 uint32_t eRTCOSC; 166 167 // 168 //! true = XTAL has failed (is enabled but not oscillating).\n 169 //! Also if the LFRC is selected as the oscillator in OCTRL.OSEL. 170 // 171 bool bXtalFailure; 172 } am_hal_clkgen_status_t; 173 174 175 // **************************************************************************** 176 // 177 //! @brief Apply various specific commands/controls on the CLKGEN module. 178 //! 179 //! This function is used to apply various controls on CLKGEN. 180 //! 181 //! @note IMPORTANT! This function MUST be called very early in execution of 182 //! an application with the parameter AM_HAL_CLKGEN_CONTROL_SYSCLK_MAX 183 //! in order to set Apollo3 to its required operating frequency. 184 //! 185 //! @param eControl - One of the following: 186 //! - AM_HAL_CLKGEN_CONTROL_SYSCLK_MAX 187 //! - AM_HAL_CLKGEN_CONTROL_XTAL_START 188 //! - AM_HAL_CLKGEN_CONTROL_LFRC_START 189 //! - AM_HAL_CLKGEN_CONTROL_XTAL_STOP 190 //! - AM_HAL_CLKGEN_CONTROL_LFRC_STOP 191 //! - AM_HAL_CLKGEN_CONTROL_RTC_SEL_XTAL 192 //! - AM_HAL_CLKGEN_CONTROL_RTC_SEL_LFRC 193 //! - AM_HAL_CLKGEN_CONTROL_HFADJ_ENABLE 194 //! - AM_HAL_CLKGEN_CONTROL_HFADJ_DISABLE 195 //! @param pArgs - pointer to args struct 196 //! 197 //! @return status - generic or interface specific status. 198 //! 199 //! @note After starting the XTAL, a 2 second warm-up delay is required. 200 // 201 // **************************************************************************** 202 extern uint32_t am_hal_clkgen_control(am_hal_clkgen_control_e eControl, 203 void *pArgs); 204 205 // **************************************************************************** 206 // 207 //! @brief Get CLKGEN status. 208 //! 209 //! This function returns the current value of various CLKGEN statuses. 210 //! 211 //! @param psStatus - ptr to a status structure to receive the current statuses. 212 //! 213 //! @return status - generic or interface specific status. 214 //! 215 //! @note After selection of the RTC Oscillator, a 2 second delay is required 216 //! before the new oscillator takes effect. Therefore the CLKGEN.STATUS.OMODE 217 //! bit will not reflect the new status until after the 2s wait period. 218 // 219 // **************************************************************************** 220 extern uint32_t am_hal_clkgen_status_get(am_hal_clkgen_status_t *psStatus); 221 222 // **************************************************************************** 223 // 224 //! @brief Enable CLKOUT. 225 //! 226 //! This function is used to enable and select a CLKOUT frequency. 227 //! 228 //! @param bEnable: true to enable, false to disable. 229 //! @param eClkSelect - One of the following: 230 //! - AM_HAL_CLKGEN_CLKOUT_LFRC_1024 231 //! - AM_HAL_CLKGEN_CLKOUT_XTAL_16384 232 //! - AM_HAL_CLKGEN_CLKOUT_XTAL_8192 233 //! - AM_HAL_CLKGEN_CLKOUT_XTAL_4096 234 //! - AM_HAL_CLKGEN_CLKOUT_XTAL_2048 235 //! - AM_HAL_CLKGEN_CLKOUT_XTAL_1024 236 //! - AM_HAL_CLKGEN_CLKOUT_RTC_1HZ 237 //! - AM_HAL_CLKGEN_CLKOUT_XTAL_0_015 238 //! - AM_HAL_CLKGEN_CLKOUT_XTAL_32768 239 //! - AM_HAL_CLKGEN_CLKOUT_CG_100 240 //! - AM_HAL_CLKGEN_CLKOUT_LFRC_512 241 //! - AM_HAL_CLKGEN_CLKOUT_LFRC_32 242 //! - AM_HAL_CLKGEN_CLKOUT_LFRC_2 243 //! - AM_HAL_CLKGEN_CLKOUT_LFRC_03 244 //! - AM_HAL_CLKGEN_CLKOUT_XTAL_128 245 //! - AM_HAL_CLKGEN_CLKOUT_XTAL_4 246 //! - AM_HAL_CLKGEN_CLKOUT_XTAL_0_5 247 //! - ** The next 5 are Uncalibrated LFRC 248 //! - AM_HAL_CLKGEN_CLKOUT_ULFRC_64 249 //! - AM_HAL_CLKGEN_CLKOUT_ULFRC_8 250 //! - AM_HAL_CLKGEN_CLKOUT_ULFRC_1 251 //! - AM_HAL_CLKGEN_CLKOUT_ULFRC_0_25 252 //! - AM_HAL_CLKGEN_CLKOUT_ULFRC_0_0009 253 //! -AM_HAL_CLKGEN_CLKOUT_LFRC_0_0004 254 //! - ** The Following are Not Autoenabled ("NE") 255 //! - AM_HAL_CLKGEN_CLKOUT_XTALNE_32768 256 //! - AM_HAL_CLKGEN_CLKOUT_XTALNE_2048 257 //! - AM_HAL_CLKGEN_CLKOUT_LFRCNE_32 258 //! - AM_HAL_CLKGEN_CLKOUT_LFRCNE_1024 259 //! 260 //! @return status - generic or interface specific status. 261 // 262 // **************************************************************************** 263 extern uint32_t am_hal_clkgen_clkout_enable(bool bEnable, 264 am_hal_clkgen_clkout_e eClkSelect); 265 266 // **************************************************************************** 267 // 268 //! @brief Enable selected CLKGEN Interrupts. 269 //! 270 //! This function enables the interrupts. 271 //! 272 //! @param ui32IntMask - One or more of the following bitmasks. 273 //! - AM_HAL_CLKGEN_INTERRUPT_OF 274 //! - AM_HAL_CLKGEN_INTERRUPT_ACC 275 //! - AM_HAL_CLKGEN_INTERRUPT_ACF 276 //! 277 //! @return status - generic or interface specific status. 278 // 279 // **************************************************************************** 280 extern uint32_t am_hal_clkgen_interrupt_enable(am_hal_clkgen_interrupt_e ui32IntMask); 281 282 // **************************************************************************** 283 // 284 //! @brief Disable selected CLKGEN Interrupts. 285 //! 286 //! This function disables the CLKGEN interrupts. 287 //! 288 //! @param ui32IntMask - One or more of the following bitmasks. 289 //! - AM_HAL_CLKGEN_INTERRUPT_OF 290 //! - AM_HAL_CLKGEN_INTERRUPT_ACC 291 //! - AM_HAL_CLKGEN_INTERRUPT_ACF 292 //! 293 //! @return status - generic or interface specific status. 294 // 295 // **************************************************************************** 296 extern uint32_t am_hal_clkgen_interrupt_disable(am_hal_clkgen_interrupt_e ui32IntMask); 297 298 //***************************************************************************** 299 // 300 //! @brief IOM interrupt clear 301 //! 302 //! This function clears the interrupts for the given peripheral. 303 //! 304 //! @param ui32IntMask - Interface specific interrupt mask. 305 //! The following are valid clear bits, any of which can be ORed together. 306 //! - AM_HAL_CLKGEN_INTERRUPT_OF 307 //! - AM_HAL_CLKGEN_INTERRUPT_ACC 308 //! - AM_HAL_CLKGEN_INTERRUPT_ACF 309 //! 310 //! @return status - generic or interface specific status. 311 // 312 //***************************************************************************** 313 extern uint32_t am_hal_clkgen_interrupt_clear(am_hal_clkgen_interrupt_e ui32IntMask); 314 315 // **************************************************************************** 316 // 317 //! @brief Return CLKGEN interrupts. 318 //! 319 //! @note Use this function to get all CLKGEN interrupts, or only the interrupts 320 //! that are enabled. 321 //! 322 //! @param bEnabledOnly - return only interrupts that are enabled 323 //! @param pui32IntStatus - returns interrupt status here 324 //! 325 //! @return status - generic or interface specific status. 326 // 327 // **************************************************************************** 328 extern uint32_t am_hal_clkgen_interrupt_status_get(bool bEnabledOnly, 329 uint32_t *pui32IntStatus); 330 331 // **************************************************************************** 332 // 333 //! @brief Sets the interrupt status. 334 //! 335 //! This function sets the CLKGEN interrupts. 336 //! 337 //! @param ui32IntMask - One or more of the following bitmasks. 338 //! - AM_HAL_CLKGEN_INTERRUPT_OF 339 //! - AM_HAL_CLKGEN_INTERRUPT_ACC 340 //! - AM_HAL_CLKGEN_INTERRUPT_ACF 341 //! 342 //! @return None. 343 // 344 // **************************************************************************** 345 extern uint32_t am_hal_clkgen_interrupt_set(am_hal_clkgen_interrupt_e ui32IntMask); 346 347 #ifdef __cplusplus 348 } 349 #endif 350 351 #endif // AM_HAL_CLKGEN_H 352 353 //***************************************************************************** 354 // 355 // End Doxygen group. 356 //! @} 357 // 358 //***************************************************************************** 359 360