commit da3237e59d6844564cea59e62c633f1b67c69448
parent b531ac7c4ac8d9a9df07600520ef130a3284ace4
Author: Matsuda Kenji <info@mtkn.jp>
Date:   Fri, 29 Aug 2025 20:28:00 +0900
use more c
Diffstat:
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