Skip to content

Commit 1a80301

Browse files
zelenskiCS107E BOT
authored andcommitted
release lecture
commit afb268179f033ae340befde64412a49b4289b347 Author: Julie Zelenski <[email protected]> Date: Mon Nov 11 09:37:06 2024 -0800 release lecture
1 parent 6c99069 commit 1a80301

File tree

5 files changed

+126
-1
lines changed

5 files changed

+126
-1
lines changed

_data/unreleased.csv

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@ permalink,title,released
66
"/lectures/FloatingPoint_Sound/","Floating Point and Sound",false
77
"/lectures/Guest/","Guest",false
88
"/lectures/InfoSession/","Course Info Session",false
9-
"/lectures/Interrupts2/","Interrupts, cont'd",false
109
"/lectures/OOP/","Object-oriented programming",false
1110
"/lectures/Project/","Project",false
1211
"/lectures/Sensors/","Sensors",false

lectures/Interrupts2/README.md

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
---
2+
released: true
3+
permalink: /lectures/Interrupts2/
4+
title: Interrupts, cont'd
5+
readings: |
6+
Now we move up to the higher-level abstractions for interrupts, including library support for managing interrupt handlers and best practices for interrupt-safe code.
7+
+ From D-1H User Manual: [hstimer](/readings/d1-h_user_manual_v1.0.pdf#page=205), [gpio interrupts](/readings/d1-h_user_manual_v1.0.pdf#page=1092)
8+
+ Source for library reference modules: [interrupts.c](/src#interrupts), [gpio_interrupt.c](/src#gpio_interrupt), [ringbuffer.c](/src#ringbuffer), [hstimer.c](/src#hstimer)
9+
10+
---
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
NAME = main
2+
3+
ARCH = -march=rv64im -mabi=lp64
4+
ASFLAGS = $(ARCH)
5+
CFLAGS = $(ARCH) -g -Og -I$$CS107E/include -Wall -ffreestanding -fno-omit-frame-pointer
6+
LDFLAGS = -nostdlib -L$$CS107E/lib -T memmap.ld
7+
LDLIBS = -lmango -lmango_gcc
8+
9+
all : $(NAME).bin
10+
11+
%.bin: %.elf
12+
riscv64-unknown-elf-objcopy $< -O binary $@
13+
14+
%.elf: %.o
15+
riscv64-unknown-elf-gcc $(LDFLAGS) $^ $(LDLIBS) -o $@
16+
17+
%.o: %.c
18+
riscv64-unknown-elf-gcc $(CFLAGS) -c $< -o $@
19+
20+
%.o: %.s
21+
riscv64-unknown-elf-as $(ASFLAGS) $< -o $@
22+
23+
run: $(NAME).bin
24+
mango-run $<
25+
26+
clean:
27+
rm -f *.o *.bin *.elf *.list *~
28+
29+
.PHONY: all clean run
30+
.PRECIOUS: %.elf %.o
Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
1+
#include "console.h"
2+
#include "gpio.h"
3+
#include "gpio_extra.h"
4+
#include "gpio_interrupt.h"
5+
#include "hstimer.h"
6+
#include "interrupts.h"
7+
#include "keyboard.h"
8+
#include "printf.h"
9+
#include "uart.h"
10+
#include "timer.h"
11+
12+
#define BUTTON GPIO_PB4
13+
14+
static volatile int elapsed, last_button, last_scan, nbutton, nscan;
15+
16+
static void button_click(void *aux_data) {
17+
gpio_interrupt_clear(BUTTON);
18+
last_button = elapsed;
19+
nbutton++;
20+
}
21+
22+
static void second_elapsed(void *aux_data) {
23+
hstimer_interrupt_clear(HSTIMER0);
24+
elapsed++;
25+
}
26+
27+
static void clock_edge(void *aux_data) {
28+
static int nClock; // count clock edges, 11 edges = one scancode
29+
30+
gpio_interrupt_clear(KEYBOARD_CLOCK);
31+
nClock++;
32+
if (nClock % 11 == 0) {
33+
last_scan = elapsed;
34+
nscan++;
35+
}
36+
}
37+
38+
void configure_button(void) {
39+
gpio_interrupt_init();
40+
gpio_set_input(BUTTON);
41+
gpio_set_pullup(BUTTON);
42+
gpio_interrupt_config(BUTTON, GPIO_INTERRUPT_NEGATIVE_EDGE, true); // debounce = true
43+
gpio_interrupt_register_handler(BUTTON, button_click, NULL);
44+
gpio_interrupt_enable(BUTTON);
45+
}
46+
47+
void configure_alarm(void) {
48+
// countdown expressed in number of usecs
49+
hstimer_init(HSTIMER0, 1000000);
50+
hstimer_enable(HSTIMER0); // start timer
51+
interrupts_register_handler(INTERRUPT_SOURCE_HSTIMER0, second_elapsed, NULL);
52+
interrupts_enable_source(INTERRUPT_SOURCE_HSTIMER0);
53+
}
54+
55+
void configure_keyboard(void) {
56+
gpio_interrupt_init();
57+
keyboard_init(KEYBOARD_CLOCK, KEYBOARD_DATA);
58+
gpio_interrupt_config(KEYBOARD_CLOCK, GPIO_INTERRUPT_NEGATIVE_EDGE, false); // no debounce!
59+
gpio_interrupt_register_handler(KEYBOARD_CLOCK, clock_edge, NULL);
60+
gpio_interrupt_enable(KEYBOARD_CLOCK);
61+
}
62+
63+
void main(void) {
64+
uart_init();
65+
interrupts_init();
66+
67+
configure_button();
68+
configure_alarm();
69+
configure_keyboard();
70+
71+
interrupts_global_enable();
72+
73+
console_init(12, 20, GL_INDIGO, GL_WHITE);
74+
75+
while (1) {
76+
console_printf("\f\n Time now %02d:%02d\n\n"
77+
"\n scancode count %d"
78+
"\n last @t %02d:%02d\n"
79+
"\n button count %d"
80+
"\n last @t %02d:%02d",
81+
elapsed/60, elapsed % 60,
82+
nscan, last_scan/60, last_scan % 60,
83+
nbutton, last_button/60, last_button % 60);
84+
timer_delay(1);
85+
}
86+
}

lectures/Interrupts2/slides.pdf

1.38 MB
Binary file not shown.

0 commit comments

Comments
 (0)