Files
Embedded-Hacking/drivers/0x01_uart_asm_arm/xosc.s
T
2026-03-27 11:19:24 -04:00

71 lines
2.6 KiB
ArmAsm

/**
* FILE: xosc.s
*
* DESCRIPTION:
* RP2350 External Crystal Oscillator (XOSC) Functions.
*
* BRIEF:
* Provides functions to initialize the external crystal oscillator
* and enable the XOSC peripheral clock.
*
* AUTHOR: Kevin Thomas
* CREATION DATE: November 27, 2025
* UPDATE DATE: November 27, 2025
*/
.syntax unified // use unified assembly syntax
.cpu cortex-m33 // target Cortex-M33 core
.thumb // use Thumb instruction set
.include "constants.s"
/**
* Initialize the .text section.
* The .text section contains executable code.
*/
.section .text // code section
.align 2 // align to 4-byte boundary
/**
* @brief Init XOSC and wait until it is ready.
*
* @details Configures and initializes the external crystal oscillator (XOSC).
* Waits for the XOSC to become stable before returning.
*
* @param None
* @retval None
*/
.global Init_XOSC
.type Init_XOSC, %function
Init_XOSC:
ldr r0, =XOSC_STARTUP // load XOSC_STARTUP address
ldr r1, =0x00c4 // set delay 50,000 cycles
str r1, [r0] // store value into XOSC_STARTUP
ldr r0, =XOSC_CTRL // load XOSC_CTRL address
ldr r1, =0x00FABAA0 // set 1_15MHz, freq range, actual 14.5MHz
str r1, [r0] // store value into XOSC_CTRL
.Init_XOSC_Wait:
ldr r0, =XOSC_STATUS // load XOSC_STATUS address
ldr r1, [r0] // read XOSC_STATUS value
tst r1, #(1<<31) // test STABLE bit
beq .Init_XOSC_Wait // wait until stable bit is set
bx lr // return
/**
* @brief Enable XOSC peripheral clock.
*
* @details Sets the peripheral clock to use XOSC as its AUXSRC.
*
* @param None
* @retval None
*/
.global Enable_XOSC_Peri_Clock
.type Enable_XOSC_Peri_Clock, %function
Enable_XOSC_Peri_Clock:
ldr r0, =CLK_PERI_CTRL // load CLK_PERI_CTRL address
ldr r1, [r0] // read CLK_PERI_CTRL value
orr r1, r1, #(1<<11) // set ENABLE bit
orr r1, r1, #(4<<5) // set AUXSRC: XOSC_CLKSRC bit
str r1, [r0] // store value into CLK_PERI_CTRL
bx lr // return