]> Git Repo - pico-vscode.git/blob - web/docs/group__hardware__adc.html
Merge branch 'main' into main
[pico-vscode.git] / web / docs / group__hardware__adc.html
1 <!-- HTML header for doxygen 1.8.20-->
2 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
3 <html xmlns="http://www.w3.org/1999/xhtml">
4 <head>
5         <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
6         <meta http-equiv="X-UA-Compatible" content="IE=9"/>
7         <meta name="generator" content="Doxygen 1.9.4"/>
8         <meta name="viewport" content="width=device-width, initial-scale=1"/>
9         <title>Raspberry Pi Pico SDK: hardware_adc</title>
10         <!-- <link href="tabs.css" rel="stylesheet" type="text/css"/> -->
11         <script type="text/javascript" src="jquery.js"></script>
12         <script type="text/javascript" src="dynsections.js"></script>
13         <link href="navtree.css" rel="stylesheet" type="text/css"/>
14 <script type="text/javascript" src="resize.js"></script>
15 <script type="text/javascript" src="navtreedata.js"></script>
16 <script type="text/javascript" src="navtree.js"></script>
17         <link href="search/search.css" rel="stylesheet" type="text/css"/>
18 <script type="text/javascript" src="search/searchdata.js"></script>
19 <script type="text/javascript" src="search/search.js"></script>
20     <link href="https://fonts.googleapis.com/css2?family=Roboto:wght@300;400;500&display=swap" rel="stylesheet">
21         <link href="doxygen.css" rel="stylesheet" type="text/css" />
22         <link href="normalise.css" rel="stylesheet" type="text/css"/>
23 <link href="main.css" rel="stylesheet" type="text/css"/>
24 <link href="styles.css" rel="stylesheet" type="text/css"/>
25 </head>
26 <body>
27         <div class="navigation-mobile">
28                 <div class="logo--mobile">
29                         <a href="/"><img src="logo-mobile.svg" alt="Raspberry Pi"></a>
30                 </div>
31                 <div class="navigation-toggle">
32                         <span class="line-1"></span>
33                         <span class="line-2">
34                                 <p>Menu Toggle</p>
35                         </span>
36                         <span class="line-3"></span>
37                 </div>
38         </div>
39         <div id="top"><!-- do not remove this div, it is closed by doxygen! -->
40                 <div class="logo">
41                         <a href="index.html"> <img src="logo.svg" alt="Raspberry Pi"></a>
42                         <span style="display: inline-block; margin-top: 10px;">
43                                 v2.0.0
44                         </span>
45                 </div>
46                 <div class="navigation-footer">
47                         <img src="logo-mobile.svg" alt="Raspberry Pi">
48                         <a href="https://www.raspberrypi.com/" target="_blank">By Raspberry Pi Ltd</a>
49                 </div>
50 <!--            <div class="search">
51                         <form>
52                                 <input type="search" name="search" id="search" placeholder="Search">
53                                 <input type="submit" value="Search">
54                         </form>
55                 </div> -->
56 <!-- Generated by Doxygen 1.9.4 -->
57 <script type="text/javascript">
58 /* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
59 var searchBox = new SearchBox("searchBox", "search",'Search','.html');
60 /* @license-end */
61 </script>
62 <script type="text/javascript" src="menudata.js"></script>
63 <script type="text/javascript" src="menu.js"></script>
64 <script type="text/javascript">
65 /* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
66 $(function() {
67   initMenu('',true,false,'search.php','Search');
68   $(document).ready(function() { init_search(); });
69 });
70 /* @license-end */
71 </script>
72 <div id="main-nav"></div>
73 </div><!-- top -->
74 <div id="side-nav" class="ui-resizable side-nav-resizable">
75   <div id="nav-tree">
76     <div id="nav-tree-contents">
77       <div id="nav-sync" class="sync"></div>
78     </div>
79   </div>
80   <div id="splitbar" style="-moz-user-select:none;" 
81        class="ui-resizable-handle">
82   </div>
83 </div>
84 <script type="text/javascript">
85 /* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
86 $(document).ready(function(){initNavTree('group__hardware__adc.html',''); initResizable(); });
87 /* @license-end */
88 </script>
89 <div id="doc-content">
90 <!-- window showing the filter options -->
91 <div id="MSearchSelectWindow"
92      onmouseover="return searchBox.OnSearchSelectShow()"
93      onmouseout="return searchBox.OnSearchSelectHide()"
94      onkeydown="return searchBox.OnSearchSelectKey(event)">
95 </div>
96
97 <!-- iframe showing the search results (closed by default) -->
98 <div id="MSearchResultsWindow">
99 <iframe src="javascript:void(0)" frameborder="0" 
100         name="MSearchResults" id="MSearchResults">
101 </iframe>
102 </div>
103
104 <div class="header">
105   <div class="summary">
106 <a href="#func-members">Functions</a>  </div>
107   <div class="headertitle"><div class="title">hardware_adc<div class="ingroups"><a class="el" href="group__hardware.html">Hardware APIs</a></div></div></div>
108 </div><!--header-->
109 <div class="contents">
110
111 <p>Analog to Digital Converter (ADC) API.  
112 <a href="#details">More...</a></p>
113 <table class="memberdecls">
114 <tr class="heading"><td colspan="2"><h2 class="groupheader"><a id="func-members" name="func-members"></a>
115 Functions</h2></td></tr>
116 <tr class="memitem:ga2b815e6730e8723a6d1d06d9ef8f31c0"><td class="memItemLeft" align="right" valign="top"><a id="ga2b815e6730e8723a6d1d06d9ef8f31c0" name="ga2b815e6730e8723a6d1d06d9ef8f31c0"></a>
117 void&#160;</td><td class="memItemRight" valign="bottom"><b>adc_init</b> (void)</td></tr>
118 <tr class="memdesc:ga2b815e6730e8723a6d1d06d9ef8f31c0"><td class="mdescLeft">&#160;</td><td class="mdescRight">Initialise the ADC HW. <br /></td></tr>
119 <tr class="separator:ga2b815e6730e8723a6d1d06d9ef8f31c0"><td class="memSeparator" colspan="2">&#160;</td></tr>
120 <tr class="memitem:gab15d6e804715935b4e9b5027a2940910"><td class="memItemLeft" align="right" valign="top">static void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__hardware__adc.html#gab15d6e804715935b4e9b5027a2940910">adc_gpio_init</a> (uint gpio)</td></tr>
121 <tr class="memdesc:gab15d6e804715935b4e9b5027a2940910"><td class="mdescLeft">&#160;</td><td class="mdescRight">Initialise the gpio for use as an ADC pin.  <a href="group__hardware__adc.html#gab15d6e804715935b4e9b5027a2940910">More...</a><br /></td></tr>
122 <tr class="separator:gab15d6e804715935b4e9b5027a2940910"><td class="memSeparator" colspan="2">&#160;</td></tr>
123 <tr class="memitem:ga5d3b8875947df2f4ba022cb6aa40594b"><td class="memItemLeft" align="right" valign="top">static void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__hardware__adc.html#ga5d3b8875947df2f4ba022cb6aa40594b">adc_select_input</a> (uint input)</td></tr>
124 <tr class="memdesc:ga5d3b8875947df2f4ba022cb6aa40594b"><td class="mdescLeft">&#160;</td><td class="mdescRight">ADC input select.  <a href="group__hardware__adc.html#ga5d3b8875947df2f4ba022cb6aa40594b">More...</a><br /></td></tr>
125 <tr class="separator:ga5d3b8875947df2f4ba022cb6aa40594b"><td class="memSeparator" colspan="2">&#160;</td></tr>
126 <tr class="memitem:ga84b5f9054de9c00d51095c9bdefb2dca"><td class="memItemLeft" align="right" valign="top">static uint&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__hardware__adc.html#ga84b5f9054de9c00d51095c9bdefb2dca">adc_get_selected_input</a> (void)</td></tr>
127 <tr class="memdesc:ga84b5f9054de9c00d51095c9bdefb2dca"><td class="mdescLeft">&#160;</td><td class="mdescRight">Get the currently selected ADC input channel.  <a href="group__hardware__adc.html#ga84b5f9054de9c00d51095c9bdefb2dca">More...</a><br /></td></tr>
128 <tr class="separator:ga84b5f9054de9c00d51095c9bdefb2dca"><td class="memSeparator" colspan="2">&#160;</td></tr>
129 <tr class="memitem:ga16d25be75e16f0671d3e3185b0b59771"><td class="memItemLeft" align="right" valign="top">static void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__hardware__adc.html#ga16d25be75e16f0671d3e3185b0b59771">adc_set_round_robin</a> (uint input_mask)</td></tr>
130 <tr class="memdesc:ga16d25be75e16f0671d3e3185b0b59771"><td class="mdescLeft">&#160;</td><td class="mdescRight">Round Robin sampling selector.  <a href="group__hardware__adc.html#ga16d25be75e16f0671d3e3185b0b59771">More...</a><br /></td></tr>
131 <tr class="separator:ga16d25be75e16f0671d3e3185b0b59771"><td class="memSeparator" colspan="2">&#160;</td></tr>
132 <tr class="memitem:ga33f302059e05899d1709d6268d75972b"><td class="memItemLeft" align="right" valign="top">static void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__hardware__adc.html#ga33f302059e05899d1709d6268d75972b">adc_set_temp_sensor_enabled</a> (bool enable)</td></tr>
133 <tr class="memdesc:ga33f302059e05899d1709d6268d75972b"><td class="mdescLeft">&#160;</td><td class="mdescRight">Enable the onboard temperature sensor.  <a href="group__hardware__adc.html#ga33f302059e05899d1709d6268d75972b">More...</a><br /></td></tr>
134 <tr class="separator:ga33f302059e05899d1709d6268d75972b"><td class="memSeparator" colspan="2">&#160;</td></tr>
135 <tr class="memitem:gaf32d82a43103e6672048001f58d5f6fb"><td class="memItemLeft" align="right" valign="top">static uint16_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__hardware__adc.html#gaf32d82a43103e6672048001f58d5f6fb">adc_read</a> (void)</td></tr>
136 <tr class="memdesc:gaf32d82a43103e6672048001f58d5f6fb"><td class="mdescLeft">&#160;</td><td class="mdescRight">Perform a single conversion.  <a href="group__hardware__adc.html#gaf32d82a43103e6672048001f58d5f6fb">More...</a><br /></td></tr>
137 <tr class="separator:gaf32d82a43103e6672048001f58d5f6fb"><td class="memSeparator" colspan="2">&#160;</td></tr>
138 <tr class="memitem:ga5d50a24eb26da7fbc6ee9bc76723b09c"><td class="memItemLeft" align="right" valign="top">static void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__hardware__adc.html#ga5d50a24eb26da7fbc6ee9bc76723b09c">adc_run</a> (bool run)</td></tr>
139 <tr class="memdesc:ga5d50a24eb26da7fbc6ee9bc76723b09c"><td class="mdescLeft">&#160;</td><td class="mdescRight">Enable or disable free-running sampling mode.  <a href="group__hardware__adc.html#ga5d50a24eb26da7fbc6ee9bc76723b09c">More...</a><br /></td></tr>
140 <tr class="separator:ga5d50a24eb26da7fbc6ee9bc76723b09c"><td class="memSeparator" colspan="2">&#160;</td></tr>
141 <tr class="memitem:ga333f7ca46a11241d96d0a4c24f0d4bb0"><td class="memItemLeft" align="right" valign="top">static void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__hardware__adc.html#ga333f7ca46a11241d96d0a4c24f0d4bb0">adc_set_clkdiv</a> (float clkdiv)</td></tr>
142 <tr class="memdesc:ga333f7ca46a11241d96d0a4c24f0d4bb0"><td class="mdescLeft">&#160;</td><td class="mdescRight">Set the ADC Clock divisor.  <a href="group__hardware__adc.html#ga333f7ca46a11241d96d0a4c24f0d4bb0">More...</a><br /></td></tr>
143 <tr class="separator:ga333f7ca46a11241d96d0a4c24f0d4bb0"><td class="memSeparator" colspan="2">&#160;</td></tr>
144 <tr class="memitem:ga2a6fa32da04e65a027e14deaf32b8f10"><td class="memItemLeft" align="right" valign="top">static void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__hardware__adc.html#ga2a6fa32da04e65a027e14deaf32b8f10">adc_fifo_setup</a> (bool en, bool dreq_en, uint16_t dreq_thresh, bool err_in_fifo, bool byte_shift)</td></tr>
145 <tr class="memdesc:ga2a6fa32da04e65a027e14deaf32b8f10"><td class="mdescLeft">&#160;</td><td class="mdescRight">Setup the ADC FIFO.  <a href="group__hardware__adc.html#ga2a6fa32da04e65a027e14deaf32b8f10">More...</a><br /></td></tr>
146 <tr class="separator:ga2a6fa32da04e65a027e14deaf32b8f10"><td class="memSeparator" colspan="2">&#160;</td></tr>
147 <tr class="memitem:gafdfd586e6c26ffe4759afaa3c3f95465"><td class="memItemLeft" align="right" valign="top">static bool&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__hardware__adc.html#gafdfd586e6c26ffe4759afaa3c3f95465">adc_fifo_is_empty</a> (void)</td></tr>
148 <tr class="memdesc:gafdfd586e6c26ffe4759afaa3c3f95465"><td class="mdescLeft">&#160;</td><td class="mdescRight">Check FIFO empty state.  <a href="group__hardware__adc.html#gafdfd586e6c26ffe4759afaa3c3f95465">More...</a><br /></td></tr>
149 <tr class="separator:gafdfd586e6c26ffe4759afaa3c3f95465"><td class="memSeparator" colspan="2">&#160;</td></tr>
150 <tr class="memitem:gafa9793deea59c5cbfea147e0e9d895c3"><td class="memItemLeft" align="right" valign="top">static uint8_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__hardware__adc.html#gafa9793deea59c5cbfea147e0e9d895c3">adc_fifo_get_level</a> (void)</td></tr>
151 <tr class="memdesc:gafa9793deea59c5cbfea147e0e9d895c3"><td class="mdescLeft">&#160;</td><td class="mdescRight">Get number of entries in the ADC FIFO.  <a href="group__hardware__adc.html#gafa9793deea59c5cbfea147e0e9d895c3">More...</a><br /></td></tr>
152 <tr class="separator:gafa9793deea59c5cbfea147e0e9d895c3"><td class="memSeparator" colspan="2">&#160;</td></tr>
153 <tr class="memitem:ga689d64744e7fe5284562569b24e9d624"><td class="memItemLeft" align="right" valign="top">static uint16_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__hardware__adc.html#ga689d64744e7fe5284562569b24e9d624">adc_fifo_get</a> (void)</td></tr>
154 <tr class="memdesc:ga689d64744e7fe5284562569b24e9d624"><td class="mdescLeft">&#160;</td><td class="mdescRight">Get ADC result from FIFO.  <a href="group__hardware__adc.html#ga689d64744e7fe5284562569b24e9d624">More...</a><br /></td></tr>
155 <tr class="separator:ga689d64744e7fe5284562569b24e9d624"><td class="memSeparator" colspan="2">&#160;</td></tr>
156 <tr class="memitem:ga61553375ecc9275fa14c6ff7792a1506"><td class="memItemLeft" align="right" valign="top">static uint16_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__hardware__adc.html#ga61553375ecc9275fa14c6ff7792a1506">adc_fifo_get_blocking</a> (void)</td></tr>
157 <tr class="memdesc:ga61553375ecc9275fa14c6ff7792a1506"><td class="mdescLeft">&#160;</td><td class="mdescRight">Wait for the ADC FIFO to have data.  <a href="group__hardware__adc.html#ga61553375ecc9275fa14c6ff7792a1506">More...</a><br /></td></tr>
158 <tr class="separator:ga61553375ecc9275fa14c6ff7792a1506"><td class="memSeparator" colspan="2">&#160;</td></tr>
159 <tr class="memitem:gad637d97583f2c24e4159dc22bf17eaf2"><td class="memItemLeft" align="right" valign="top">static void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__hardware__adc.html#gad637d97583f2c24e4159dc22bf17eaf2">adc_fifo_drain</a> (void)</td></tr>
160 <tr class="memdesc:gad637d97583f2c24e4159dc22bf17eaf2"><td class="mdescLeft">&#160;</td><td class="mdescRight">Drain the ADC FIFO.  <a href="group__hardware__adc.html#gad637d97583f2c24e4159dc22bf17eaf2">More...</a><br /></td></tr>
161 <tr class="separator:gad637d97583f2c24e4159dc22bf17eaf2"><td class="memSeparator" colspan="2">&#160;</td></tr>
162 <tr class="memitem:gaf8e363e63f40e00c169f7355c9668681"><td class="memItemLeft" align="right" valign="top">static void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__hardware__adc.html#gaf8e363e63f40e00c169f7355c9668681">adc_irq_set_enabled</a> (bool enabled)</td></tr>
163 <tr class="memdesc:gaf8e363e63f40e00c169f7355c9668681"><td class="mdescLeft">&#160;</td><td class="mdescRight">Enable/Disable ADC interrupts.  <a href="group__hardware__adc.html#gaf8e363e63f40e00c169f7355c9668681">More...</a><br /></td></tr>
164 <tr class="separator:gaf8e363e63f40e00c169f7355c9668681"><td class="memSeparator" colspan="2">&#160;</td></tr>
165 </table>
166 <a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
167 <p >Analog to Digital Converter (ADC) API. </p>
168 <p >RP-series microcontrollers have an internal analogue-digital converter (ADC) with the following features:</p><ul>
169 <li>SAR ADC</li>
170 <li>500 kS/s (Using an independent 48MHz clock)</li>
171 <li>12 bit (RP2040 8.7 ENOB, RP2350 9.2 ENOB) </li>
172 <li>RP2040 5 input mux:<ul>
173 <li>4 inputs that are available on package pins shared with GPIO[29:26]</li>
174 <li>1 input is dedicated to the internal temperature sensor</li>
175 <li>4 element receive sample FIFO </li>
176 </ul>
177 </li>
178 </ul>
179 <ul>
180 <li>RP2350 5 or 9 input mux:<ul>
181 <li>4 inputs available on QFN-60 package pins shared with GPIO[29:26]</li>
182 <li>8 inputs available on QFN-80 package pins shared with GPIO[47:40]</li>
183 <li>8 element receive sample FIFO </li>
184 </ul>
185 </li>
186 <li>One input dedicated to the internal temperature sensor (see Section 12.4.6)</li>
187 <li>Interrupt generation</li>
188 <li>DMA interface</li>
189 </ul>
190 <p >Although there is only one ADC you can specify the input to it using the <a class="el" href="group__hardware__adc.html#ga5d3b8875947df2f4ba022cb6aa40594b" title="ADC input select.">adc_select_input()</a> function. In round robin mode (<a class="el" href="group__hardware__adc.html#ga16d25be75e16f0671d3e3185b0b59771" title="Round Robin sampling selector.">adc_set_round_robin()</a>), the ADC will use that input and move to the next one after a read.</p>
191 <p >RP2040, RP2350 QFN-60: User ADC inputs are on 0-3 (GPIO 26-29), the temperature sensor is on input 4. RP2350 QFN-80 : User ADC inputs are on 0-7 (GPIO 40-47), the temperature sensor is on input 8.</p>
192 <p >Temperature sensor values can be approximated in centigrade as:</p>
193 <p >T = 27 - (ADC_Voltage - 0.706)/0.001721</p>
194 <h2><a class="anchor" id="adc_example"></a>
195 Example</h2>
196 <div class="fragment"><div class="line"> </div>
197 <div class="line"><span class="preprocessor">#include &lt;<a class="code" href="stdio_8h.html">stdio.h</a>&gt;</span></div>
198 <div class="line"><span class="preprocessor">#include &quot;<a class="code" href="stdlib_8h.html">pico/stdlib.h</a>&quot;</span></div>
199 <div class="line"><span class="preprocessor">#include &quot;<a class="code" href="gpio_8h.html">hardware/gpio.h</a>&quot;</span></div>
200 <div class="line"><span class="preprocessor">#include &quot;<a class="code" href="rp2__common_2hardware__adc_2include_2hardware_2adc_8h.html">hardware/adc.h</a>&quot;</span></div>
201 <div class="line"> </div>
202 <div class="line"><span class="keywordtype">int</span> main() {</div>
203 <div class="line">    <a class="code hl_function" href="group__pico__stdio.html#ga0e604311fb226dae91ff4eb17a19d67a">stdio_init_all</a>();</div>
204 <div class="line">    printf(<span class="stringliteral">&quot;ADC Example, measuring GPIO26\n&quot;</span>);</div>
205 <div class="line"> </div>
206 <div class="line">    <a class="code hl_function" href="group__hardware__adc.html#ga2b815e6730e8723a6d1d06d9ef8f31c0">adc_init</a>();</div>
207 <div class="line"> </div>
208 <div class="line">    <span class="comment">// Make sure GPIO is high-impedance, no pullups etc</span></div>
209 <div class="line">    <a class="code hl_function" href="group__hardware__adc.html#gab15d6e804715935b4e9b5027a2940910">adc_gpio_init</a>(26);</div>
210 <div class="line">    <span class="comment">// Select ADC input 0 (GPIO26)</span></div>
211 <div class="line">    <a class="code hl_function" href="group__hardware__adc.html#ga5d3b8875947df2f4ba022cb6aa40594b">adc_select_input</a>(0);</div>
212 <div class="line"> </div>
213 <div class="line">    <span class="keywordflow">while</span> (1) {</div>
214 <div class="line">        <span class="comment">// 12-bit conversion, assume max value == ADC_VREF == 3.3 V</span></div>
215 <div class="line">        <span class="keyword">const</span> <span class="keywordtype">float</span> conversion_factor = 3.3f / (1 &lt;&lt; 12);</div>
216 <div class="line">        uint16_t result = <a class="code hl_function" href="group__hardware__adc.html#gaf32d82a43103e6672048001f58d5f6fb">adc_read</a>();</div>
217 <div class="line">        printf(<span class="stringliteral">&quot;Raw value: 0x%03x, voltage: %f V\n&quot;</span>, result, result * conversion_factor);</div>
218 <div class="line">        <a class="code hl_function" href="group__sleep.html#gae617a6842d4f3a192064c4354b88fcff">sleep_ms</a>(500);</div>
219 <div class="line">    }</div>
220 <div class="line">}</div>
221 <div class="ttc" id="agpio_8h_html"><div class="ttname"><a href="gpio_8h.html">gpio.h</a></div></div>
222 <div class="ttc" id="agroup__hardware__adc_html_ga2b815e6730e8723a6d1d06d9ef8f31c0"><div class="ttname"><a href="group__hardware__adc.html#ga2b815e6730e8723a6d1d06d9ef8f31c0">adc_init</a></div><div class="ttdeci">void adc_init(void)</div><div class="ttdoc">Initialise the ADC HW.</div><div class="ttdef"><b>Definition:</b> adc.c:11</div></div>
223 <div class="ttc" id="agroup__hardware__adc_html_ga5d3b8875947df2f4ba022cb6aa40594b"><div class="ttname"><a href="group__hardware__adc.html#ga5d3b8875947df2f4ba022cb6aa40594b">adc_select_input</a></div><div class="ttdeci">static void adc_select_input(uint input)</div><div class="ttdoc">ADC input select.</div><div class="ttdef"><b>Definition:</b> adc.h:113</div></div>
224 <div class="ttc" id="agroup__hardware__adc_html_gab15d6e804715935b4e9b5027a2940910"><div class="ttname"><a href="group__hardware__adc.html#gab15d6e804715935b4e9b5027a2940910">adc_gpio_init</a></div><div class="ttdeci">static void adc_gpio_init(uint gpio)</div><div class="ttdoc">Initialise the gpio for use as an ADC pin.</div><div class="ttdef"><b>Definition:</b> adc.h:90</div></div>
225 <div class="ttc" id="agroup__hardware__adc_html_gaf32d82a43103e6672048001f58d5f6fb"><div class="ttname"><a href="group__hardware__adc.html#gaf32d82a43103e6672048001f58d5f6fb">adc_read</a></div><div class="ttdeci">static uint16_t adc_read(void)</div><div class="ttdoc">Perform a single conversion.</div><div class="ttdef"><b>Definition:</b> adc.h:170</div></div>
226 <div class="ttc" id="agroup__pico__stdio_html_ga0e604311fb226dae91ff4eb17a19d67a"><div class="ttname"><a href="group__pico__stdio.html#ga0e604311fb226dae91ff4eb17a19d67a">stdio_init_all</a></div><div class="ttdeci">bool stdio_init_all(void)</div><div class="ttdoc">Initialize all of the present standard stdio types that are linked into the binary.</div><div class="ttdef"><b>Definition:</b> stdio.c:200</div></div>
227 <div class="ttc" id="agroup__sleep_html_gae617a6842d4f3a192064c4354b88fcff"><div class="ttname"><a href="group__sleep.html#gae617a6842d4f3a192064c4354b88fcff">sleep_ms</a></div><div class="ttdeci">void sleep_ms(uint32_t ms)</div><div class="ttdoc">Wait for the given number of milliseconds before returning.</div><div class="ttdef"><b>Definition:</b> time.c:431</div></div>
228 <div class="ttc" id="arp2__common_2hardware__adc_2include_2hardware_2adc_8h_html"><div class="ttname"><a href="rp2__common_2hardware__adc_2include_2hardware_2adc_8h.html">adc.h</a></div></div>
229 <div class="ttc" id="astdio_8h_html"><div class="ttname"><a href="stdio_8h.html">stdio.h</a></div></div>
230 <div class="ttc" id="astdlib_8h_html"><div class="ttname"><a href="stdlib_8h.html">stdlib.h</a></div></div>
231 </div><!-- fragment --> <h2 class="groupheader">Function Documentation</h2>
232 <a id="gad637d97583f2c24e4159dc22bf17eaf2" name="gad637d97583f2c24e4159dc22bf17eaf2"></a>
233 <h2 class="memtitle"><span class="permalink"><a href="#gad637d97583f2c24e4159dc22bf17eaf2">&#9670;&nbsp;</a></span>adc_fifo_drain()</h2>
234
235 <div class="memitem">
236 <div class="memproto">
237 <table class="mlabels">
238   <tr>
239   <td class="mlabels-left">
240       <table class="memname">
241         <tr>
242           <td class="memname">static void adc_fifo_drain </td>
243           <td>(</td>
244           <td class="paramtype">void&#160;</td>
245           <td class="paramname"></td><td>)</td>
246           <td></td>
247         </tr>
248       </table>
249   </td>
250   <td class="mlabels-right">
251 <span class="mlabels"><span class="mlabel">inline</span><span class="mlabel">static</span></span>  </td>
252   </tr>
253 </table>
254 </div><div class="memdoc">
255
256 <p>Drain the ADC FIFO. </p>
257 <p >Will wait for any conversion to complete then drain the FIFO, discarding any results. </p>
258
259 </div>
260 </div>
261 <a id="ga689d64744e7fe5284562569b24e9d624" name="ga689d64744e7fe5284562569b24e9d624"></a>
262 <h2 class="memtitle"><span class="permalink"><a href="#ga689d64744e7fe5284562569b24e9d624">&#9670;&nbsp;</a></span>adc_fifo_get()</h2>
263
264 <div class="memitem">
265 <div class="memproto">
266 <table class="mlabels">
267   <tr>
268   <td class="mlabels-left">
269       <table class="memname">
270         <tr>
271           <td class="memname">static uint16_t adc_fifo_get </td>
272           <td>(</td>
273           <td class="paramtype">void&#160;</td>
274           <td class="paramname"></td><td>)</td>
275           <td></td>
276         </tr>
277       </table>
278   </td>
279   <td class="mlabels-right">
280 <span class="mlabels"><span class="mlabel">inline</span><span class="mlabel">static</span></span>  </td>
281   </tr>
282 </table>
283 </div><div class="memdoc">
284
285 <p>Get ADC result from FIFO. </p>
286 <p >Pops the latest result from the ADC FIFO. </p>
287
288 </div>
289 </div>
290 <a id="ga61553375ecc9275fa14c6ff7792a1506" name="ga61553375ecc9275fa14c6ff7792a1506"></a>
291 <h2 class="memtitle"><span class="permalink"><a href="#ga61553375ecc9275fa14c6ff7792a1506">&#9670;&nbsp;</a></span>adc_fifo_get_blocking()</h2>
292
293 <div class="memitem">
294 <div class="memproto">
295 <table class="mlabels">
296   <tr>
297   <td class="mlabels-left">
298       <table class="memname">
299         <tr>
300           <td class="memname">static uint16_t adc_fifo_get_blocking </td>
301           <td>(</td>
302           <td class="paramtype">void&#160;</td>
303           <td class="paramname"></td><td>)</td>
304           <td></td>
305         </tr>
306       </table>
307   </td>
308   <td class="mlabels-right">
309 <span class="mlabels"><span class="mlabel">inline</span><span class="mlabel">static</span></span>  </td>
310   </tr>
311 </table>
312 </div><div class="memdoc">
313
314 <p>Wait for the ADC FIFO to have data. </p>
315 <p >Blocks until data is present in the FIFO </p>
316
317 </div>
318 </div>
319 <a id="gafa9793deea59c5cbfea147e0e9d895c3" name="gafa9793deea59c5cbfea147e0e9d895c3"></a>
320 <h2 class="memtitle"><span class="permalink"><a href="#gafa9793deea59c5cbfea147e0e9d895c3">&#9670;&nbsp;</a></span>adc_fifo_get_level()</h2>
321
322 <div class="memitem">
323 <div class="memproto">
324 <table class="mlabels">
325   <tr>
326   <td class="mlabels-left">
327       <table class="memname">
328         <tr>
329           <td class="memname">static uint8_t adc_fifo_get_level </td>
330           <td>(</td>
331           <td class="paramtype">void&#160;</td>
332           <td class="paramname"></td><td>)</td>
333           <td></td>
334         </tr>
335       </table>
336   </td>
337   <td class="mlabels-right">
338 <span class="mlabels"><span class="mlabel">inline</span><span class="mlabel">static</span></span>  </td>
339   </tr>
340 </table>
341 </div><div class="memdoc">
342
343 <p>Get number of entries in the ADC FIFO. </p>
344 <p >On RP2040 the FIFO is 4 samples long.   On RP2350 the FIFO is 8 samples long. </p>
345 <p >This function will return how many samples are currently present. </p>
346
347 </div>
348 </div>
349 <a id="gafdfd586e6c26ffe4759afaa3c3f95465" name="gafdfd586e6c26ffe4759afaa3c3f95465"></a>
350 <h2 class="memtitle"><span class="permalink"><a href="#gafdfd586e6c26ffe4759afaa3c3f95465">&#9670;&nbsp;</a></span>adc_fifo_is_empty()</h2>
351
352 <div class="memitem">
353 <div class="memproto">
354 <table class="mlabels">
355   <tr>
356   <td class="mlabels-left">
357       <table class="memname">
358         <tr>
359           <td class="memname">static bool adc_fifo_is_empty </td>
360           <td>(</td>
361           <td class="paramtype">void&#160;</td>
362           <td class="paramname"></td><td>)</td>
363           <td></td>
364         </tr>
365       </table>
366   </td>
367   <td class="mlabels-right">
368 <span class="mlabels"><span class="mlabel">inline</span><span class="mlabel">static</span></span>  </td>
369   </tr>
370 </table>
371 </div><div class="memdoc">
372
373 <p>Check FIFO empty state. </p>
374 <dl class="section return"><dt>Returns</dt><dd>Returns true if the FIFO is empty </dd></dl>
375
376 </div>
377 </div>
378 <a id="ga2a6fa32da04e65a027e14deaf32b8f10" name="ga2a6fa32da04e65a027e14deaf32b8f10"></a>
379 <h2 class="memtitle"><span class="permalink"><a href="#ga2a6fa32da04e65a027e14deaf32b8f10">&#9670;&nbsp;</a></span>adc_fifo_setup()</h2>
380
381 <div class="memitem">
382 <div class="memproto">
383 <table class="mlabels">
384   <tr>
385   <td class="mlabels-left">
386       <table class="memname">
387         <tr>
388           <td class="memname">static void adc_fifo_setup </td>
389           <td>(</td>
390           <td class="paramtype">bool&#160;</td>
391           <td class="paramname"><em>en</em>, </td>
392         </tr>
393         <tr>
394           <td class="paramkey"></td>
395           <td></td>
396           <td class="paramtype">bool&#160;</td>
397           <td class="paramname"><em>dreq_en</em>, </td>
398         </tr>
399         <tr>
400           <td class="paramkey"></td>
401           <td></td>
402           <td class="paramtype">uint16_t&#160;</td>
403           <td class="paramname"><em>dreq_thresh</em>, </td>
404         </tr>
405         <tr>
406           <td class="paramkey"></td>
407           <td></td>
408           <td class="paramtype">bool&#160;</td>
409           <td class="paramname"><em>err_in_fifo</em>, </td>
410         </tr>
411         <tr>
412           <td class="paramkey"></td>
413           <td></td>
414           <td class="paramtype">bool&#160;</td>
415           <td class="paramname"><em>byte_shift</em>&#160;</td>
416         </tr>
417         <tr>
418           <td></td>
419           <td>)</td>
420           <td></td><td></td>
421         </tr>
422       </table>
423   </td>
424   <td class="mlabels-right">
425 <span class="mlabels"><span class="mlabel">inline</span><span class="mlabel">static</span></span>  </td>
426   </tr>
427 </table>
428 </div><div class="memdoc">
429
430 <p>Setup the ADC FIFO. </p>
431 <p >On RP2040 the FIFO is 4 samples long. </p>
432 <p >On RP2350 the FIFO is 8 samples long. </p>
433 <p >If a conversion is completed and the FIFO is full, the result is dropped.</p>
434 <dl class="params"><dt>Parameters</dt><dd>
435   <table class="params">
436     <tr><td class="paramname">en</td><td>Enables write each conversion result to the FIFO </td></tr>
437     <tr><td class="paramname">dreq_en</td><td>Enable DMA requests when FIFO contains data </td></tr>
438     <tr><td class="paramname">dreq_thresh</td><td>Threshold for DMA requests/FIFO IRQ if enabled. </td></tr>
439     <tr><td class="paramname">err_in_fifo</td><td>If enabled, bit 15 of the FIFO contains error flag for each sample </td></tr>
440     <tr><td class="paramname">byte_shift</td><td>Shift FIFO contents to be one byte in size (for byte DMA) - enables DMA to byte buffers. </td></tr>
441   </table>
442   </dd>
443 </dl>
444
445 </div>
446 </div>
447 <a id="ga84b5f9054de9c00d51095c9bdefb2dca" name="ga84b5f9054de9c00d51095c9bdefb2dca"></a>
448 <h2 class="memtitle"><span class="permalink"><a href="#ga84b5f9054de9c00d51095c9bdefb2dca">&#9670;&nbsp;</a></span>adc_get_selected_input()</h2>
449
450 <div class="memitem">
451 <div class="memproto">
452 <table class="mlabels">
453   <tr>
454   <td class="mlabels-left">
455       <table class="memname">
456         <tr>
457           <td class="memname">static uint adc_get_selected_input </td>
458           <td>(</td>
459           <td class="paramtype">void&#160;</td>
460           <td class="paramname"></td><td>)</td>
461           <td></td>
462         </tr>
463       </table>
464   </td>
465   <td class="mlabels-right">
466 <span class="mlabels"><span class="mlabel">inline</span><span class="mlabel">static</span></span>  </td>
467   </tr>
468 </table>
469 </div><div class="memdoc">
470
471 <p>Get the currently selected ADC input channel. </p>
472 <dl class="section return"><dt>Returns</dt><dd>The currently selected input channel.</dd></dl>
473 <p>On RP02040 0...3 are GPIOs 26...29 respectively. Input 4 is the onboard temperature sensor. </p>
474 <p >On RP2350A 0...3 are GPIOs 26...29 respectively. Input 4 is the onboard temperature sensor. On RP2350B 0...7 are GPIOs 40...47 respectively. Input 8 is the onboard temperature sensor.  </p>
475
476 </div>
477 </div>
478 <a id="gab15d6e804715935b4e9b5027a2940910" name="gab15d6e804715935b4e9b5027a2940910"></a>
479 <h2 class="memtitle"><span class="permalink"><a href="#gab15d6e804715935b4e9b5027a2940910">&#9670;&nbsp;</a></span>adc_gpio_init()</h2>
480
481 <div class="memitem">
482 <div class="memproto">
483 <table class="mlabels">
484   <tr>
485   <td class="mlabels-left">
486       <table class="memname">
487         <tr>
488           <td class="memname">static void adc_gpio_init </td>
489           <td>(</td>
490           <td class="paramtype">uint&#160;</td>
491           <td class="paramname"><em>gpio</em></td><td>)</td>
492           <td></td>
493         </tr>
494       </table>
495   </td>
496   <td class="mlabels-right">
497 <span class="mlabels"><span class="mlabel">inline</span><span class="mlabel">static</span></span>  </td>
498   </tr>
499 </table>
500 </div><div class="memdoc">
501
502 <p>Initialise the gpio for use as an ADC pin. </p>
503 <p >Prepare a GPIO for use with ADC by disabling all digital functions.</p>
504 <dl class="params"><dt>Parameters</dt><dd>
505   <table class="params">
506     <tr><td class="paramname">gpio</td><td>The GPIO number to use. Allowable GPIO numbers are 26 to 29 inclusive on RP2040 or RP2350A, 40-48 inclusive on RP2350B </td></tr>
507   </table>
508   </dd>
509 </dl>
510
511 </div>
512 </div>
513 <a id="gaf8e363e63f40e00c169f7355c9668681" name="gaf8e363e63f40e00c169f7355c9668681"></a>
514 <h2 class="memtitle"><span class="permalink"><a href="#gaf8e363e63f40e00c169f7355c9668681">&#9670;&nbsp;</a></span>adc_irq_set_enabled()</h2>
515
516 <div class="memitem">
517 <div class="memproto">
518 <table class="mlabels">
519   <tr>
520   <td class="mlabels-left">
521       <table class="memname">
522         <tr>
523           <td class="memname">static void adc_irq_set_enabled </td>
524           <td>(</td>
525           <td class="paramtype">bool&#160;</td>
526           <td class="paramname"><em>enabled</em></td><td>)</td>
527           <td></td>
528         </tr>
529       </table>
530   </td>
531   <td class="mlabels-right">
532 <span class="mlabels"><span class="mlabel">inline</span><span class="mlabel">static</span></span>  </td>
533   </tr>
534 </table>
535 </div><div class="memdoc">
536
537 <p>Enable/Disable ADC interrupts. </p>
538 <dl class="params"><dt>Parameters</dt><dd>
539   <table class="params">
540     <tr><td class="paramname">enabled</td><td>Set to true to enable the ADC interrupts, false to disable </td></tr>
541   </table>
542   </dd>
543 </dl>
544
545 </div>
546 </div>
547 <a id="gaf32d82a43103e6672048001f58d5f6fb" name="gaf32d82a43103e6672048001f58d5f6fb"></a>
548 <h2 class="memtitle"><span class="permalink"><a href="#gaf32d82a43103e6672048001f58d5f6fb">&#9670;&nbsp;</a></span>adc_read()</h2>
549
550 <div class="memitem">
551 <div class="memproto">
552 <table class="mlabels">
553   <tr>
554   <td class="mlabels-left">
555       <table class="memname">
556         <tr>
557           <td class="memname">static uint16_t adc_read </td>
558           <td>(</td>
559           <td class="paramtype">void&#160;</td>
560           <td class="paramname"></td><td>)</td>
561           <td></td>
562         </tr>
563       </table>
564   </td>
565   <td class="mlabels-right">
566 <span class="mlabels"><span class="mlabel">inline</span><span class="mlabel">static</span></span>  </td>
567   </tr>
568 </table>
569 </div><div class="memdoc">
570
571 <p>Perform a single conversion. </p>
572 <p >Performs an ADC conversion, waits for the result, and then returns it.</p>
573 <dl class="section return"><dt>Returns</dt><dd>Result of the conversion. </dd></dl>
574
575 </div>
576 </div>
577 <a id="ga5d50a24eb26da7fbc6ee9bc76723b09c" name="ga5d50a24eb26da7fbc6ee9bc76723b09c"></a>
578 <h2 class="memtitle"><span class="permalink"><a href="#ga5d50a24eb26da7fbc6ee9bc76723b09c">&#9670;&nbsp;</a></span>adc_run()</h2>
579
580 <div class="memitem">
581 <div class="memproto">
582 <table class="mlabels">
583   <tr>
584   <td class="mlabels-left">
585       <table class="memname">
586         <tr>
587           <td class="memname">static void adc_run </td>
588           <td>(</td>
589           <td class="paramtype">bool&#160;</td>
590           <td class="paramname"><em>run</em></td><td>)</td>
591           <td></td>
592         </tr>
593       </table>
594   </td>
595   <td class="mlabels-right">
596 <span class="mlabels"><span class="mlabel">inline</span><span class="mlabel">static</span></span>  </td>
597   </tr>
598 </table>
599 </div><div class="memdoc">
600
601 <p>Enable or disable free-running sampling mode. </p>
602 <dl class="params"><dt>Parameters</dt><dd>
603   <table class="params">
604     <tr><td class="paramname">run</td><td>false to disable, true to enable free running conversion mode. </td></tr>
605   </table>
606   </dd>
607 </dl>
608
609 </div>
610 </div>
611 <a id="ga5d3b8875947df2f4ba022cb6aa40594b" name="ga5d3b8875947df2f4ba022cb6aa40594b"></a>
612 <h2 class="memtitle"><span class="permalink"><a href="#ga5d3b8875947df2f4ba022cb6aa40594b">&#9670;&nbsp;</a></span>adc_select_input()</h2>
613
614 <div class="memitem">
615 <div class="memproto">
616 <table class="mlabels">
617   <tr>
618   <td class="mlabels-left">
619       <table class="memname">
620         <tr>
621           <td class="memname">static void adc_select_input </td>
622           <td>(</td>
623           <td class="paramtype">uint&#160;</td>
624           <td class="paramname"><em>input</em></td><td>)</td>
625           <td></td>
626         </tr>
627       </table>
628   </td>
629   <td class="mlabels-right">
630 <span class="mlabels"><span class="mlabel">inline</span><span class="mlabel">static</span></span>  </td>
631   </tr>
632 </table>
633 </div><div class="memdoc">
634
635 <p>ADC input select. </p>
636 <p >Select an ADC input  On RP02040 0...3 are GPIOs 26...29 respectively. Input 4 is the onboard temperature sensor.   On RP2350A 0...3 are GPIOs 26...29 respectively. Input 4 is the onboard temperature sensor. On RP2350B 0...7 are GPIOs 40...47 respectively. Input 8 is the onboard temperature sensor. </p>
637 <dl class="params"><dt>Parameters</dt><dd>
638   <table class="params">
639     <tr><td class="paramname">input</td><td>Input to select. </td></tr>
640   </table>
641   </dd>
642 </dl>
643
644 </div>
645 </div>
646 <a id="ga333f7ca46a11241d96d0a4c24f0d4bb0" name="ga333f7ca46a11241d96d0a4c24f0d4bb0"></a>
647 <h2 class="memtitle"><span class="permalink"><a href="#ga333f7ca46a11241d96d0a4c24f0d4bb0">&#9670;&nbsp;</a></span>adc_set_clkdiv()</h2>
648
649 <div class="memitem">
650 <div class="memproto">
651 <table class="mlabels">
652   <tr>
653   <td class="mlabels-left">
654       <table class="memname">
655         <tr>
656           <td class="memname">static void adc_set_clkdiv </td>
657           <td>(</td>
658           <td class="paramtype">float&#160;</td>
659           <td class="paramname"><em>clkdiv</em></td><td>)</td>
660           <td></td>
661         </tr>
662       </table>
663   </td>
664   <td class="mlabels-right">
665 <span class="mlabels"><span class="mlabel">inline</span><span class="mlabel">static</span></span>  </td>
666   </tr>
667 </table>
668 </div><div class="memdoc">
669
670 <p>Set the ADC Clock divisor. </p>
671 <p >Period of samples will be (1 + div) cycles on average. Note it takes 96 cycles to perform a conversion, so any period less than that will be clamped to 96.</p>
672 <dl class="params"><dt>Parameters</dt><dd>
673   <table class="params">
674     <tr><td class="paramname">clkdiv</td><td>If non-zero, conversion will be started at intervals rather than back to back. </td></tr>
675   </table>
676   </dd>
677 </dl>
678
679 </div>
680 </div>
681 <a id="ga16d25be75e16f0671d3e3185b0b59771" name="ga16d25be75e16f0671d3e3185b0b59771"></a>
682 <h2 class="memtitle"><span class="permalink"><a href="#ga16d25be75e16f0671d3e3185b0b59771">&#9670;&nbsp;</a></span>adc_set_round_robin()</h2>
683
684 <div class="memitem">
685 <div class="memproto">
686 <table class="mlabels">
687   <tr>
688   <td class="mlabels-left">
689       <table class="memname">
690         <tr>
691           <td class="memname">static void adc_set_round_robin </td>
692           <td>(</td>
693           <td class="paramtype">uint&#160;</td>
694           <td class="paramname"><em>input_mask</em></td><td>)</td>
695           <td></td>
696         </tr>
697       </table>
698   </td>
699   <td class="mlabels-right">
700 <span class="mlabels"><span class="mlabel">inline</span><span class="mlabel">static</span></span>  </td>
701   </tr>
702 </table>
703 </div><div class="memdoc">
704
705 <p>Round Robin sampling selector. </p>
706 <p >This function sets which inputs are to be run through in round robin mode. RP2040, RP2350 QFN-60: Value between 0 and 0x1f (bit 0 to bit 4 for GPIO 26 to 29 and temperature sensor input respectively) RP2350 QFN-80: Value between 0 and 0xff (bit 0 to bit 7 for GPIO 40 to 47 and temperature sensor input respectively)</p>
707 <dl class="params"><dt>Parameters</dt><dd>
708   <table class="params">
709     <tr><td class="paramname">input_mask</td><td>A bit pattern indicating which of the 5/8 inputs are to be sampled. Write a value of 0 to disable round robin sampling. </td></tr>
710   </table>
711   </dd>
712 </dl>
713
714 </div>
715 </div>
716 <a id="ga33f302059e05899d1709d6268d75972b" name="ga33f302059e05899d1709d6268d75972b"></a>
717 <h2 class="memtitle"><span class="permalink"><a href="#ga33f302059e05899d1709d6268d75972b">&#9670;&nbsp;</a></span>adc_set_temp_sensor_enabled()</h2>
718
719 <div class="memitem">
720 <div class="memproto">
721 <table class="mlabels">
722   <tr>
723   <td class="mlabels-left">
724       <table class="memname">
725         <tr>
726           <td class="memname">static void adc_set_temp_sensor_enabled </td>
727           <td>(</td>
728           <td class="paramtype">bool&#160;</td>
729           <td class="paramname"><em>enable</em></td><td>)</td>
730           <td></td>
731         </tr>
732       </table>
733   </td>
734   <td class="mlabels-right">
735 <span class="mlabels"><span class="mlabel">inline</span><span class="mlabel">static</span></span>  </td>
736   </tr>
737 </table>
738 </div><div class="memdoc">
739
740 <p>Enable the onboard temperature sensor. </p>
741 <dl class="params"><dt>Parameters</dt><dd>
742   <table class="params">
743     <tr><td class="paramname">enable</td><td>Set true to power on the onboard temperature sensor, false to power off. </td></tr>
744   </table>
745   </dd>
746 </dl>
747
748 </div>
749 </div>
750 </div><!-- contents -->
751 </div><!-- doc-content -->
752
753         <script src="main.js"></script>
754 </body>
755 </html>
This page took 0.074461 seconds and 4 git commands to generate.