mirror of
https://github.com/mytechnotalent/Embedded-Hacking.git
synced 2026-05-22 23:49:41 +02:00
71 lines
2.6 KiB
ArmAsm
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
|