-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathpps.h
345 lines (255 loc) · 12.8 KB
/
pps.h
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
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
#ifndef _PPS_H_
#define _PPS_H_
/* ************************************************************************** */
/* Notes on using the PPS (Peripheral Pin Select)
The PIC18 K42 family microcontrollers has a Peripheral Pin Select module
that allows the remapping of digital I/O pins.
*/
/* ************************************************************************** */
/* Notes on managing the PPS Lock
These macros are designed to help each software module manage its own PPS
settings. Writes to PPS registers while the system is locked are ignored.
Each software module is responsible for putting its required PPS setup code
in it's module_init(). If all the various module_init() calls are collected
into one place, like startup(), then the block of _init() calls can be
wrapped with these two macros, and the entire system's PPS requirements can
be satisfied in one shot.
*/
extern void pps_unlock(void);
extern void pps_lock(void);
/* ************************************************************************** */
/* PPS Input Registers
Example PPS Input assignments:
Connecting the Timer 3 Clock input to pin RB0:
pps_in_TIMER3_CLOCK(PPS_IN(B, 0));
Connecting the UART 1 Recieve input to pin RC7:
pps_in_UART1_RX(PPS_IN(C, 7));
Connecting the ADC Trigger input to RA4, through a function call:
void some_init(pps_input_t pin){
pps_in_ADC_TRIGGER(pin);
}
void some_other_function(void) {
some_init(PPS_IN(A, 4));
}
*/
// Can be used to pass PPS pins into a function
typedef unsigned char pps_input_t;
// macro to help abbreviate
#define PPS_INPUT(port, pin) (PPS_PORT_##port & PPS_PIN_##pin)
/* -------------------------------------------------------------------------- */
// Input pin assignment macros
#define PPS_PORT_A 0b11000111
#define PPS_PORT_B 0b11001111
#define PPS_PORT_C 0b11010111
#define PPS_PORT_D 0b11011111
#define PPS_PORT_E 0b11100111
#define PPS_PORT_F 0b11101111
#define PPS_PIN_0 0b11111000
#define PPS_PIN_1 0b11111001
#define PPS_PIN_2 0b11111010
#define PPS_PIN_3 0b11111011
#define PPS_PIN_4 0b11111100
#define PPS_PIN_5 0b11111101
#define PPS_PIN_6 0b11111110
#define PPS_PIN_7 0b11111111
/* -------------------------------------------------------------------------- */
extern void pps_in_INTERRUPT0(pps_input_t pin);
extern void pps_in_INTERRUPT1(pps_input_t pin);
extern void pps_in_INTERRUPT2(pps_input_t pin);
/* -------------------------------------------------------------------------- */
extern void pps_in_TIMER0_CLOCK(pps_input_t pin);
extern void pps_in_TIMER1_CLOCK(pps_input_t pin);
extern void pps_in_TIMER1_GATE(pps_input_t pin);
extern void pps_in_TIMER3_CLOCK(pps_input_t pin);
extern void pps_in_TIMER3_GATE(pps_input_t pin);
extern void pps_in_TIMER5_CLOCK(pps_input_t pin);
extern void pps_in_TIMER5_GATE(pps_input_t pin);
extern void pps_in_TIMER2_CLOCK(pps_input_t pin);
extern void pps_in_TIMER4_CLOCK(pps_input_t pin);
extern void pps_in_TIMER6_CLOCK(pps_input_t pin);
/* -------------------------------------------------------------------------- */
extern void pps_in_CCP1(pps_input_t pin);
extern void pps_in_CCP2(pps_input_t pin);
extern void pps_in_CCP3(pps_input_t pin);
extern void pps_in_CCP4(pps_input_t pin); //* K42 only
/* -------------------------------------------------------------------------- */
extern void pps_in_PWM_Input_0(pps_input_t pin); //* Q43 only
extern void pps_in_PWM_Input_1(pps_input_t pin); //* Q43 only
extern void pps_in_PWM1_External_Reset(pps_input_t pin); //* Q43 only
extern void pps_in_PWM2_External_Reset(pps_input_t pin); //* Q43 only
extern void pps_in_PWM3_External_Reset(pps_input_t pin); //* Q43 only
/* -------------------------------------------------------------------------- */
extern void pps_in_SMT1_WINDOW(pps_input_t pin);
extern void pps_in_SMT1_SIGNAL(pps_input_t pin);
/* -------------------------------------------------------------------------- */
extern void pps_in_CWG1(pps_input_t pin); //* Q43 only (by mistake)
extern void pps_in_CWG2(pps_input_t pin); //* Q43 only (by mistake)
extern void pps_in_CWG3(pps_input_t pin); //* Q43 only (by mistake)
/* -------------------------------------------------------------------------- */
extern void pps_in_DSM_CARRIER_LOW(pps_input_t pin);
extern void pps_in_DSM_CARRIER_HIGH(pps_input_t pin);
extern void pps_in_DSM_SOURCE(pps_input_t pin);
/* -------------------------------------------------------------------------- */
extern void pps_in_CLC1_INPUT(pps_input_t pin);
extern void pps_in_CLC2_INPUT(pps_input_t pin);
extern void pps_in_CLC3_INPUT(pps_input_t pin);
extern void pps_in_CLC4_INPUT(pps_input_t pin);
extern void pps_in_CLC5_INPUT(pps_input_t pin); //* Q43 only
extern void pps_in_CLC6_INPUT(pps_input_t pin); //* Q43 only
extern void pps_in_CLC7_INPUT(pps_input_t pin); //* Q43 only
extern void pps_in_CLC8_INPUT(pps_input_t pin); //* Q43 only
/* -------------------------------------------------------------------------- */
extern void pps_in_ADC_TRIGGER(pps_input_t pin);
/* -------------------------------------------------------------------------- */
extern void pps_in_SPI1_CLOCK(pps_input_t pin);
extern void pps_in_SPI1_DATA_IN(pps_input_t pin);
extern void pps_in_SPI1_SS(pps_input_t pin);
extern void pps_in_SPI2_CLOCK(pps_input_t pin); //* Q43 only
extern void pps_in_SPI2_DATA_IN(pps_input_t pin); //* Q43 only
extern void pps_in_SPI2_SS(pps_input_t pin); //* Q43 only
/* -------------------------------------------------------------------------- */
extern void pps_in_I2C1_CLOCK(pps_input_t pin);
extern void pps_in_I2C1_DATA(pps_input_t pin);
extern void pps_in_I2C2_CLOCK(pps_input_t pin); //* K42 only
extern void pps_in_I2C2_DATA(pps_input_t pin); //* K42 only
/* -------------------------------------------------------------------------- */
extern void pps_in_UART1_RX(pps_input_t pin);
extern void pps_in_UART1_CTS(pps_input_t pin);
extern void pps_in_UART2_RX(pps_input_t pin);
extern void pps_in_UART2_CTS(pps_input_t pin);
extern void pps_in_UART3_RX(pps_input_t pin); //* Q43 only
extern void pps_in_UART3_CTS(pps_input_t pin); //* Q43 only
extern void pps_in_UART4_RX(pps_input_t pin); //* Q43 only
extern void pps_in_UART4_CTS(pps_input_t pin); //* Q43 only
extern void pps_in_UART5_RX(pps_input_t pin); //* Q43 only
extern void pps_in_UART5_CTS(pps_input_t pin); //* Q43 only
/* ************************************************************************** */
/* PPS Output Registers
Example PPS Output assignments:
Assigning UART1 TX to pin RC6:
pps_out_UART1_TX(RC6PPS)
Assigning the output of PWM5 to RB2, through a function call:
void some_init(pps_output_t* outputPin){
pps_out_PWM5(outputPin);
}
void some_other_function(void) {
some_init(PPS_OUT(B, 2));
}
*/
// Can be used to pass PPS pins into a function
typedef volatile unsigned char pps_output_t;
//
#define PPS_OUTPUT(port, pin) (&R##port##pin##PPS)
/* -------------------------------------------------------------------------- */
// ADC Guard Ring Outputs
extern void pps_out_ADC_GUARD_RING_B(pps_output_t *pin);
extern void pps_out_ADC_GUARD_RING_A(pps_output_t *pin);
/* -------------------------------------------------------------------------- */
// Complementary Waveform Generator 3
extern void pps_out_CWG3D(pps_output_t *pin);
extern void pps_out_CWG3C(pps_output_t *pin);
extern void pps_out_CWG3B(pps_output_t *pin);
extern void pps_out_CWG3A(pps_output_t *pin);
/* -------------------------------------------------------------------------- */
// Complementary Waveform Generator 3
extern void pps_out_CWG2D(pps_output_t *pin);
extern void pps_out_CWG2C(pps_output_t *pin);
extern void pps_out_CWG2B(pps_output_t *pin);
extern void pps_out_CWG2A(pps_output_t *pin);
/* -------------------------------------------------------------------------- */
// Complementary Waveform Generator 3
extern void pps_out_CWG1D(pps_output_t *pin);
extern void pps_out_CWG1C(pps_output_t *pin);
extern void pps_out_CWG1B(pps_output_t *pin);
extern void pps_out_CWG1A(pps_output_t *pin);
/* -------------------------------------------------------------------------- */
// Digital Signal Modulater
extern void pps_out_DSM1(pps_output_t *pin);
/* -------------------------------------------------------------------------- */
// Reference Clock Output
extern void pps_out_CLKR(pps_output_t *pin);
/* -------------------------------------------------------------------------- */
// Numerically Controller Oscillator
extern void pps_out_NCO3(pps_output_t *pin); //* Q43 only
extern void pps_out_NCO2(pps_output_t *pin); //* Q43 only
extern void pps_out_NCO1(pps_output_t *pin);
/* -------------------------------------------------------------------------- */
// Timer 0 Output
extern void pps_out_TIMER0(pps_output_t *pin);
/* -------------------------------------------------------------------------- */
// I2C
extern void pps_out_I2C1_DATA(pps_output_t *pin);
extern void pps_out_I2C1_CLOCK(pps_output_t *pin);
extern void pps_out_I2C2_DATA(pps_output_t *pin); //* K42 only
extern void pps_out_I2C2_CLOCK(pps_output_t *pin); //* K42 only
/* -------------------------------------------------------------------------- */
// SPI
extern void pps_out_SPI1_SS(pps_output_t *pin);
extern void pps_out_SPI1_DATA_OUT(pps_output_t *pin);
extern void pps_out_SPI1_CLOCK(pps_output_t *pin);
extern void pps_out_SPI2_SS(pps_output_t *pin); //* Q43 only
extern void pps_out_SPI2_DATA_OUT(pps_output_t *pin); //* Q43 only
extern void pps_out_SPI2_CLOCK(pps_output_t *pin); //* Q43 only
/* -------------------------------------------------------------------------- */
// Comparator
extern void pps_out_COMPARATOR_2(pps_output_t *pin);
extern void pps_out_COMPARATOR_1(pps_output_t *pin);
/* -------------------------------------------------------------------------- */
// UART 5
extern void pps_out_UART5_RTS(pps_output_t *pin); //* Q43 only
extern void pps_out_UART5_TXDE(pps_output_t *pin); //* Q43 only
extern void pps_out_UART5_TX(pps_output_t *pin); //* Q43 only
/* -------------------------------------------------------------------------- */
// UART 4
extern void pps_out_UART4_RTS(pps_output_t *pin); //* Q43 only
extern void pps_out_UART4_TXDE(pps_output_t *pin); //* Q43 only
extern void pps_out_UART4_TX(pps_output_t *pin); //* Q43 only
/* -------------------------------------------------------------------------- */
// UART 3
extern void pps_out_UART3_RTS(pps_output_t *pin); //* Q43 only
extern void pps_out_UART3_TXDE(pps_output_t *pin); //* Q43 only
extern void pps_out_UART3_TX(pps_output_t *pin); //* Q43 only
/* -------------------------------------------------------------------------- */
// UART 2
extern void pps_out_UART2_RTS(pps_output_t *pin);
extern void pps_out_UART2_TXDE(pps_output_t *pin);
extern void pps_out_UART2_TX(pps_output_t *pin);
/* -------------------------------------------------------------------------- */
// UART 1
extern void pps_out_UART1_RTS(pps_output_t *pin);
extern void pps_out_UART1_TXDE(pps_output_t *pin);
extern void pps_out_UART1_TX(pps_output_t *pin);
/* -------------------------------------------------------------------------- */
// PWM
extern void pps_out_PWM8(pps_output_t *pin); //* K42 only
extern void pps_out_PWM7(pps_output_t *pin); //* K42 only
extern void pps_out_PWM6(pps_output_t *pin); //* K42 only
extern void pps_out_PWM5(pps_output_t *pin); //* K42 only
extern void pps_out_PWM3S1P2(pps_output_t *pin); //* Q43 only
extern void pps_out_PWM3S1P1(pps_output_t *pin); //* Q43 only
extern void pps_out_PWM2S1P2(pps_output_t *pin); //* Q43 only
extern void pps_out_PWM2S1P1(pps_output_t *pin); //* Q43 only
extern void pps_out_PWM1S1P2(pps_output_t *pin); //* Q43 only
extern void pps_out_PWM1S1P1(pps_output_t *pin); //* Q43 only
/* -------------------------------------------------------------------------- */
// Capture/Compare
extern void pps_out_CCP4(pps_output_t *pin); //* K42 only
extern void pps_out_CCP3(pps_output_t *pin);
extern void pps_out_CCP2(pps_output_t *pin);
extern void pps_out_CCP1(pps_output_t *pin);
/* -------------------------------------------------------------------------- */
// Configurable Logic Cell
extern void pps_out_CLC8_OUTPUT(pps_output_t *pin); //* Q43 only
extern void pps_out_CLC7_OUTPUT(pps_output_t *pin); //* Q43 only
extern void pps_out_CLC6_OUTPUT(pps_output_t *pin); //* Q43 only
extern void pps_out_CLC5_OUTPUT(pps_output_t *pin); //* Q43 only
extern void pps_out_CLC4_OUTPUT(pps_output_t *pin);
extern void pps_out_CLC3_OUTPUT(pps_output_t *pin);
extern void pps_out_CLC2_OUTPUT(pps_output_t *pin);
extern void pps_out_CLC1_OUTPUT(pps_output_t *pin);
/* -------------------------------------------------------------------------- */
// Default value of all RXYPPS registers at RESET
// Primarily used to revert a PPS configuration
extern void pps_out_LATCH(pps_output_t *pin);
/* ************************************************************************** */
#endif /* _PPS_H_ */