aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorClyne Sullivan <clyne@bitgloo.com>2024-10-06 11:30:25 -0400
committerClyne Sullivan <clyne@bitgloo.com>2024-10-06 11:30:25 -0400
commit294cf1320986f12efad7885836c31ef6a56f94dc (patch)
treeb1b46602d260e773ee987f1be048e76d423f6983
parent64df2e9f313ca8b22310f839ab50f7ec2628ec25 (diff)
systick driver
-rw-r--r--src/interrupt.zig2
-rw-r--r--src/main.zig9
-rw-r--r--src/timer.zig31
3 files changed, 40 insertions, 2 deletions
diff --git a/src/interrupt.zig b/src/interrupt.zig
index 2fe1671..024efc5 100644
--- a/src/interrupt.zig
+++ b/src/interrupt.zig
@@ -1,5 +1,5 @@
const vector_table_type = [256] *const fn () void;
-var vector_table: vector_table_type = undefined;
+var vector_table: vector_table_type align(256) = undefined;
var vtor: **volatile vector_table_type = @ptrFromInt(0xE000ED08);
pub const vector = enum(u8) {
diff --git a/src/main.zig b/src/main.zig
index 8857583..deac169 100644
--- a/src/main.zig
+++ b/src/main.zig
@@ -1,6 +1,7 @@
const cpu = @import("cpu.zig");
const gpio = @import("gpio.zig");
const interrupt = @import("interrupt.zig");
+const timer = @import("timer.zig");
const rcc: *[39]u32 = @ptrFromInt(0x40021000);
const gpioa = gpio.gpioa;
@@ -10,6 +11,7 @@ export fn _start() callconv(.C) noreturn {
cpu.interrupt_disable();
interrupt.initialize();
interrupt.register(.SVCall, svcall);
+ timer.initialize(1000);
cpu.interrupt_enable();
rcc[19] |= 5; // gpio a and c
@@ -17,7 +19,12 @@ export fn _start() callconv(.C) noreturn {
gpioc.set_mode(13, .input);
while (true) {
- asm volatile("svc 0");
+ //asm volatile("svc 0");
+ gpioa.toggle(5);
+ const next = timer.ticks() + 1000;
+ while (timer.ticks() < next) {
+ asm volatile("nop");
+ }
}
}
diff --git a/src/timer.zig b/src/timer.zig
new file mode 100644
index 0000000..21151c7
--- /dev/null
+++ b/src/timer.zig
@@ -0,0 +1,31 @@
+const interrupt = @import("interrupt.zig");
+
+const sys_tick_type = packed struct {
+ enable: u1,
+ tickint: u1,
+ unused: u30,
+
+ rvr: u32,
+ cvr: u32,
+ calib: u32,
+};
+
+var sys_tick: *volatile sys_tick_type = @ptrFromInt(0xE000E010);
+
+pub var ticks_raw: u32 = 0;
+
+pub fn initialize(freq: u32) void {
+ interrupt.register(.SysTick, tick);
+ sys_tick.rvr = 4000000 / 8 / freq;
+ sys_tick.tickint = 1;
+ sys_tick.enable = 1;
+}
+
+fn tick() void {
+ ticks_raw += 1;
+}
+
+pub fn ticks() u32 {
+ return @atomicLoad(u32, &ticks_raw, .acquire);
+}
+