]> code.bitgloo.com Git - clyne/zig-stm32l476.git/commitdiff
systick driver
authorClyne Sullivan <clyne@bitgloo.com>
Sun, 6 Oct 2024 15:30:25 +0000 (11:30 -0400)
committerClyne Sullivan <clyne@bitgloo.com>
Sun, 6 Oct 2024 15:30:25 +0000 (11:30 -0400)
src/interrupt.zig
src/main.zig
src/timer.zig [new file with mode: 0644]

index 2fe16714179f4e96fe1a3d44102313d64b5cda3f..024efc599fdd449596fe5dec2f86c4afb8a7339c 100644 (file)
@@ -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) {
index 8857583df42234ff50b704aa4622f7305a1412ee..deac1690d57367c61d55c26a42b38261c79e804d 100644 (file)
@@ -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 (file)
index 0000000..21151c7
--- /dev/null
@@ -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);
+}
+