rp2040

RP2040 Programming without SDK
Log | Files | Refs

commit da3237e59d6844564cea59e62c633f1b67c69448
parent b531ac7c4ac8d9a9df07600520ef130a3284ace4
Author: Matsuda Kenji <info@mtkn.jp>
Date:   Fri, 29 Aug 2025 20:28:00 +0900

use more c

Diffstat:
Mex4_shell/main.c | 8++++++++
Mex4_shell/start.s | 109++++++++++++++++++++++++++++++++++++++++++++++---------------------------------
2 files changed, 72 insertions(+), 45 deletions(-)

diff --git a/ex4_shell/main.c b/ex4_shell/main.c @@ -5,11 +5,19 @@ typedef enum reset_bit { } reset_bit; void unreset(reset_bit); +void init_xosc(void); +void init_pll(void); +void enable_clock_peri(void); +void set_system_clock_to_pll_sys(void); void mains(void); void main(void) { + enable_clock_peri(); unreset(RESET_IOBANK0|RESET_PLL_SYS|RESET_UART0); + init_xosc(); + init_pll(); + set_system_clock_to_pll_sys(); mains(); } diff --git a/ex4_shell/start.s b/ex4_shell/start.s @@ -58,49 +58,11 @@ loop: wfe b loop - // void unreset(reset_bit subsystems); - // unreset unresets subsystems. - // subsystems is bitwise or. - .global unreset -unreset: - // unreset gpio, pll_sys, uart0 - ldr r3, resets_base - ldr r1, atomic_clr - str r0, [r3, r1] // RESETS: RESET - mov r1, #1 - lsl r1, #22 - bic r0, r1 // uart stays in reset state until clock_peri is enabled -unreset_chk: - ldr r1, [r3, #0x8] // RESETS: RESET_DONE - bic r0, r1 - bne unreset_chk - bx lr - - .global mains -mains: - push {lr} - - // set gpio functions - ldr r3, io_bank0_base - // set pins 0 and 1 for uart - mov r0, #2 // uart0 - mov r1, #0x4 - str r0, [r3, r1] // IO_BANK0: GPIO0_CTRL - mov r1, #0xc - str r0, [r3, r1] // IO_BANK0: GPIO1_CTRL - // set pins 24 and 25 to SIO for led blink. - mov r0, #5 // sio - mov r1, #0xc4 - str r0, [r3, r1] // IO_BANK0: GPIO24_CTRL - mov r1, #0xcc - str r0, [r3, r1] // IO_BANK0: GPIO24_CTRL - - // enable sio output - ldr r3, sio_base - mov r0, #0b11 - lsl r0, r0, #24 - str r0, [r3, #0x24] // SIO: GPIO_OE - + // void init_clock(void); + // init_clock initialize xosc and set it as the system clock + // clock freq is 133MHz. + .global init_xosc +init_xosc: // setup xosc ldr r3, xosc_base mov r0, #47 // start up delay for 12MHz rosc (xosc?) @@ -111,8 +73,12 @@ wait_xosc: ldr r0, [r3, #0x4] // XOSC: STATUS lsr r0, r0, #31 // STABLE bit beq wait_xosc + bx lr - // setup pll_sys 133MHz + // void init_pll(void); + // init_pll setups pll_sys in 133MHz. + .global init_pll +init_pll: ldr r3, pll_sys_base // set feedback divider mov r0, #133 @@ -133,15 +99,67 @@ wait_vco: // power on post divider mov r0, #8 // POSTDIVPD str r0, [r3, r1] // PLL: PWR + bx lr + // void set_system_clock_to_pll_sys(void); + // set_system_clock_to_pll_sys sets system clock to pll_sys + .global set_system_clock_to_pll_sys +set_system_clock_to_pll_sys: // set system clock clksrc_pll_sys ldr r3, clocks_base ldr r0, =(0x0 << 5 | 0x1) str r0, [r3, #0x3c] // CLOCKS: CLK_SYS_CTRL - // enable clk_peri + bx lr + + // void enable_clock_peri(void); + // enable_clock_peri enables clk_peri and set it to clk_sys + .global enable_clock_peri +enable_clock_peri: mov r0, #1 lsl r0, r0, #11 + ldr r3, clocks_base str r0, [r3, #0x48] // CLOCKS: CLK_PERI_CTRL + bx lr + + // void unreset(reset_bit subsystems); + // unreset unresets subsystems. + // subsystems is bitwise or. + // To unreset uart, clk_peri must be enabled beforehand. + .global unreset +unreset: + ldr r3, resets_base + ldr r1, atomic_clr + str r0, [r3, r1] // RESETS: RESET +unreset_chk: + ldr r1, [r3, #0x8] // RESETS: RESET_DONE + bic r0, r1 + bne unreset_chk + bx lr + + .global mains +mains: + push {lr} + + // set gpio functions + ldr r3, io_bank0_base + // set pins 0 and 1 for uart + mov r0, #2 // uart0 + mov r1, #0x4 + str r0, [r3, r1] // IO_BANK0: GPIO0_CTRL + mov r1, #0xc + str r0, [r3, r1] // IO_BANK0: GPIO1_CTRL + // set pins 24 and 25 to SIO for led blink. + mov r0, #5 // sio + mov r1, #0xc4 + str r0, [r3, r1] // IO_BANK0: GPIO24_CTRL + mov r1, #0xcc + str r0, [r3, r1] // IO_BANK0: GPIO24_CTRL + + // enable sio output + ldr r3, sio_base + mov r0, #0b11 + lsl r0, r0, #24 + str r0, [r3, #0x24] // SIO: GPIO_OE // setup uart0 ldr r3, uart0_base @@ -257,6 +275,7 @@ pled1: pop {r0, r1, r2, r3, r4, r5, r6, pc} // bled0 blinks the led on the pin 24 once. + .global bled0 bled0: push {r0, r1, r2, r3, lr} mov r0, #1