-
Notifications
You must be signed in to change notification settings - Fork 0
/
A7.c
167 lines (131 loc) · 4.19 KB
/
A7.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
//
//
//#include <mkl25z4.h>
//void init_LED();
//void init_Timer();
//#define RED_LED (18) //B18
//#define MASK(X) (1<<X)
//
//int main(){
// __disable_irq();
// init_LED();
// init_Timer();
// __enable_irq();
// while(1){}
//}
//
//void init_Timer(){
// // timer clk on
// SIM->SCGC6 |=SIM_SCGC6_TPM0_MASK;
//
// //TPMSRC = 0b01 --> select the MCG clock
// //remember: the MCG is set to the FLL which runs at 20.9 MHz
// SIM->SOPT2 |= 1 << 24; //SIM->SOPT2 |= SIM_SOPT2_TPMSRC(1);
//
// //Configure registers in TPM0
//
// //MOD register is the counter-compare value
// TPM0->MOD= 16300;
//
// //The Status&Control(SC) register needs to be configured
// TPM0->SC |= 1 << 7; //Clear TOF before start,
// TPM0->SC |= 0x7; //optional pre-scale by 2^7 =128
// TPM0->SC |= 1 << 6; //Enable TOIE for interrupt
// TPM0->SC |= 1 << 3; //enable internal clock to run
///*
// // Alternatively, can use the MKL25z4.h MACROs for self-documenting code
// TPM0->SC |= TPM_SC_TOF_MASK; //Clear TOF before start,
// TPM0->SC |= TPM_SC_PS(7); //optional pre-scale by 2^7 =128
// TPM0->SC |= TPM_SC_TOIE_MASK; //Enable TOIE for interrupt
// TPM0->SC |= TPM_SC_CMOD(1); //enable internal clock to run
//*/
//
//
// NVIC->ICPR[0] = 1 << 17; // clear pending interrupt 17 for TPM0
// NVIC->IP[4] = 0x3 << 8; // set priority of TPM0 to "3"
// NVIC->ISER[0] = 1 << 17; // enable interrupt 17 for TPM0
///*
// // Alternatively, can use the CMSIS API (pp. 107 of the Dean textbook)
// NVIC_ClearPendingIRQ(TPM0_IRQn);
// NVIC_SetPriority(TPM0_IRQn, 3);
// NVIC_EnableIRQ(TPM0_IRQn);
//*/
//}
//
//void TPM0_IRQHandler(){
// //interrupt frequency should be MCGCLK / TPM0 prescale / TPM0 MOD value
// // 20.9 MHz / 128 / 16300 = 10.0 Hz
// PTB->PTOR |= MASK(RED_LED);
// TPM0->SC |= TPM_SC_TOF_MASK ; //clear the interrupt
//}
//
//
//void init_LED(){
// SIM->SCGC5 |=SIM_SCGC5_PORTB_MASK;
// PORTB->PCR[RED_LED ] &= ~PORT_PCR_MUX_MASK; //Clear mux
// PORTB->PCR[RED_LED ] |= PORT_PCR_MUX(1); //setup to be GPIO
// PTB->PDDR |= MASK(RED_LED ) ;
// PTB->PSOR =MASK(RED_LED); //turn off RED
//}
//__________________________________________________________________________________________________________________________
// part A
//
#include <mkl25z4.h>
void init_LED();
void init_Timer();
//#define RED_LED (18) //B18
#define RED_LED (8) //B18
#define MASK(X) (1<<X)
int main(){
__disable_irq();
init_LED();
init_Timer();
// __enable_irq();
while(1){
}
}
void init_Timer(){
// timer clk on
SIM->SCGC6 |=SIM_SCGC6_TPM0_MASK;
//TPMSRC = 0b01 --> select the MCG clock
//remember: the MCG is set to the FLL which runs at 20.9 MHz
SIM->SOPT2 |= 1 << 24; //SIM->SOPT2 |= SIM_SOPT2_TPMSRC(1);
//Configure registers in TPM0
//MOD register is the counter-compare value
// TPM0->MOD= 16300;
TPM0->MOD= 16;
//The Status&Control(SC) register needs to be configured
TPM0->SC |= 1 << 7; //Clear TOF before start,
TPM0->SC |= 0x7; //optional pre-scale by 2^7 =128
TPM0->SC |= 1 << 6; //Enable TOIE for interrupt
TPM0->SC |= 1 << 3; //enable internal clock to run
/*
// Alternatively, can use the MKL25z4.h MACROs for self-documenting code
TPM0->SC |= TPM_SC_TOF_MASK; //Clear TOF before start,
TPM0->SC |= TPM_SC_PS(7); //optional pre-scale by 2^7 =128
TPM0->SC |= TPM_SC_TOIE_MASK; //Enable TOIE for interrupt
TPM0->SC |= TPM_SC_CMOD(1); //enable internal clock to run
*/
NVIC->ICPR[0] = 1 << 17; // clear pending interrupt 17 for TPM0
NVIC->IP[4] = 0x3 << 8; // set priority of TPM0 to "3"
NVIC->ISER[0] = 1 << 17; // enable interrupt 17 for TPM0
/*
// Alternatively, can use the CMSIS API (pp. 107 of the Dean textbook)
NVIC_ClearPendingIRQ(TPM0_IRQn);
NVIC_SetPriority(TPM0_IRQn, 3);
NVIC_EnableIRQ(TPM0_IRQn);
*/
}
void TPM0_IRQHandler(){
//interrupt frequency should be MCGCLK / TPM0 prescale / TPM0 MOD value
// 20.9 MHz / 128 / 16300 = 10.0 Hz
PTB->PTOR |= MASK(RED_LED);
TPM0->SC |= TPM_SC_TOF_MASK ; //clear the interrupt
}
void init_LED(){
SIM->SCGC5 |=SIM_SCGC5_PORTB_MASK;
PORTB->PCR[RED_LED ] &= ~PORT_PCR_MUX_MASK; //Clear mux
PORTB->PCR[RED_LED ] |= PORT_PCR_MUX(1); //setup to be GPIO
PTB->PDDR |= MASK(RED_LED ) ;
PTB->PSOR =MASK(RED_LED); //turn off RED
}