PIC24 Support Libraries
pic24_clockfreq.h
Go to the documentation of this file.
1 /*
2  * "Copyright (c) 2008 Robert B. Reese, Bryan A. Jones, J. W. Bruce ("AUTHORS")"
3  * All rights reserved.
4  * (R. Reese, reese_AT_ece.msstate.edu, Mississippi State University)
5  * (B. A. Jones, bjones_AT_ece.msstate.edu, Mississippi State University)
6  * (J. W. Bruce, jwbruce_AT_ece.msstate.edu, Mississippi State University)
7  *
8  * Permission to use, copy, modify, and distribute this software and its
9  * documentation for any purpose, without fee, and without written agreement is
10  * hereby granted, provided that the above copyright notice, the following
11  * two paragraphs and the authors appear in all copies of this software.
12  *
13  * IN NO EVENT SHALL THE "AUTHORS" BE LIABLE TO ANY PARTY FOR
14  * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT
15  * OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE "AUTHORS"
16  * HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
17  *
18  * THE "AUTHORS" SPECIFICALLY DISCLAIMS ANY WARRANTIES,
19  * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
20  * AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
21  * ON AN "AS IS" BASIS, AND THE "AUTHORS" HAS NO OBLIGATION TO
22  * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
23  *
24  * Please maintain this header in its entirety when copying/modifying
25  * these files.
26  *
27  *
28  */
29 
30 
31 // Documentation for this file. If the \file tag isn't present,
32 // this file won't be documented.
33 /** \file
34  * \brief Configures the system clock.
35  *
36  * The clocking options for the PIC24 are chosen in this file.
37  * The resulting settings are used in pic24_clockfreq.c
38  * to configure and switch the oscillator as necessary after the chip
39  * is running.
40  *
41  * To choose a clock configuration, simply
42  * select a value for \ref CLOCK_CONFIG from the table there.
43  * The default selection used by most of the PIC24H examples is FRCPLL_FCY40MHz
44  * (the internal FRC+PLL configured for FCY = 40 MHz). Some of the examples
45  * in Chapter 12 expect an external 8 MHz crystal, and use the PRIPLL_8MHzCrystal_40MHzFCY option
46  * (external 8 MHz crystal + PLL confgured for FCY = 40 MHz).
47  *
48  * This file provides several useful defines as a result of the
49  * clock selection above:
50  * - \ref CLOCK_CONFIG itself, although this is not typically
51  * directly useful. To determine which clock configuration
52  * was chosen, use the \ref CLOCK_CONFIG_INDEX for comparsion
53  * by applying the \ref IS_CLOCK_CONFIG macro.
54  * - The oscillator source as a configuration word (\ref FNOSC_SEL)
55  * and as a COSC/NOSC bitfield in the OSCCON register
56  * (\ref OSC_SEL_BITS).
57  * - The processor clock frequency \ref FCY.
58  * - The primary oscillator type \ref POSCMD_SEL.
59  * - The primary oscillator freqency \ref POSC_FREQ.
60  *
61  * To define a new clock configuation:
62  * - Add a \#define to the table (see the section
63  * "#defines for CLOCK_CONFIG").
64  * - Add a configClockXxx() function which sets up
65  * and typically switches to that clock in
66  * pic24_clockfreq.c and a prototype for
67  * that function in this file.
68  */
69 
70 #pragma once
71 
72 #include <stdint.h>
73 #include "pic24_chip.h"
74 #include "pic24_libconfig.h"
75 
76 // Verify that the current processor is supported by the clock
77 // configuration chosen.
78 // 1. Set up some #defines as booleans which tell which processor
79 // is selected for this compile.
80 /// \cond nodoxygen
81 #ifdef __PIC24F__
82 # define PIC24F_DEFINED 1
83 #else
84 # define PIC24F_DEFINED 0
85 #endif
86 
87 #ifdef __PIC24H__
88 # define PIC24H_DEFINED 1
89 #else
90 # define PIC24H_DEFINED 0
91 #endif
92 
93 #ifdef __dsPIC33F__
94 # define dsPIC33F_DEFINED 1
95 #else
96 # define dsPIC33F_DEFINED 0
97 #endif
98 
99 #ifdef __PIC24FK__
100 # define PIC24FK_DEFINED 1
101 #else
102 # define PIC24FK_DEFINED 0
103 #endif
104 
105 #ifdef __PIC24E__
106 # define PIC24E_DEFINED 1
107 #else
108 # define PIC24E_DEFINED 0
109 #endif
110 
111 #ifdef __dsPIC33E__
112 # define dsPIC33E_DEFINED 1
113 #else
114 # define dsPIC33E_DEFINED 0
115 #endif
116 /// \endcond
117 
118 
119 ///@{ \name #defines for CLOCK_CONFIG
120 /** Create a table of vales for \ref CLOCK_CONFIG.
121  * When adding a new entry, you must also write
122  * C code to configure the clock in \ref pic24_clockfreq.c.
123  * See that file for examples and the detailed description
124  * section at the top of this page for more information.
125  * Note that \ref FCY and
126  * \ref POSC_FREQ should be defined as a long (with a
127  * trailing L) to retain enough accuracy to store
128  * these values.
129  *
130  * Table entry notes: (see actual code, not the
131  * documentation, for the table)
132  * - Use -1 for don't-care values
133  * - The "unique index" just means each clock configuration
134  * should be assigned a different number. Giving two
135  * configurations the same index will cause problems!
136  * \see CLOCK_CONFIG_INDEX.
137  * - The processor field should evaluate to a Boolean value
138  * which is true if the processor under which this file
139  * is compiled is supported. Later in this file, the
140  * values PIC24F_DEFINED and PIC24H_DEFINED are set to
141  * true (1) or false (0) based on which processor this
142  * file is compiled with. Use these values in the
143  * Boolean expression. For example:
144  * - 1 (works on any processor)
145  * - PIC24H_DEFINED (works only on the PIC24H)
146  * - PIC24F_DEFINED || PIC24H_DEFINED
147  * (works on PIC24F and PIC24H).
148  * - Valid entries for \ref FNOSC_SEL are defined documentation
149  * for that variable.
150  */
151 // Table entries are:
152 // Unique
153 // #define name index FNOSC_SEL FCY POSCMD_SEL POSC_FREQ configClock name Valid for processor(s) Magic number of 498
154 // ------------------------------ ----- ------------ --------- ---------- --------- ---------------- ------------------------------------- -------------------
155 #define SIM_CLOCK 0, -1, 1000000L, POSCMD_NONE, -1, configClockSim, 1, 498
156 #define FRCPLL_FCY16MHz 1, FNOSC_FRCPLL, 16000000L, POSCMD_NONE, -1, configClockFRCPLL_FCY16MHz, (PIC24F_DEFINED || PIC24FK_DEFINED), 498
157 #define FRC_FCY4MHz 2, FNOSC_FRC, 4000000L, POSCMD_NONE, -1, configClockFRC_FCY4MHz, (PIC24F_DEFINED || PIC24FK_DEFINED), 498
158 #define PRI_NO_PLL_7372KHzCrystal 3, FNOSC_PRI, 3686400L, POSCMD_XT, 7372800L, configClockPRI_NO_PLL_7372KHzCrystal, (PIC24F_DEFINED || PIC24FK_DEFINED || PIC24H_DEFINED || dsPIC33F_DEFINED), 498
159 #define FRC_FCY3685KHz 4, FNOSC_FRC, 3685000L, POSCMD_NONE, -1, configClockFRC_FCY3685KHz, (PIC24E_DEFINED || dsPIC33E_DEFINED || PIC24H_DEFINED || dsPIC33F_DEFINED), 498
160 #define FRCPLL_FCY40MHz 5, FNOSC_FRCPLL, 40000000L, POSCMD_NONE, -1, configClockFRCPLL_FCY40MHz, (PIC24E_DEFINED || dsPIC33E_DEFINED || PIC24H_DEFINED || dsPIC33F_DEFINED), 498
161 #define PRIPLL_7372KHzCrystal_40MHzFCY 6, FNOSC_PRIPLL, 39920833L, POSCMD_XT, 7372800L, configClockPRIPLL_7372KHzCrystal_40MHzFCY, (PIC24H_DEFINED || dsPIC33F_DEFINED), 498
162 #define PRIPLL_8MHzCrystal_40MHzFCY 7, FNOSC_PRIPLL, 40000000L, POSCMD_XT, 8000000L, configClockPRIPLL_8MHzCrystal_40MHzFCY, (PIC24H_DEFINED || dsPIC33F_DEFINED || PIC24E_DEFINED || dsPIC33E_DEFINED), 498
163 #define PRIPLL_8MHzCrystal_16MHzFCY 8, FNOSC_PRIPLL, 16000000L, POSCMD_XT, 8000000L, configClockPRIPLL_8MHzCrystal_16MHzFCY, (PIC24F_DEFINED || PIC24FK_DEFINED), 498
164 #define PRI_8MHzCrystal_4MHzFCY 9, FNOSC_PRI, 4000000L, POSCMD_XT, 8000000L, configClockPRI_8MHzCrystal_4MHzFCY, (PIC24F_DEFINED || PIC24FK_DEFINED || PIC24H_DEFINED || dsPIC33F_DEFINED || PIC24E_DEFINED || dsPIC33E_DEFINED), 498
165 #define FRCPLL_FCY60MHz 10, FNOSC_FRCPLL, 59881250L, POSCMD_NONE, -1, configClockFRCPLL_FCY60MHz, (PIC24E_DEFINED || dsPIC33E_DEFINED), 498
166 #define FRCPLL_FCY70MHz 11, FNOSC_FRCPLL, 70015000L, POSCMD_NONE, -1, configClockFRCPLL_FCY70MHz, (PIC24E_DEFINED || dsPIC33E_DEFINED), 498
167 
168 ///@}
169 
170 
171 // For some reason, primary oscillator selections are named
172 // POSCMD_xx in the PIC24H/E, dsPIC33F/E but POSCMOD_xx in the PIC24F/FK.
173 // Work around this.
174 /// \cond nodoxygen
175 #ifndef POSCMD_EC
176 # define POSCMD_EC POSCMOD_EC
177 # define POSCMD_XT POSCMOD_XT
178 # define POSCMD_HS POSCMOD_HS
179 # define POSCMD_NONE POSCMOD_NONE
180 #endif
181 /// \endcond
182 
183 // Turn clock config type info the right #defines, using
184 // a three step process:
185 // Step 1. Just use another macro to turn params (viewied as one argument here)
186 // to multiple arguments to the underscore version of the macro
187 /// \cond nodoxygen
188 #define GET_CLOCK_CONFIG_INDEX(params) _GET_CLOCK_CONFIG_INDEX(params)
189 #define GET_FNOSC_SEL(params) _GET_FNOSC_SEL(params)
190 #define GET_FCY(params) _GET_FCY(params)
191 #define GET_POSCMD_SEL(params) _GET_POSCMD_SEL(params)
192 #define GET_POSC_FREQ(params) _GET_POSC_FREQ(params)
193 #define GET_CONFIG_DEFAULT_CLOCK(params) _GET_CONFIG_DEFAULT_CLOCK(params)
194 #define GET_IS_SUPPORTED(params) _GET_IS_SUPPORTED(params)
195 #define GET_MAGIC(params) _GET_MAGIC(params)
196 
197 // Step 2. Return the desired parameter, now that params are seen as
198 // individual arguments.
199 #define _GET_CLOCK_CONFIG_INDEX(ndx, oscSel, Fcy, posCmdSel, poscFreq, configClockFunc, isSupported, magic) ndx
200 #define _GET_FNOSC_SEL(ndx, oscSel, Fcy, posCmdSel, poscFreq, configClockFunc, isSupported, magic) oscSel
201 #define _GET_FCY(ndx, oscSel, Fcy, posCmdSel, poscFreq, configClockFunc, isSupported, magic) Fcy
202 #define _GET_POSCMD_SEL(ndx, oscSel, Fcy, posCmdSel, poscFreq, configClockFunc, isSupported, magic) posCmdSel
203 #define _GET_POSC_FREQ(ndx, oscSel, Fcy, posCmdSel, poscFreq, configClockFunc, isSupported, magic) poscFreq
204 #define _GET_CONFIG_DEFAULT_CLOCK(ndx, oscSel, Fcy, posCmdSel, poscFreq, configClockFunc, isSupported, magic) configClockFunc
205 #define _GET_IS_SUPPORTED(ndx, oscSel, Fcy, posCmdSel, poscFreq, configClockFunc, isSupported, magic) isSupported
206 #define _GET_MAGIC(ndx, oscSel, Fcy, posCmdSel, poscFreq, configClockFunc, isSupported, magic) magic
207 
208 // Check to make sure the CLOCK_CONFIG choice selected
209 // exists and is valid. Otherwise, the compiler emits some very
210 // confusing errors.
211 # if GET_MAGIC(CLOCK_CONFIG) != 498
212 # error "***********************************************************************"
213 # error "* Value chosen for CLOCK_CONFIG does not exist or is not valid! *"
214 # error "* This produces very confusing compiler errors below. *"
215 # error "***********************************************************************"
216 # endif
217 
218 // Step 3. Call the macros above to set constants based on the
219 // clock config selected.
220 /// \endcond
221 #define CLOCK_CONFIG_INDEX (GET_CLOCK_CONFIG_INDEX(CLOCK_CONFIG))
222 #define FNOSC_SEL (GET_FNOSC_SEL(CLOCK_CONFIG))
223 #define FCY (GET_FCY(CLOCK_CONFIG))
224 #define POSCMD_SEL (GET_POSCMD_SEL(CLOCK_CONFIG))
225 #define POSC_FREQ (GET_POSC_FREQ(CLOCK_CONFIG))
226 #define CONFIG_DEFAULT_CLOCK() (GET_CONFIG_DEFAULT_CLOCK(CLOCK_CONFIG)())
227 
228 // Check to see if this clock configuration supports that processor.
229 #if !GET_IS_SUPPORTED(CLOCK_CONFIG)
230 # error "The clock configuration chosen is not supported by this processor."
231 #endif
232 
233 // Check that the primary oscillator type chosen works is valid.
234 #if !( (POSCMD_SEL == POSCMD_EC) || (POSCMD_SEL == POSCMD_XT) || \
235  (POSCMD_SEL == POSCMD_HS) || (POSCMD_SEL == POSCMD_NONE) )
236 # error "Unknown primary oscillator selection."
237 #endif
238 
239 // Check that the primary oscillator type chosen works for the
240 // oscilallator frequency selected.
241 #if (POSCMD_SEL == POSCMD_XT) && ( (POSC_FREQ < 3500000L) || (POSC_FREQ > 10000000L) )
242 # error "The XT oscialltor chosen in POSCMD_SEL does not support this frequency!"
243 # error "Valid ranges are from 3.5 MHz to 10 MHz."
244 #endif
245 #if (POSCMD_SEL == POSCMD_HS) && ( (POSC_FREQ < 10000000L) || (POSC_FREQ > 32000000L) )
246 # error "The HS oscialltor chosen in POSCMD_SEL does not support this frequency!"
247 # error "Valid ranges are from 10 MHz to 32 MHz."
248 #endif
249 
250 /// @{
251 /// \name Some of the #defines produced by CLOCK_CONFIG choice
252 
253 /** \def CLOCK_CONFIG_INDEX
254  * A unique number is assigned to each clock configuration,
255  * in order to allow comparsions between configurations.
256  * CLOCK_CONFIG_INDEX gives the number assigned to the
257  * selected clock configuration. The macro
258  * \ref IS_CLOCK_CONFIG uses this number for its comparsisons.
259  *
260  * \see SIM_CLOCK
261  */
262 
263 /** \def FNOSC_SEL
264  * Oscillator source selection for the PIC24. FNOSC_SEL
265  * is set to one of the following based on
266  * \ref CLOCK_CONFIG :
267  * \code
268  * Name Description PIC24F PIC24FK PIC24H/dsPIC33F PIC24E/dsPIC33E
269  * ------------- -------------------------------------------- ------ ------- --------------- ---------------
270  * FNOSC_FRC Fast RC oscillator X X X X
271  * FNOSC_FRCPLL Fast RC oscillator w/ divide and PLL X X X X
272  * FNOSC_PRI Primary oscillator (XT, HS, EC) X X X X
273  * FNOSC_PRIPLL Primary oscillator (XT, HS, EC) w/ PLL X X X X
274  * FNOSC_SOSC Secondary oscillator X X X X
275  * FNOSC_LPRC Low power RC oscillator X X X X
276  * FNOSC_FRCDIV16 Fast RC oscillator w/ divide by 16 X X
277  * FNOSC_LPRCDIVN Low power RC oscillator w/divide by N X X
278  * FNOSC_LPFRCDIV 500 kHz FRC Oscillator with Postscaler X
279  * FNOSC_FRCDIV Fast RC oscillator with divide X X
280  \endcode
281  */
282 
283 /** \def FCY
284  * FCY specifies the resulting processor clock frequency after
285  * all PLL/divide operations take the inital clock and produce
286  * a processor clock. The units of this value are Hz, so the
287  * value 40000000L is 40 MHz.
288  *
289  * NOTE: This should be defined as a long (with a trailing L
290  * after the number) to allocate enough space to correctly
291  * store the processor clock frequency.
292  */
293 
294 /** \def POSCMD_SEL
295  * Specifies the primary oscillator type. Valid values:
296  * \code
297  * POSCMD_EC External clock
298  * POSCMD_XT XT oscillator (for crystals from 3.5 MHz to 10 MHz)
299  * POSCMD_HS HS oscillator (for crystals from 10 MHz to 32 MHz)
300  * POSCMD_NONE Primary oscillator disabled
301  * \endcode
302  */
303 
304 /** \def POSC_FREQ
305  * This values gives the primary osciallator frequency (if used).
306  * The units of this value are Hz, so the value 40000000L is 40 MHz.
307  *
308  * NOTE: This should be defined as a long (with a trailing L
309  * after the number) to allocate enough space to correctly
310  * store the processor clock frequency.
311 */
312 
313 /** \def OSC_SEL_BITS
314  * A macro giving the NOSC/COSC bits
315  * for the OSCCON register
316  * which correspond to \ref FNOSC_SEL,
317  * the configuration word which contains
318  * the FNOSC bits.
319  */
320 
321 /** \def CONFIG_DEFAULT_CLOCK
322  * Calls one of the configClock() functions defined
323  * in pic24_clockfreq.c based on the \ref CLOCK_CONFIG
324  * chosen.
325  */
326 ///@}
327 
328 /** A constant which gives the number of processor
329  * clock cycles in 1 millisecond. This value
330  * is cast to a uint32_t.
331  */
332 #define CYCLES_PER_MS ((uint32_t)(FCY * 0.001))
333 
334 /** A constant which gives the number of processor
335  * clock cycles in 1 microsecond. This value
336  * is cast to a uint32_t.
337  */
338 #define CYCLES_PER_US ((uint32_t)(FCY * 0.000001))
339 
340 
341 ///@{ \name Helper macros for clock configuration
342 /** A helper macro to check if the given clock configuration
343  * was selected. Example usage is given in
344  * \ref pic24_clockfreq.c. A shorter example:
345  * \code
346  * #if IS_CLOCK_CONFIG(FRCPLL_FCY40MHz)
347  * ... code only included if CLOCK_CONFIG is FRCPLL_FCY40MHz ...
348  * #endif
349  * \endcode
350  * \param clockConfig Clock configuration to compare the current
351  * clock configuation against.
352  */
353 #define IS_CLOCK_CONFIG(clockConfig) (_GET_CLOCK_CONFIG_INDEX(clockConfig) == CLOCK_CONFIG_INDEX)
354 
355 /** A macro to determine the NOSC/COSC bits
356  * for the OSCCON register given bits taken
357  * from the PIC24's configuration FNOSC word.
358  */
359 #define GET_OSC_SEL_BITS(bits) _GET_OSC_SEL_BITS(bits)
360 /// \cond nodoxygen
361 #if defined(__PIC24H__) || defined (__PIC24FK__) || defined(__dsPIC33F__) || defined(__PIC24E__) || defined(__dsPIC33E__) || defined(__DOXYGEN__)
362 # define _GET_OSC_SEL_BITS(bits) ((bits >> 0) & 0x07)
363 #elif defined (__PIC24F__)
364 # define _GET_OSC_SEL_BITS(bits) ((bits >> 8) & 0x07)
365 #else
366 # error "Unknown processor."
367 #endif
368 // Note: putting the \ endcond here causes Doxygen 1.5.6
369 // to complain. ???
370 ///@}
371 /// \endcond
372 #define OSC_SEL_BITS GET_OSC_SEL_BITS(FNOSC_SEL)
373 
374 // Double check to make sure the oscillator selection above is valid.
375 #if ( (OSC_SEL_BITS < 0) || (OSC_SEL_BITS > 7) )
376 # error "Invalid oscillator selection FNOSC_SEL."
377 #endif
378 
379 /** @{
380  * \name configClock() functions for various clock setups
381  */
382 
383 
384 #if GET_IS_SUPPORTED(SIM_CLOCK)
385 /** Nothing to do! Simulator clock not set by OSCCON,
386  * but instead in the Debugger | Settings, Osc/Trace
387  * dialog box. It should be 2 MHz there, since that's
388  * Fosc = 2*Fcy. At 1 MHz, simulation speed seems fast
389  * enough to execute a reasonable amount of code. Also,
390  * at a 64K line trace buffer, we can see 64 ms of
391  * execution, which is plenty to see 20 ms servo pulses.
392  */
393 void configClockSim(void);
394 #endif
395 
396 #if GET_IS_SUPPORTED(FRCPLL_FCY16MHz)
397 void configClockFRCPLL_FCY16MHz(void);
398 #endif
399 
400 #if GET_IS_SUPPORTED(FRC_FCY4MHz)
401 void configClockFRC_FCY4MHz(void);
402 #endif
403 
404 #if GET_IS_SUPPORTED(PRI_NO_PLL_7372KHzCrystal)
405 void configClockPRI_NO_PLL_7372KHzCrystal(void);
406 #endif
407 
408 #if GET_IS_SUPPORTED(FRC_FCY3685KHz)
409 void configClockFRC_FCY3685KHz(void);
410 #endif
411 
412 #if GET_IS_SUPPORTED(FRCPLL_FCY40MHz)
413 void configClockFRCPLL_FCY40MHz(void);
414 #endif
415 
416 #if GET_IS_SUPPORTED(FRCPLL_FCY60MHz)
417 void configClockFRCPLL_FCY60MHz(void);
418 #endif
419 
420 #if GET_IS_SUPPORTED(FRCPLL_FCY70MHz)
421 void configClockFRCPLL_FCY70MHz(void);
422 #endif
423 
424 #if GET_IS_SUPPORTED(PRI_NO_PLL_7372KHzCrystal)
425 void configClockPRIPLL_7372KHzCrystal_40MHzFCY(void);
426 #endif
427 
428 #if GET_IS_SUPPORTED(PRIPLL_8MHzCrystal_40MHzFCY)
429 void configClockPRIPLL_8MHzCrystal_40MHzFCY(void);
430 #endif
431 
432 #if GET_IS_SUPPORTED(PRIPLL_8MHzCrystal_16MHzFCY)
433 void configClockPRIPLL_8MHzCrystal_16MHzFCY(void);
434 #endif
435 
436 #if GET_IS_SUPPORTED(PRI_8MHzCrystal_4MHzFCY)
437 void configClockPRI_8MHzCrystal_4MHzFCY(void);
438 #endif
439 
440 
441 /// @}
442 
443 /** Configure the default clock by calling the
444  * \ref CONFIG_DEFAULT_CLOCK() macro.
445  */
446 static inline void configClock() {
448 }
449 
450 
451 /** Switch the clock to the source specified. The source
452  * given will be assigned to NOSC in the OSCCON register,
453  * the a switch clock performed.
454  *
455  * Note: <b>DO NOT</b> use \ref FNOSC_SEL as the source;
456  * instead, use \ref OSC_SEL_BITS. FNOSC_SEL is for
457  * configuration bits while switchClock
458  * expects a NOSC value to write to the
459  * OSCCON register.
460  *
461  * \param u8_source The clock source to switch to.
462  */
463 void switchClock(uint8_t u8_source);
static void configClock()
void switchClock(uint8_t u8_source)
#define CONFIG_DEFAULT_CLOCK()
unsigned char uint8_t
An abbreviation for an 8-bit unsigned integer.
Definition: dataXferImpl.h:194