/
ex2.c
222 lines (101 loc) · 2.62 KB
/
ex2.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
#include <stdint.h>
#include <stdbool.h>
#include "efm32gg.h"
/*
TODO calculate the appropriate sample period for the sound wave(s)
you want to generate. The core clock (which the timer clock is derived
from) runs at 14 MHz by default. Also remember that the timer counter
registers are 16 bits.
*/
/* The period between sound samples, in clock cycles */
#define SAMPLE_PERIOD 317
/* Declaration of peripheral setup functions */
void setupTimer(uint32_t period);
void setupDAC();
void setupNVIC();
/* Your code will start executing here */
int main(void)
{
/* Call the peripheral setup functions */
setupGPIO();
setupDAC();
setupTimer(SAMPLE_PERIOD);
/* Enable interrupt handling */
*SCR = 2;
setupNVIC();
__asm volatile("wfi");
/* TODO for higher energy efficiency, sleep while waiting for interrupts
instead of infinite loop for busy-waiting
*/
while(1);
return 0;
}
void setupNVIC()
{
*ISER0 |= (1 << 12);
*ISER0 = 0x802;
// *ISER0 |= (1 << 11);
// *ISER0 |= (1 << 1);
/* TODO use the NVIC ISERx registers to enable handling of interrupt(s)
remember two things are necessary for interrupt handling:
- the peripheral must generate an interrupt signal
- the NVIC must be configured to make the CPU handle the signal
You will need TIMER1, GPIO odd and GPIO even interrupt handling for this
assignment.
*/
}
/* if other interrupt handlers are needed, use the following names:
NMI_Handler
HardFault_Handler
MemManage_Handler
BusFault_Handler
UsageFault_Handler
Reserved7_Handler
Reserved8_Handler
Reserved9_Handler
Reserved10_Handler
SVC_Handler
DebugMon_Handler
Reserved13_Handler
PendSV_Handler
SysTick_Handler
DMA_IRQHandler
GPIO_EVEN_IRQHandler
TIMER0_IRQHandler
USART0_RX_IRQHandler
USART0_TX_IRQHandler
USB_IRQHandler
ACMP0_IRQHandler
ADC0_IRQHandler
DAC0_IRQHandler
I2C0_IRQHandler
I2C1_IRQHandler
GPIO_ODD_IRQHandler
TIMER1_IRQHandler
TIMER2_IRQHandler
TIMER3_IRQHandler
USART1_RX_IRQHandler
USART1_TX_IRQHandler
LESENSE_IRQHandler
USART2_RX_IRQHandler
USART2_TX_IRQHandler
UART0_RX_IRQHandler
UART0_TX_IRQHandler
UART1_RX_IRQHandler
UART1_TX_IRQHandler
LEUART0_IRQHandler
LEUART1_IRQHandler
LETIMER0_IRQHandler
PCNT0_IRQHandler
PCNT1_IRQHandler
PCNT2_IRQHandler
RTC_IRQHandler
BURTC_IRQHandler
CMU_IRQHandler
VCMP_IRQHandler
LCD_IRQHandler
MSC_IRQHandler
AES_IRQHandler
EBI_IRQHandler
EMU_IRQHandler
*/