<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" version="2.0">
  <channel>
    <title>LPC MicrocontrollersのトピックLink2 software, how to modify hsadc code?</title>
    <link>https://community.nxp.com/t5/LPC-Microcontrollers/Link2-software-how-to-modify-hsadc-code/m-p/1172636#M42689</link>
    <description>&lt;P&gt;Hi NXP community,&lt;/P&gt;&lt;P&gt;I am new to programming in C for microcontrollers and would appreciate some advice on how I should modify some existing HSADC code.&lt;/P&gt;&lt;P&gt;I have a project which requires me to,&lt;/P&gt;&lt;P&gt;1. Sample at 40 Msps for small chunks of time (~0.2 ms) using the HSADC on the link2 development board (which has an LPC4370 microcontroller)&lt;/P&gt;&lt;P&gt;2. Process the data using FFT (and eventually adding some windowing and averaging)&lt;/P&gt;&lt;P&gt;3. Send the data to a computer via USB.&lt;/P&gt;&lt;P&gt;I am trying to modify the code shown below, which is the example hsadc code that comes as part of the MCUXpressoIDE.&amp;nbsp;I am in the process of selecting the correct DSP function for the FFT from the CMSIS DSP library but am unsure on how to correctly integrate it into the code below. Any advice on the issues I may face with this method would be greatly appreciated.&amp;nbsp;&lt;/P&gt;&lt;P&gt;Thanks!&lt;/P&gt;&lt;P&gt;/*&lt;/P&gt;&lt;P&gt;&lt;SPAN class="Apple-converted-space"&gt;&amp;nbsp;&lt;/SPAN&gt;* @brief High speed ADC example&lt;/P&gt;&lt;P&gt;&lt;SPAN class="Apple-converted-space"&gt;&amp;nbsp;&lt;/SPAN&gt;*&lt;/P&gt;&lt;P&gt;&lt;SPAN class="Apple-converted-space"&gt;&amp;nbsp;&lt;/SPAN&gt;* @note&lt;/P&gt;&lt;P&gt;&lt;SPAN class="Apple-converted-space"&gt;&amp;nbsp;&lt;/SPAN&gt;* Copyright(C) NXP Semiconductors, 2013&lt;/P&gt;&lt;P&gt;&lt;SPAN class="Apple-converted-space"&gt;&amp;nbsp;&lt;/SPAN&gt;* All rights reserved.&lt;/P&gt;&lt;P&gt;&lt;SPAN class="Apple-converted-space"&gt;&amp;nbsp;&lt;/SPAN&gt;*&lt;/P&gt;&lt;P&gt;&lt;SPAN class="Apple-converted-space"&gt;&amp;nbsp;&lt;/SPAN&gt;* @par&lt;/P&gt;&lt;P&gt;&lt;SPAN class="Apple-converted-space"&gt;&amp;nbsp;&lt;/SPAN&gt;* Software that is described herein is for illustrative purposes only&lt;/P&gt;&lt;P&gt;&lt;SPAN class="Apple-converted-space"&gt;&amp;nbsp;&lt;/SPAN&gt;* which provides customers with programming information regarding the&lt;/P&gt;&lt;P&gt;&lt;SPAN class="Apple-converted-space"&gt;&amp;nbsp;&lt;/SPAN&gt;* LPC products.&lt;SPAN class="Apple-converted-space"&gt;&amp;nbsp; &lt;/SPAN&gt;This software is supplied "AS IS" without any warranties of&lt;/P&gt;&lt;P&gt;&lt;SPAN class="Apple-converted-space"&gt;&amp;nbsp;&lt;/SPAN&gt;* any kind, and NXP Semiconductors and its &lt;SPAN&gt;licensor&lt;/SPAN&gt; disclaim any and&lt;/P&gt;&lt;P&gt;&lt;SPAN class="Apple-converted-space"&gt;&amp;nbsp;&lt;/SPAN&gt;* all warranties, express or implied, including all implied warranties of&lt;/P&gt;&lt;P&gt;&lt;SPAN class="Apple-converted-space"&gt;&amp;nbsp;&lt;/SPAN&gt;* &lt;SPAN&gt;merchantability&lt;/SPAN&gt;, fitness for a particular purpose and non-infringement of&lt;/P&gt;&lt;P&gt;&lt;SPAN class="Apple-converted-space"&gt;&amp;nbsp;&lt;/SPAN&gt;* intellectual property rights.&lt;SPAN class="Apple-converted-space"&gt;&amp;nbsp; &lt;/SPAN&gt;NXP Semiconductors assumes no responsibility&lt;/P&gt;&lt;P&gt;&lt;SPAN class="Apple-converted-space"&gt;&amp;nbsp;&lt;/SPAN&gt;* or liability for the use of the software, conveys no license or rights under any&lt;/P&gt;&lt;P&gt;&lt;SPAN class="Apple-converted-space"&gt;&amp;nbsp;&lt;/SPAN&gt;* patent, copyright, mask work right, or any other intellectual property rights in&lt;/P&gt;&lt;P&gt;&lt;SPAN class="Apple-converted-space"&gt;&amp;nbsp;&lt;/SPAN&gt;* or to any products. NXP Semiconductors reserves the right to make changes&lt;/P&gt;&lt;P&gt;&lt;SPAN class="Apple-converted-space"&gt;&amp;nbsp;&lt;/SPAN&gt;* in the software without notification. NXP Semiconductors also makes no&lt;/P&gt;&lt;P&gt;&lt;SPAN class="Apple-converted-space"&gt;&amp;nbsp;&lt;/SPAN&gt;* representation or warranty that such application will be suitable for the&lt;/P&gt;&lt;P&gt;&lt;SPAN class="Apple-converted-space"&gt;&amp;nbsp;&lt;/SPAN&gt;* specified use without further testing or modification.&lt;/P&gt;&lt;P&gt;&lt;SPAN class="Apple-converted-space"&gt;&amp;nbsp;&lt;/SPAN&gt;*&lt;/P&gt;&lt;P&gt;&lt;SPAN class="Apple-converted-space"&gt;&amp;nbsp;&lt;/SPAN&gt;* @par&lt;/P&gt;&lt;P&gt;&lt;SPAN class="Apple-converted-space"&gt;&amp;nbsp;&lt;/SPAN&gt;* Permission to use, copy, modify, and distribute this software and its&lt;/P&gt;&lt;P&gt;&lt;SPAN class="Apple-converted-space"&gt;&amp;nbsp;&lt;/SPAN&gt;* documentation is hereby granted, under NXP Semiconductors' and its&lt;/P&gt;&lt;P&gt;&lt;SPAN class="Apple-converted-space"&gt;&amp;nbsp;&lt;/SPAN&gt;* licensor's relevant copyrights in the software, without fee, provided that it&lt;/P&gt;&lt;P&gt;&lt;SPAN class="Apple-converted-space"&gt;&amp;nbsp;&lt;/SPAN&gt;* is used in conjunction with NXP Semiconductors &lt;SPAN&gt;microcontrollers&lt;/SPAN&gt;.&lt;SPAN class="Apple-converted-space"&gt;&amp;nbsp; &lt;/SPAN&gt;This&lt;/P&gt;&lt;P&gt;&lt;SPAN class="Apple-converted-space"&gt;&amp;nbsp;&lt;/SPAN&gt;* copyright, permission, and disclaimer notice must appear in all copies of&lt;/P&gt;&lt;P&gt;&lt;SPAN class="Apple-converted-space"&gt;&amp;nbsp;&lt;/SPAN&gt;* this code.&lt;/P&gt;&lt;P&gt;&lt;SPAN class="Apple-converted-space"&gt;&amp;nbsp;&lt;/SPAN&gt;*/&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;&lt;STRONG&gt;#include&lt;/STRONG&gt;&lt;/SPAN&gt; "board.h"&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;&lt;STRONG&gt;#include&lt;/STRONG&gt;&lt;/SPAN&gt; &amp;lt;stdio.h&amp;gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;/*****************************************************************************&lt;/P&gt;&lt;P&gt;&lt;SPAN class="Apple-converted-space"&gt;&amp;nbsp;&lt;/SPAN&gt;* Private types/enumerations/variables&lt;/P&gt;&lt;P&gt;&lt;SPAN class="Apple-converted-space"&gt;&amp;nbsp;&lt;/SPAN&gt;****************************************************************************/&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;/* The default example uses DMA. To use the example in an &lt;SPAN&gt;interrutp&lt;/SPAN&gt; based&lt;/P&gt;&lt;P&gt;&lt;SPAN class="Apple-converted-space"&gt;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;configuration, enable the following definition. */&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;&lt;STRONG&gt;#define&lt;/STRONG&gt;&lt;/SPAN&gt; USE_INTERRUPT_MODE&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;/* HSADC clock rate used for sampling */&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;&lt;STRONG&gt;#define&lt;/STRONG&gt;&lt;/SPAN&gt; HSADC_CLOCK_RATE (80 * 1000000)&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;/* Base clock lookup table used for finding best HSADC clock rate. Only the&lt;/P&gt;&lt;P&gt;&lt;SPAN class="Apple-converted-space"&gt;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;base clock sources in this table are used as a possible source for the&lt;/P&gt;&lt;P&gt;&lt;SPAN class="Apple-converted-space"&gt;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;HSASC peripheral clock before being divided. Add or remove sources as&lt;/P&gt;&lt;P&gt;&lt;SPAN class="Apple-converted-space"&gt;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;needed, but an exact frequency may not be available unless it's set up&lt;/P&gt;&lt;P&gt;&lt;SPAN class="Apple-converted-space"&gt;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;on an unused PLL or clock input. */&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;&lt;STRONG&gt;static&lt;/STRONG&gt;&lt;/SPAN&gt; &lt;SPAN&gt;&lt;STRONG&gt;const&lt;/STRONG&gt;&lt;/SPAN&gt; &lt;SPAN&gt;CHIP_CGU_CLKIN_T&lt;/SPAN&gt; adcBaseClkSources[] = {&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;&lt;I&gt;CLKIN_IRC&lt;/I&gt;&lt;/SPAN&gt;&lt;SPAN&gt;, &lt;/SPAN&gt;/* Usually 12MHz */&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;&lt;I&gt;CLKIN_CLKIN&lt;/I&gt;&lt;/SPAN&gt;&lt;SPAN&gt;, &lt;/SPAN&gt;/* External clock in rate */&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;&lt;I&gt;CLKIN_CRYSTAL&lt;/I&gt;&lt;/SPAN&gt;&lt;SPAN&gt;, &lt;/SPAN&gt;/* Usually 12MHz */&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;&lt;I&gt;CLKIN_AUDIOPLL&lt;/I&gt;&lt;/SPAN&gt;&lt;SPAN&gt;, &lt;/SPAN&gt;/* Unknown, will be 0 if not configured */&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;&lt;I&gt;CLKIN_MAINPLL&lt;/I&gt;&lt;/SPAN&gt; /* Usually 204MHz, may be too fast to use with a divider */&lt;/P&gt;&lt;P&gt;};&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;/* Periodic sample rate in Hz */&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;&lt;STRONG&gt;#define&lt;/STRONG&gt;&lt;/SPAN&gt; SAMPLERATE (5)&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;/*****************************************************************************&lt;/P&gt;&lt;P&gt;&lt;SPAN class="Apple-converted-space"&gt;&amp;nbsp;&lt;/SPAN&gt;* Public types/enumerations/variables&lt;/P&gt;&lt;P&gt;&lt;SPAN class="Apple-converted-space"&gt;&amp;nbsp;&lt;/SPAN&gt;****************************************************************************/&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;/* Last saved ADC sample for each input */&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;&lt;STRONG&gt;volatile&lt;/STRONG&gt;&lt;/SPAN&gt; &lt;SPAN&gt;uint32_t&lt;/SPAN&gt; lastSample[6];&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;/*****************************************************************************&lt;/P&gt;&lt;P&gt;&lt;SPAN class="Apple-converted-space"&gt;&amp;nbsp;&lt;/SPAN&gt;* Private functions&lt;/P&gt;&lt;P&gt;&lt;SPAN class="Apple-converted-space"&gt;&amp;nbsp;&lt;/SPAN&gt;****************************************************************************/&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;/* Returns a computed clock rate based on input clock and divider&lt;/P&gt;&lt;P&gt;&lt;SPAN class="Apple-converted-space"&gt;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;selection */&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;&lt;STRONG&gt;static&lt;/STRONG&gt;&lt;/SPAN&gt; &lt;SPAN&gt;uint32_t&lt;/SPAN&gt; &lt;STRONG&gt;getClockRate&lt;/STRONG&gt;(&lt;SPAN&gt;&lt;STRONG&gt;int&lt;/STRONG&gt;&lt;/SPAN&gt; clkIndex, &lt;SPAN&gt;uint32_t&lt;/SPAN&gt; maxCGU)&lt;/P&gt;&lt;P&gt;{&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;uint32_t&lt;/SPAN&gt; clkRate;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;clkRate = Chip_Clock_GetClockInputHz(adcBaseClkSources[clkIndex]);&lt;/P&gt;&lt;P&gt;clkRate = clkRate / maxCGU;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;&lt;STRONG&gt;return&lt;/STRONG&gt;&lt;/SPAN&gt; clkRate;&lt;/P&gt;&lt;P&gt;}&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;/* Clock setup function for generating approximate HSADC clock. Trim this&lt;/P&gt;&lt;P&gt;&lt;SPAN class="Apple-converted-space"&gt;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;example function as needed to get the size down in a production system. */&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;&lt;STRONG&gt;static&lt;/STRONG&gt;&lt;/SPAN&gt; &lt;SPAN&gt;&lt;STRONG&gt;void&lt;/STRONG&gt;&lt;/SPAN&gt; &lt;STRONG&gt;setupClock&lt;/STRONG&gt;(&lt;SPAN&gt;uint32_t&lt;/SPAN&gt; rate)&lt;/P&gt;&lt;P&gt;{&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;CHIP_CGU_IDIV_T&lt;/SPAN&gt; freeDivider, bestDivider;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;CHIP_CGU_CLKIN_T&lt;/SPAN&gt; divider, mappedCGUDuv, savedClkIn;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;uint32_t&lt;/SPAN&gt; bestRate, testRate, maxCGU, savedMaxCGU;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;uint32_t&lt;/SPAN&gt; maxCGUDiv;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;&lt;STRONG&gt;int&lt;/STRONG&gt;&lt;/SPAN&gt; clkIndex;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;/* The HSADC clock (sample) rate is derived from the HSADC base clock&lt;/P&gt;&lt;P&gt;&lt;SPAN class="Apple-converted-space"&gt;&amp;nbsp; &lt;/SPAN&gt;divided by the HSADC clock divider (only 1 or 2). The HSADC base&lt;/P&gt;&lt;P&gt;&lt;SPAN class="Apple-converted-space"&gt;&amp;nbsp; &lt;/SPAN&gt;clock can be selected from a number of internal clock sources such&lt;/P&gt;&lt;P&gt;&lt;SPAN class="Apple-converted-space"&gt;&amp;nbsp; &lt;/SPAN&gt;as the main PLL1, audio PLL, external crystal rate, IRC, RTC, or a&lt;/P&gt;&lt;P&gt;&lt;SPAN class="Apple-converted-space"&gt;&amp;nbsp; &lt;/SPAN&gt;CGU divider. Unless a PLL is setup for the exact rate desired, a&lt;/P&gt;&lt;P&gt;&lt;SPAN class="Apple-converted-space"&gt;&amp;nbsp; &lt;/SPAN&gt;rate close to the target rate may be the closest approximation. */&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;/* Determine if there are any free dividers in the CGU. Assumes an&lt;/P&gt;&lt;P&gt;&lt;SPAN class="Apple-converted-space"&gt;&amp;nbsp; &lt;/SPAN&gt;unused divider is attached to CLOCKINPUT_PD. Divider A can only&lt;/P&gt;&lt;P&gt;&lt;SPAN class="Apple-converted-space"&gt;&amp;nbsp; &lt;/SPAN&gt;divide 1-4, B/C/D can divide 1-16, E can divider 1-256. */&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;freeDivider = &lt;/SPAN&gt;&lt;SPAN&gt;&lt;I&gt;CLK_IDIV_A&lt;/I&gt;&lt;/SPAN&gt;&lt;SPAN&gt;; &lt;/SPAN&gt;/* Dividers only */&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;divider = &lt;/SPAN&gt;&lt;SPAN&gt;&lt;I&gt;CLKIN_IDIVA&lt;/I&gt;&lt;/SPAN&gt;&lt;SPAN&gt;; &lt;/SPAN&gt;/* CGU clock input sources */&lt;/P&gt;&lt;P&gt;bestDivider = &lt;SPAN&gt;&lt;I&gt;CLK_IDIV_LAST&lt;/I&gt;&lt;/SPAN&gt;;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;&lt;STRONG&gt;while&lt;/STRONG&gt;&lt;/SPAN&gt; (freeDivider &amp;lt; &lt;SPAN&gt;&lt;I&gt;CLK_IDIV_LAST&lt;/I&gt;&lt;/SPAN&gt;) {&lt;/P&gt;&lt;P&gt;CHIP_CGU_CLKIN_T&lt;SPAN&gt; clkIn;&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;/* A CGUI divider that is pulled on input down is free */&lt;/P&gt;&lt;P&gt;clkIn = Chip_Clock_GetDividerSource(freeDivider);&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;&lt;STRONG&gt;if&lt;/STRONG&gt;&lt;/SPAN&gt; (clkIn == &lt;SPAN&gt;&lt;I&gt;CLKINPUT_PD&lt;/I&gt;&lt;/SPAN&gt;) {&lt;/P&gt;&lt;P&gt;/* Save available divider and mapped CGU clock divider source */&lt;/P&gt;&lt;P&gt;bestDivider = freeDivider;&lt;/P&gt;&lt;P&gt;mappedCGUDuv = divider;&lt;/P&gt;&lt;P&gt;}&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;/* Try next divider */&lt;/P&gt;&lt;P&gt;freeDivider++;&lt;/P&gt;&lt;P&gt;divider++;&lt;/P&gt;&lt;P&gt;}&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;/* Determine maximum divider value per CGU divider */&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;&lt;STRONG&gt;if&lt;/STRONG&gt;&lt;/SPAN&gt; (bestDivider != &lt;SPAN&gt;&lt;I&gt;CLK_IDIV_LAST&lt;/I&gt;&lt;/SPAN&gt;) {&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;&lt;STRONG&gt;if&lt;/STRONG&gt;&lt;/SPAN&gt; (bestDivider == &lt;SPAN&gt;&lt;I&gt;CLK_IDIV_A&lt;/I&gt;&lt;/SPAN&gt;) {&lt;/P&gt;&lt;P&gt;maxCGUDiv = 4;&lt;/P&gt;&lt;P&gt;}&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;&lt;STRONG&gt;else&lt;/STRONG&gt;&lt;/SPAN&gt; &lt;SPAN&gt;&lt;STRONG&gt;if&lt;/STRONG&gt;&lt;/SPAN&gt; ((bestDivider &amp;gt;= &lt;SPAN&gt;&lt;I&gt;CLK_IDIV_B&lt;/I&gt;&lt;/SPAN&gt;) &amp;amp;&amp;amp; (bestDivider &amp;lt;= &lt;SPAN&gt;&lt;I&gt;CLK_IDIV_D&lt;/I&gt;&lt;/SPAN&gt;)) {&lt;/P&gt;&lt;P&gt;maxCGUDiv = 16;&lt;/P&gt;&lt;P&gt;}&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;&lt;STRONG&gt;else&lt;/STRONG&gt;&lt;/SPAN&gt; {&lt;/P&gt;&lt;P&gt;maxCGUDiv = 256;&lt;/P&gt;&lt;P&gt;}&lt;/P&gt;&lt;P&gt;}&lt;/P&gt;&lt;P&gt;&lt;STRONG&gt;else&lt;/STRONG&gt;&lt;SPAN&gt; {&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;/* No CGU divider available */&lt;/P&gt;&lt;P&gt;maxCGUDiv = 1;&lt;/P&gt;&lt;P&gt;}&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;/* Using the best available maximum CGU and CCU dividers, attempt to&lt;/P&gt;&lt;P&gt;&lt;SPAN class="Apple-converted-space"&gt;&amp;nbsp; &lt;/SPAN&gt;find a base clock rate that will get as close as possible to the&lt;/P&gt;&lt;P&gt;&lt;SPAN class="Apple-converted-space"&gt;&amp;nbsp; &lt;/SPAN&gt;target rate without going over the rate. */&lt;/P&gt;&lt;P&gt;savedMaxCGU = 1;&lt;/P&gt;&lt;P&gt;bestRate = 0xFFFFFFFF;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;&lt;STRONG&gt;for&lt;/STRONG&gt;&lt;/SPAN&gt; (clkIndex = 0; clkIndex &amp;lt; (&lt;SPAN&gt;&lt;STRONG&gt;sizeof&lt;/STRONG&gt;&lt;/SPAN&gt;(adcBaseClkSources) / &lt;SPAN&gt;&lt;STRONG&gt;sizeof&lt;/STRONG&gt;&lt;/SPAN&gt;(&lt;SPAN&gt;CHIP_CGU_CLKIN_T&lt;/SPAN&gt;)); clkIndex++) {&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;&lt;STRONG&gt;for&lt;/STRONG&gt;&lt;/SPAN&gt; (maxCGU = 1; maxCGU &amp;lt;= maxCGUDiv; maxCGU++) {&lt;/P&gt;&lt;P&gt;testRate = getClockRate(clkIndex, maxCGU);&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;&lt;STRONG&gt;if&lt;/STRONG&gt;&lt;/SPAN&gt; (rate &amp;gt;= testRate) {&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;&lt;STRONG&gt;if&lt;/STRONG&gt;&lt;/SPAN&gt; ((rate - testRate) &amp;lt; (rate - bestRate)) {&lt;/P&gt;&lt;P&gt;bestRate = testRate;&lt;/P&gt;&lt;P&gt;savedClkIn = adcBaseClkSources[clkIndex];&lt;/P&gt;&lt;P&gt;savedMaxCGU = maxCGU;&lt;/P&gt;&lt;P&gt;}&lt;/P&gt;&lt;P&gt;}&lt;/P&gt;&lt;P&gt;}&lt;/P&gt;&lt;P&gt;}&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;/* Now to setup clocks */&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;&lt;STRONG&gt;if&lt;/STRONG&gt;&lt;/SPAN&gt; (maxCGUDiv == 1) {&lt;/P&gt;&lt;P&gt;/* CCU divider and base clock only */&lt;/P&gt;&lt;P&gt;/* Select best clock as HSADC base clock */&lt;/P&gt;&lt;P&gt;Chip_Clock_SetBaseClock(&lt;SPAN&gt;&lt;I&gt;CLK_BASE_ADCHS&lt;/I&gt;&lt;/SPAN&gt;, savedClkIn, true, false);&lt;/P&gt;&lt;P&gt;}&lt;/P&gt;&lt;P&gt;&lt;STRONG&gt;else&lt;/STRONG&gt;&lt;SPAN&gt; {&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;/* CCU divider with base clock routed via a CGU divider */&lt;/P&gt;&lt;P&gt;Chip_Clock_SetDivider(bestDivider, savedClkIn, savedMaxCGU);&lt;/P&gt;&lt;P&gt;Chip_Clock_SetBaseClock(&lt;SPAN&gt;&lt;I&gt;CLK_BASE_ADCHS&lt;/I&gt;&lt;/SPAN&gt;, mappedCGUDuv, true, false);&lt;/P&gt;&lt;P&gt;}&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;/* Enable ADC clock */&lt;/P&gt;&lt;P&gt;Chip_Clock_EnableOpts(&lt;SPAN&gt;&lt;I&gt;CLK_ADCHS&lt;/I&gt;&lt;/SPAN&gt;, true, true, 1);&lt;/P&gt;&lt;P&gt;}&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;&lt;STRONG&gt;static&lt;/STRONG&gt;&lt;/SPAN&gt; &lt;SPAN&gt;&lt;STRONG&gt;void&lt;/STRONG&gt;&lt;/SPAN&gt; &lt;STRONG&gt;timer_setup&lt;/STRONG&gt;(&lt;SPAN&gt;&lt;STRONG&gt;void&lt;/STRONG&gt;&lt;/SPAN&gt;)&lt;/P&gt;&lt;P&gt;{&lt;/P&gt;&lt;P&gt;/* Enable timer 1 clock and reset it */&lt;/P&gt;&lt;P&gt;Chip_TIMER_Init(LPC_TIMER1);&lt;/P&gt;&lt;P&gt;Chip_RGU_TriggerReset(&lt;SPAN&gt;&lt;I&gt;RGU_TIMER1_RST&lt;/I&gt;&lt;/SPAN&gt;);&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;&lt;STRONG&gt;while&lt;/STRONG&gt;&lt;/SPAN&gt; (Chip_RGU_InReset(&lt;SPAN&gt;&lt;I&gt;RGU_TIMER1_RST&lt;/I&gt;&lt;/SPAN&gt;)) {}&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;/* Timer setup for match and interrupt at SAMPLERATE */&lt;/P&gt;&lt;P&gt;Chip_TIMER_Reset(LPC_TIMER1);&lt;/P&gt;&lt;P&gt;Chip_TIMER_MatchEnableInt(LPC_TIMER1, 1);&lt;/P&gt;&lt;P&gt;Chip_TIMER_SetMatch(LPC_TIMER1, 1, (Chip_Clock_GetRate(&lt;SPAN&gt;&lt;I&gt;CLK_MX_TIMER1&lt;/I&gt;&lt;/SPAN&gt;) / SAMPLERATE));&lt;/P&gt;&lt;P&gt;Chip_TIMER_ResetOnMatchEnable(LPC_TIMER1, 1);&lt;/P&gt;&lt;P&gt;Chip_TIMER_Enable(LPC_TIMER1);&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;/* Enable timer interrupt */&lt;/P&gt;&lt;P&gt;NVIC_EnableIRQ(&lt;SPAN&gt;&lt;I&gt;TIMER1_IRQn&lt;/I&gt;&lt;/SPAN&gt;);&lt;/P&gt;&lt;P&gt;NVIC_ClearPendingIRQ(&lt;SPAN&gt;&lt;I&gt;TIMER1_IRQn&lt;/I&gt;&lt;/SPAN&gt;);&lt;/P&gt;&lt;P&gt;}&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;/*****************************************************************************&lt;/P&gt;&lt;P&gt;&lt;SPAN class="Apple-converted-space"&gt;&amp;nbsp;&lt;/SPAN&gt;* Public functions&lt;/P&gt;&lt;P&gt;&lt;SPAN class="Apple-converted-space"&gt;&amp;nbsp;&lt;/SPAN&gt;****************************************************************************/&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;/**&lt;/P&gt;&lt;P&gt;&lt;SPAN class="Apple-converted-space"&gt;&amp;nbsp;&lt;/SPAN&gt;* @brief Handle interrupt from 32-bit timer&lt;/P&gt;&lt;P&gt;&lt;SPAN class="Apple-converted-space"&gt;&amp;nbsp;&lt;/SPAN&gt;* @return Nothing&lt;/P&gt;&lt;P&gt;&lt;SPAN class="Apple-converted-space"&gt;&amp;nbsp;&lt;/SPAN&gt;*/&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;&lt;STRONG&gt;void&lt;/STRONG&gt;&lt;/SPAN&gt; &lt;STRONG&gt;TIMER1_IRQHandler&lt;/STRONG&gt;(&lt;SPAN&gt;&lt;STRONG&gt;void&lt;/STRONG&gt;&lt;/SPAN&gt;)&lt;/P&gt;&lt;P&gt;{&lt;/P&gt;&lt;P&gt;/* Clear timer interrupt */&lt;/P&gt;&lt;P&gt;Chip_TIMER_ClearMatch(LPC_TIMER1, 1);&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;/* Reset descriptor pointer to table 0, descriptor 0 and force SW trigger */&lt;/P&gt;&lt;P&gt;Chip_HSADC_SetActiveDescriptor(LPC_ADCHS, 0, 0);&lt;/P&gt;&lt;P&gt;Chip_HSADC_SWTrigger(LPC_ADCHS);&lt;/P&gt;&lt;P&gt;}&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;/**&lt;/P&gt;&lt;P&gt;&lt;SPAN class="Apple-converted-space"&gt;&amp;nbsp;&lt;/SPAN&gt;* @brief Handle interrupt for HSADC peripheral&lt;/P&gt;&lt;P&gt;&lt;SPAN class="Apple-converted-space"&gt;&amp;nbsp;&lt;/SPAN&gt;* @return Nothing&lt;/P&gt;&lt;P&gt;&lt;SPAN class="Apple-converted-space"&gt;&amp;nbsp;&lt;/SPAN&gt;* @note The HSADC IRQ handler is called SPIFI_ADCHS_IRQHandler() on the&lt;/P&gt;&lt;P&gt;&lt;SPAN class="Apple-converted-space"&gt;&amp;nbsp;&lt;/SPAN&gt;* M0 cores. For the M4 core, it's called ADCHS_IRQHandler().&lt;/P&gt;&lt;P&gt;&lt;SPAN class="Apple-converted-space"&gt;&amp;nbsp;&lt;/SPAN&gt;*/&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;&lt;STRONG&gt;void&lt;/STRONG&gt;&lt;/SPAN&gt; &lt;STRONG&gt;ADCHS_IRQHandler&lt;/STRONG&gt;(&lt;SPAN&gt;&lt;STRONG&gt;void&lt;/STRONG&gt;&lt;/SPAN&gt;)&lt;/P&gt;&lt;P&gt;{&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;uint32_t&lt;/SPAN&gt; sts, data, sample, ch;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;&lt;STRONG&gt;static&lt;/STRONG&gt;&lt;/SPAN&gt; bool on;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;&lt;STRONG&gt;int&lt;/STRONG&gt;&lt;/SPAN&gt; prn_delay = 0;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;/* Toggle LED on each sample interrupt */&lt;/P&gt;&lt;P&gt;on = !on;&lt;/P&gt;&lt;P&gt;Board_LED_Set(0, on);&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;/* Get threshold interrupt status on group 1 and toggle on any crossing */&lt;/P&gt;&lt;P&gt;sts = Chip_HSADC_GetIntStatus(LPC_ADCHS, 1) &amp;amp; Chip_HSADC_GetEnabledInts(LPC_ADCHS, 1);&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;&lt;STRONG&gt;if&lt;/STRONG&gt;&lt;/SPAN&gt; (sts &amp;amp; (HSADC_INT1_THCMP_DCROSS(0) | HSADC_INT1_THCMP_DCROSS(1) |&lt;/P&gt;&lt;P&gt;&lt;SPAN class="Apple-converted-space"&gt;&amp;nbsp; &lt;/SPAN&gt;HSADC_INT1_THCMP_UCROSS(2) | HSADC_INT1_THCMP_UCROSS(3) |&lt;/P&gt;&lt;P&gt;&lt;SPAN class="Apple-converted-space"&gt;&amp;nbsp; &lt;/SPAN&gt;HSADC_INT1_THCMP_DCROSS(4) | HSADC_INT1_THCMP_UCROSS(5))) {&lt;/P&gt;&lt;P&gt;Board_LED_Set(1, true);&lt;/P&gt;&lt;P&gt;}&lt;/P&gt;&lt;P&gt;&lt;STRONG&gt;else&lt;/STRONG&gt;&lt;SPAN&gt; {&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;Board_LED_Set(1, false);&lt;/P&gt;&lt;P&gt;}&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;/* Clear threshold interrupts statuses */&lt;/P&gt;&lt;P&gt;Chip_HSADC_ClearIntStatus(LPC_ADCHS, 1, sts);&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;/* Pull data from FIFO */&lt;/P&gt;&lt;P&gt;data = Chip_HSADC_GetFIFO(LPC_ADCHS);&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;&lt;STRONG&gt;while&lt;/STRONG&gt;&lt;/SPAN&gt; (!(data &amp;amp; HSADC_FIFO_EMPTY)) {&lt;/P&gt;&lt;P&gt;/* Pull sample data and channel from FIFO data */&lt;/P&gt;&lt;P&gt;sample = HSADC_FIFO_SAMPLE(data);&lt;/P&gt;&lt;P&gt;ch = HSADC_FIFO_CHAN_ID(data);&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;/* We don't really have &lt;SPAN&gt;anythng&lt;/SPAN&gt; to do with the data,&lt;/P&gt;&lt;P&gt;&lt;SPAN class="Apple-converted-space"&gt;&amp;nbsp; &lt;/SPAN&gt;so just save it */&lt;/P&gt;&lt;P&gt;lastSample[ch] = sample;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;/* Next sample */&lt;/P&gt;&lt;P&gt;data = Chip_HSADC_GetFIFO(LPC_ADCHS);&lt;/P&gt;&lt;P&gt;}&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;/* Get ADC interrupt status on group 0 */&lt;/P&gt;&lt;P&gt;sts = Chip_HSADC_GetIntStatus(LPC_ADCHS, 0) &amp;amp; Chip_HSADC_GetEnabledInts(LPC_ADCHS, 0);&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;/* Set LED 2 (if it exists) on an error */&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;&lt;STRONG&gt;if&lt;/STRONG&gt;&lt;/SPAN&gt; (sts &amp;amp; (HSADC_INT0_FIFO_OVERFLOW | HSADC_INT0_DSCR_ERROR)) {&lt;/P&gt;&lt;P&gt;Board_LED_Set(2, true);&lt;/P&gt;&lt;P&gt;}&lt;/P&gt;&lt;P&gt;&lt;STRONG&gt;else&lt;/STRONG&gt;&lt;SPAN&gt; {&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;Board_LED_Set(2, false);&lt;/P&gt;&lt;P&gt;}&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;/* Clear group 0 interrupt statuses */&lt;/P&gt;&lt;P&gt;Chip_HSADC_ClearIntStatus(LPC_ADCHS, 0, sts);&lt;/P&gt;&lt;P&gt;}&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;/**&lt;/P&gt;&lt;P&gt;&lt;SPAN class="Apple-converted-space"&gt;&amp;nbsp;&lt;/SPAN&gt;* @brief main routine for HSADC example&lt;/P&gt;&lt;P&gt;&lt;SPAN class="Apple-converted-space"&gt;&amp;nbsp;&lt;/SPAN&gt;* @return Function should not exit&lt;/P&gt;&lt;P&gt;&lt;SPAN class="Apple-converted-space"&gt;&amp;nbsp;&lt;/SPAN&gt;*/&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;&lt;STRONG&gt;int&lt;/STRONG&gt;&lt;/SPAN&gt; &lt;STRONG&gt;main&lt;/STRONG&gt;(&lt;SPAN&gt;&lt;STRONG&gt;void&lt;/STRONG&gt;&lt;/SPAN&gt;)&lt;/P&gt;&lt;P&gt;{&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;uint32_t&lt;/SPAN&gt; freqHSADC = 0;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;uint32_t&lt;/SPAN&gt; stored_last_0 = 0;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;SystemCoreClockUpdate();&lt;/P&gt;&lt;P&gt;Board_Init();&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;/* Setting up the HSADC clock is more complex than other peripherals.&lt;/P&gt;&lt;P&gt;&lt;SPAN class="Apple-converted-space"&gt;&amp;nbsp; &lt;/SPAN&gt;The HSADC clock is driven directly from the CGU/CCU and has limited&lt;/P&gt;&lt;P&gt;&lt;SPAN class="Apple-converted-space"&gt;&amp;nbsp; &lt;/SPAN&gt;source and divider options. Because the HSADC clocking is entirely&lt;/P&gt;&lt;P&gt;&lt;SPAN class="Apple-converted-space"&gt;&amp;nbsp; &lt;/SPAN&gt;handled outside the HSADC peripheral, example code for setting up&lt;/P&gt;&lt;P&gt;&lt;SPAN class="Apple-converted-space"&gt;&amp;nbsp; &lt;/SPAN&gt;the CGU/CCU to get a rough HSADC clock rate is included in this&lt;/P&gt;&lt;P&gt;&lt;SPAN class="Apple-converted-space"&gt;&amp;nbsp; &lt;/SPAN&gt;example. */&lt;/P&gt;&lt;P&gt;setupClock(HSADC_CLOCK_RATE);&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;/* Initialize HSADC */&lt;/P&gt;&lt;P&gt;Chip_HSADC_Init(LPC_ADCHS);&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;/* Show the actual HSADC clock rate */&lt;/P&gt;&lt;P&gt;freqHSADC = Chip_HSADC_GetBaseClockRate(LPC_ADCHS);&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;DEBUGOUT(&lt;/SPAN&gt;"HSADC sampling rate = %dKHz\r\n"&lt;SPAN&gt;, freqHSADC / 1000);&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;/* Setup FIFO trip points for interrupt/DMA to 8 samples, no packing */&lt;/P&gt;&lt;P&gt;Chip_HSADC_SetupFIFO(LPC_ADCHS, 8, false);&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;/* Software trigger only, 0x90 recovery clocks, add channel IF to FIFO entry */&lt;/P&gt;&lt;P&gt;Chip_HSADC_ConfigureTrigger(LPC_ADCHS, &lt;SPAN&gt;&lt;I&gt;HSADC_CONFIG_TRIGGER_SW&lt;/I&gt;&lt;/SPAN&gt;,&lt;/P&gt;&lt;P&gt;&lt;I&gt;HSADC_CONFIG_TRIGGER_RISEEXT&lt;/I&gt;&lt;SPAN&gt;, &lt;/SPAN&gt;&lt;I&gt;HSADC_CONFIG_TRIGGER_NOEXTSYNC&lt;/I&gt;&lt;SPAN&gt;,&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;I&gt;HSADC_CHANNEL_ID_EN_ADD&lt;/I&gt;&lt;SPAN&gt;, 0x90);&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;/* Select both positive and negative DC biasing for input 3 */&lt;/P&gt;&lt;P&gt;//Chip_HSADC_SetACDCBias(LPC_ADCHS, 3, HSADC_CHANNEL_DCBIAS, HSADC_CHANNEL_DCBIAS);&lt;/P&gt;&lt;P&gt;Chip_HSADC_SetACDCBias(LPC_ADCHS, 0, &lt;SPAN&gt;&lt;I&gt;HSADC_CHANNEL_DCBIAS&lt;/I&gt;&lt;/SPAN&gt;, &lt;SPAN&gt;&lt;I&gt;HSADC_CHANNEL_NODCBIAS&lt;/I&gt;&lt;/SPAN&gt;);&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;/* Set low A threshold to 10% and high A threshold to 90% */&lt;/P&gt;&lt;P&gt;Chip_HSADC_SetThrLowValue(LPC_ADCHS, 0, ((HSADC_MAX_SAMPLEVAL * 1) / 10));&lt;/P&gt;&lt;P&gt;Chip_HSADC_SetThrHighValue(LPC_ADCHS, 0, ((HSADC_MAX_SAMPLEVAL * 9) / 10));&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;/* Set low B threshold to 40% and high B threshold to 60% */&lt;/P&gt;&lt;P&gt;Chip_HSADC_SetThrLowValue(LPC_ADCHS, 1, ((HSADC_MAX_SAMPLEVAL * 4) / 10));&lt;/P&gt;&lt;P&gt;Chip_HSADC_SetThrHighValue(LPC_ADCHS, 1, ((HSADC_MAX_SAMPLEVAL * 6) / 10));&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;/* Setup data format for 2's complement and update clock settings. This function&lt;/P&gt;&lt;P&gt;&lt;SPAN class="Apple-converted-space"&gt;&amp;nbsp; &lt;/SPAN&gt;should be called whenever a clock change is made to the HSADC */&lt;/P&gt;&lt;P&gt;Chip_HSADC_SetPowerSpeed(LPC_ADCHS, true);&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;/* Enable HSADC power */&lt;/P&gt;&lt;P&gt;Chip_HSADC_EnablePower(LPC_ADCHS);&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;/* Setup HSADC table 0 descriptors */&lt;/P&gt;&lt;P&gt;/* Descriptor entries are mapped as follows */&lt;/P&gt;&lt;P&gt;/* 0 : mapped to input 0, branch to next descriptor after sample, match time&lt;/P&gt;&lt;P&gt;&lt;SPAN class="Apple-converted-space"&gt;&amp;nbsp; &lt;/SPAN&gt;is 0x90 clocks for the initial sample (must be greater than or equal to&lt;/P&gt;&lt;P&gt;&lt;SPAN class="Apple-converted-space"&gt;&amp;nbsp; &amp;nbsp; &lt;/SPAN&gt;recovery clocks for auto power-up), test against threshold A */&lt;/P&gt;&lt;P&gt;Chip_HSADC_SetupDescEntry(LPC_ADCHS, 0, 0, (HSADC_DESC_CH(0) |&lt;/P&gt;&lt;P&gt;HSADC_DESC_BRANCH_NEXT | HSADC_DESC_MATCH(0x95) | HSADC_DESC_THRESH_A |&lt;/P&gt;&lt;P&gt;HSADC_DESC_RESET_TIMER));&lt;/P&gt;&lt;P&gt;/* 1 : mapped to input 0, branch to next descriptor after sample, match time&lt;/P&gt;&lt;P&gt;&lt;SPAN class="Apple-converted-space"&gt;&amp;nbsp; &lt;/SPAN&gt;is 1, test against threshold A */&lt;/P&gt;&lt;P&gt;Chip_HSADC_SetupDescEntry(LPC_ADCHS, 0, 1, (HSADC_DESC_CH(0) |&lt;/P&gt;&lt;P&gt;HSADC_DESC_BRANCH_NEXT | HSADC_DESC_MATCH(1) |&lt;/P&gt;&lt;P&gt;HSADC_DESC_THRESH_A | HSADC_DESC_RESET_TIMER));&lt;/P&gt;&lt;P&gt;/* 2-3 : mapped to input 1, branch to next descriptor after sample, match time&lt;/P&gt;&lt;P&gt;&lt;SPAN class="Apple-converted-space"&gt;&amp;nbsp; &lt;/SPAN&gt;is 1 test against threshold A */&lt;/P&gt;&lt;P&gt;Chip_HSADC_SetupDescEntry(LPC_ADCHS, 0, 2, (HSADC_DESC_CH(1) |&lt;/P&gt;&lt;P&gt;HSADC_DESC_BRANCH_NEXT | HSADC_DESC_MATCH(1) |&lt;/P&gt;&lt;P&gt;HSADC_DESC_THRESH_A | HSADC_DESC_RESET_TIMER));&lt;/P&gt;&lt;P&gt;Chip_HSADC_SetupDescEntry(LPC_ADCHS, 0, 3, (HSADC_DESC_CH(1) |&lt;/P&gt;&lt;P&gt;HSADC_DESC_BRANCH_NEXT | HSADC_DESC_MATCH(1) |&lt;/P&gt;&lt;P&gt;HSADC_DESC_THRESH_A | HSADC_DESC_RESET_TIMER));&lt;/P&gt;&lt;P&gt;/* 4-5 : mapped to input 2, branch to next descriptor after sample, match time&lt;/P&gt;&lt;P&gt;&lt;SPAN class="Apple-converted-space"&gt;&amp;nbsp; &lt;/SPAN&gt;is 1 test against threshold A */&lt;/P&gt;&lt;P&gt;Chip_HSADC_SetupDescEntry(LPC_ADCHS, 0, 4, (HSADC_DESC_CH(2) |&lt;/P&gt;&lt;P&gt;HSADC_DESC_BRANCH_NEXT | HSADC_DESC_MATCH(1) |&lt;/P&gt;&lt;P&gt;HSADC_DESC_THRESH_A | HSADC_DESC_RESET_TIMER));&lt;/P&gt;&lt;P&gt;Chip_HSADC_SetupDescEntry(LPC_ADCHS, 0, 5, (HSADC_DESC_CH(2) |&lt;/P&gt;&lt;P&gt;HSADC_DESC_BRANCH_NEXT | HSADC_DESC_MATCH(1) |&lt;/P&gt;&lt;P&gt;HSADC_DESC_THRESH_A | HSADC_DESC_RESET_TIMER));&lt;/P&gt;&lt;P&gt;/* 6 : mapped to input 3, branch to next descriptor after sample, match time&lt;/P&gt;&lt;P&gt;&lt;SPAN class="Apple-converted-space"&gt;&amp;nbsp; &lt;/SPAN&gt;is 1 test against threshold A */&lt;/P&gt;&lt;P&gt;Chip_HSADC_SetupDescEntry(LPC_ADCHS, 0, 6, (HSADC_DESC_CH(3) |&lt;/P&gt;&lt;P&gt;HSADC_DESC_BRANCH_NEXT | HSADC_DESC_MATCH(1) |&lt;/P&gt;&lt;P&gt;HSADC_DESC_THRESH_A | HSADC_DESC_RESET_TIMER));&lt;/P&gt;&lt;P&gt;/* 7 : mapped to input 4, branch to next descriptor after sample, match time&lt;/P&gt;&lt;P&gt;&lt;SPAN class="Apple-converted-space"&gt;&amp;nbsp; &lt;/SPAN&gt;is 1, test against threshold B, halt after conversion with interrupt, power&lt;/P&gt;&lt;P&gt;&lt;SPAN class="Apple-converted-space"&gt;&amp;nbsp; &amp;nbsp; &lt;/SPAN&gt;down after conversion */&lt;/P&gt;&lt;P&gt;Chip_HSADC_SetupDescEntry(LPC_ADCHS, 0, 7, (HSADC_DESC_CH(4) |&lt;/P&gt;&lt;P&gt;HSADC_DESC_HALT | HSADC_DESC_INT | HSADC_DESC_POWERDOWN |&lt;/P&gt;&lt;P&gt;HSADC_DESC_MATCH(1) | HSADC_DESC_THRESH_B | HSADC_DESC_RESET_TIMER));&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;/* Setup HSADC interrupts on group 0 - FIFO trip (full), FIFO overrun&lt;/P&gt;&lt;P&gt;&lt;SPAN class="Apple-converted-space"&gt;&amp;nbsp; &lt;/SPAN&gt;error, and descriptor statuses */&lt;/P&gt;&lt;P&gt;Chip_HSADC_EnableInts(LPC_ADCHS, 0, (HSADC_INT0_FIFO_FULL | HSADC_INT0_DSCR_DONE |&lt;/P&gt;&lt;P&gt;HSADC_INT0_FIFO_OVERFLOW | HSADC_INT0_DSCR_ERROR));&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;/* Setup HSADC threshold interrupts on group 1 */&lt;/P&gt;&lt;P&gt;Chip_HSADC_EnableInts(LPC_ADCHS, 1,&lt;/P&gt;&lt;P&gt;&lt;SPAN class="Apple-converted-space"&gt;&amp;nbsp; &lt;/SPAN&gt;(HSADC_INT1_THCMP_DCROSS(0) | HSADC_INT1_THCMP_DCROSS(1) |&lt;SPAN&gt;/* Inputs 0 and 1 below threshold below range */&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN class="Apple-converted-space"&gt;&amp;nbsp; &lt;/SPAN&gt;HSADC_INT1_THCMP_UCROSS(2) | HSADC_INT1_THCMP_UCROSS(3) |&lt;SPAN&gt;/* Inputs 2 and 3 above threshold range */&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;&lt;SPAN class="Apple-converted-space"&gt;&amp;nbsp; &lt;/SPAN&gt;HSADC_INT1_THCMP_DCROSS(4) | &lt;/SPAN&gt;/* Inputs 4 downward threshold crossing detect */&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;&lt;SPAN class="Apple-converted-space"&gt;&amp;nbsp; &lt;/SPAN&gt;HSADC_INT1_THCMP_UCROSS(5)));&lt;/SPAN&gt;/* Inputs 5 upward threshold crossing detect */&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;/* Enable HSADC interrupts in NVIC */&lt;/P&gt;&lt;P&gt;NVIC_EnableIRQ(&lt;SPAN&gt;&lt;I&gt;ADCHS_IRQn&lt;/I&gt;&lt;/SPAN&gt;);&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;/* Update descriptor tables - needed after updating any descriptors */&lt;/P&gt;&lt;P&gt;Chip_HSADC_UpdateDescTable(LPC_ADCHS, 0);&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;/* Setup periodic timer to perform software triggering */&lt;/P&gt;&lt;P&gt;timer_setup();&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;/* Sleep while waiting for conversions */&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;&lt;STRONG&gt;while&lt;/STRONG&gt;&lt;/SPAN&gt; (1) {&lt;/P&gt;&lt;P&gt;__WFI();&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;&lt;STRONG&gt;if&lt;/STRONG&gt;&lt;/SPAN&gt; (lastSample[0] &amp;gt;&amp;gt; 6 != stored_last_0 &amp;gt;&amp;gt; 6) {&lt;/P&gt;&lt;P&gt;DEBUGOUT(&lt;SPAN&gt;"ADC VALUE[0]: %08x\r\n"&lt;/SPAN&gt;, lastSample[0]);&lt;/P&gt;&lt;P&gt;stored_last_0 = lastSample[0];&lt;/P&gt;&lt;P&gt;}&lt;/P&gt;&lt;P&gt;}&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;/* Shutdown HSADC when done */&lt;/P&gt;&lt;P&gt;Chip_HSADC_DeInit(LPC_ADCHS);&lt;/P&gt;&lt;P&gt;}&lt;/P&gt;</description>
    <pubDate>Sat, 24 Oct 2020 00:13:07 GMT</pubDate>
    <dc:creator>QM</dc:creator>
    <dc:date>2020-10-24T00:13:07Z</dc:date>
    <item>
      <title>Link2 software, how to modify hsadc code?</title>
      <link>https://community.nxp.com/t5/LPC-Microcontrollers/Link2-software-how-to-modify-hsadc-code/m-p/1172636#M42689</link>
      <description>&lt;P&gt;Hi NXP community,&lt;/P&gt;&lt;P&gt;I am new to programming in C for microcontrollers and would appreciate some advice on how I should modify some existing HSADC code.&lt;/P&gt;&lt;P&gt;I have a project which requires me to,&lt;/P&gt;&lt;P&gt;1. Sample at 40 Msps for small chunks of time (~0.2 ms) using the HSADC on the link2 development board (which has an LPC4370 microcontroller)&lt;/P&gt;&lt;P&gt;2. Process the data using FFT (and eventually adding some windowing and averaging)&lt;/P&gt;&lt;P&gt;3. Send the data to a computer via USB.&lt;/P&gt;&lt;P&gt;I am trying to modify the code shown below, which is the example hsadc code that comes as part of the MCUXpressoIDE.&amp;nbsp;I am in the process of selecting the correct DSP function for the FFT from the CMSIS DSP library but am unsure on how to correctly integrate it into the code below. Any advice on the issues I may face with this method would be greatly appreciated.&amp;nbsp;&lt;/P&gt;&lt;P&gt;Thanks!&lt;/P&gt;&lt;P&gt;/*&lt;/P&gt;&lt;P&gt;&lt;SPAN class="Apple-converted-space"&gt;&amp;nbsp;&lt;/SPAN&gt;* @brief High speed ADC example&lt;/P&gt;&lt;P&gt;&lt;SPAN class="Apple-converted-space"&gt;&amp;nbsp;&lt;/SPAN&gt;*&lt;/P&gt;&lt;P&gt;&lt;SPAN class="Apple-converted-space"&gt;&amp;nbsp;&lt;/SPAN&gt;* @note&lt;/P&gt;&lt;P&gt;&lt;SPAN class="Apple-converted-space"&gt;&amp;nbsp;&lt;/SPAN&gt;* Copyright(C) NXP Semiconductors, 2013&lt;/P&gt;&lt;P&gt;&lt;SPAN class="Apple-converted-space"&gt;&amp;nbsp;&lt;/SPAN&gt;* All rights reserved.&lt;/P&gt;&lt;P&gt;&lt;SPAN class="Apple-converted-space"&gt;&amp;nbsp;&lt;/SPAN&gt;*&lt;/P&gt;&lt;P&gt;&lt;SPAN class="Apple-converted-space"&gt;&amp;nbsp;&lt;/SPAN&gt;* @par&lt;/P&gt;&lt;P&gt;&lt;SPAN class="Apple-converted-space"&gt;&amp;nbsp;&lt;/SPAN&gt;* Software that is described herein is for illustrative purposes only&lt;/P&gt;&lt;P&gt;&lt;SPAN class="Apple-converted-space"&gt;&amp;nbsp;&lt;/SPAN&gt;* which provides customers with programming information regarding the&lt;/P&gt;&lt;P&gt;&lt;SPAN class="Apple-converted-space"&gt;&amp;nbsp;&lt;/SPAN&gt;* LPC products.&lt;SPAN class="Apple-converted-space"&gt;&amp;nbsp; &lt;/SPAN&gt;This software is supplied "AS IS" without any warranties of&lt;/P&gt;&lt;P&gt;&lt;SPAN class="Apple-converted-space"&gt;&amp;nbsp;&lt;/SPAN&gt;* any kind, and NXP Semiconductors and its &lt;SPAN&gt;licensor&lt;/SPAN&gt; disclaim any and&lt;/P&gt;&lt;P&gt;&lt;SPAN class="Apple-converted-space"&gt;&amp;nbsp;&lt;/SPAN&gt;* all warranties, express or implied, including all implied warranties of&lt;/P&gt;&lt;P&gt;&lt;SPAN class="Apple-converted-space"&gt;&amp;nbsp;&lt;/SPAN&gt;* &lt;SPAN&gt;merchantability&lt;/SPAN&gt;, fitness for a particular purpose and non-infringement of&lt;/P&gt;&lt;P&gt;&lt;SPAN class="Apple-converted-space"&gt;&amp;nbsp;&lt;/SPAN&gt;* intellectual property rights.&lt;SPAN class="Apple-converted-space"&gt;&amp;nbsp; &lt;/SPAN&gt;NXP Semiconductors assumes no responsibility&lt;/P&gt;&lt;P&gt;&lt;SPAN class="Apple-converted-space"&gt;&amp;nbsp;&lt;/SPAN&gt;* or liability for the use of the software, conveys no license or rights under any&lt;/P&gt;&lt;P&gt;&lt;SPAN class="Apple-converted-space"&gt;&amp;nbsp;&lt;/SPAN&gt;* patent, copyright, mask work right, or any other intellectual property rights in&lt;/P&gt;&lt;P&gt;&lt;SPAN class="Apple-converted-space"&gt;&amp;nbsp;&lt;/SPAN&gt;* or to any products. NXP Semiconductors reserves the right to make changes&lt;/P&gt;&lt;P&gt;&lt;SPAN class="Apple-converted-space"&gt;&amp;nbsp;&lt;/SPAN&gt;* in the software without notification. NXP Semiconductors also makes no&lt;/P&gt;&lt;P&gt;&lt;SPAN class="Apple-converted-space"&gt;&amp;nbsp;&lt;/SPAN&gt;* representation or warranty that such application will be suitable for the&lt;/P&gt;&lt;P&gt;&lt;SPAN class="Apple-converted-space"&gt;&amp;nbsp;&lt;/SPAN&gt;* specified use without further testing or modification.&lt;/P&gt;&lt;P&gt;&lt;SPAN class="Apple-converted-space"&gt;&amp;nbsp;&lt;/SPAN&gt;*&lt;/P&gt;&lt;P&gt;&lt;SPAN class="Apple-converted-space"&gt;&amp;nbsp;&lt;/SPAN&gt;* @par&lt;/P&gt;&lt;P&gt;&lt;SPAN class="Apple-converted-space"&gt;&amp;nbsp;&lt;/SPAN&gt;* Permission to use, copy, modify, and distribute this software and its&lt;/P&gt;&lt;P&gt;&lt;SPAN class="Apple-converted-space"&gt;&amp;nbsp;&lt;/SPAN&gt;* documentation is hereby granted, under NXP Semiconductors' and its&lt;/P&gt;&lt;P&gt;&lt;SPAN class="Apple-converted-space"&gt;&amp;nbsp;&lt;/SPAN&gt;* licensor's relevant copyrights in the software, without fee, provided that it&lt;/P&gt;&lt;P&gt;&lt;SPAN class="Apple-converted-space"&gt;&amp;nbsp;&lt;/SPAN&gt;* is used in conjunction with NXP Semiconductors &lt;SPAN&gt;microcontrollers&lt;/SPAN&gt;.&lt;SPAN class="Apple-converted-space"&gt;&amp;nbsp; &lt;/SPAN&gt;This&lt;/P&gt;&lt;P&gt;&lt;SPAN class="Apple-converted-space"&gt;&amp;nbsp;&lt;/SPAN&gt;* copyright, permission, and disclaimer notice must appear in all copies of&lt;/P&gt;&lt;P&gt;&lt;SPAN class="Apple-converted-space"&gt;&amp;nbsp;&lt;/SPAN&gt;* this code.&lt;/P&gt;&lt;P&gt;&lt;SPAN class="Apple-converted-space"&gt;&amp;nbsp;&lt;/SPAN&gt;*/&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;&lt;STRONG&gt;#include&lt;/STRONG&gt;&lt;/SPAN&gt; "board.h"&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;&lt;STRONG&gt;#include&lt;/STRONG&gt;&lt;/SPAN&gt; &amp;lt;stdio.h&amp;gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;/*****************************************************************************&lt;/P&gt;&lt;P&gt;&lt;SPAN class="Apple-converted-space"&gt;&amp;nbsp;&lt;/SPAN&gt;* Private types/enumerations/variables&lt;/P&gt;&lt;P&gt;&lt;SPAN class="Apple-converted-space"&gt;&amp;nbsp;&lt;/SPAN&gt;****************************************************************************/&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;/* The default example uses DMA. To use the example in an &lt;SPAN&gt;interrutp&lt;/SPAN&gt; based&lt;/P&gt;&lt;P&gt;&lt;SPAN class="Apple-converted-space"&gt;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;configuration, enable the following definition. */&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;&lt;STRONG&gt;#define&lt;/STRONG&gt;&lt;/SPAN&gt; USE_INTERRUPT_MODE&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;/* HSADC clock rate used for sampling */&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;&lt;STRONG&gt;#define&lt;/STRONG&gt;&lt;/SPAN&gt; HSADC_CLOCK_RATE (80 * 1000000)&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;/* Base clock lookup table used for finding best HSADC clock rate. Only the&lt;/P&gt;&lt;P&gt;&lt;SPAN class="Apple-converted-space"&gt;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;base clock sources in this table are used as a possible source for the&lt;/P&gt;&lt;P&gt;&lt;SPAN class="Apple-converted-space"&gt;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;HSASC peripheral clock before being divided. Add or remove sources as&lt;/P&gt;&lt;P&gt;&lt;SPAN class="Apple-converted-space"&gt;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;needed, but an exact frequency may not be available unless it's set up&lt;/P&gt;&lt;P&gt;&lt;SPAN class="Apple-converted-space"&gt;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;on an unused PLL or clock input. */&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;&lt;STRONG&gt;static&lt;/STRONG&gt;&lt;/SPAN&gt; &lt;SPAN&gt;&lt;STRONG&gt;const&lt;/STRONG&gt;&lt;/SPAN&gt; &lt;SPAN&gt;CHIP_CGU_CLKIN_T&lt;/SPAN&gt; adcBaseClkSources[] = {&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;&lt;I&gt;CLKIN_IRC&lt;/I&gt;&lt;/SPAN&gt;&lt;SPAN&gt;, &lt;/SPAN&gt;/* Usually 12MHz */&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;&lt;I&gt;CLKIN_CLKIN&lt;/I&gt;&lt;/SPAN&gt;&lt;SPAN&gt;, &lt;/SPAN&gt;/* External clock in rate */&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;&lt;I&gt;CLKIN_CRYSTAL&lt;/I&gt;&lt;/SPAN&gt;&lt;SPAN&gt;, &lt;/SPAN&gt;/* Usually 12MHz */&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;&lt;I&gt;CLKIN_AUDIOPLL&lt;/I&gt;&lt;/SPAN&gt;&lt;SPAN&gt;, &lt;/SPAN&gt;/* Unknown, will be 0 if not configured */&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;&lt;I&gt;CLKIN_MAINPLL&lt;/I&gt;&lt;/SPAN&gt; /* Usually 204MHz, may be too fast to use with a divider */&lt;/P&gt;&lt;P&gt;};&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;/* Periodic sample rate in Hz */&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;&lt;STRONG&gt;#define&lt;/STRONG&gt;&lt;/SPAN&gt; SAMPLERATE (5)&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;/*****************************************************************************&lt;/P&gt;&lt;P&gt;&lt;SPAN class="Apple-converted-space"&gt;&amp;nbsp;&lt;/SPAN&gt;* Public types/enumerations/variables&lt;/P&gt;&lt;P&gt;&lt;SPAN class="Apple-converted-space"&gt;&amp;nbsp;&lt;/SPAN&gt;****************************************************************************/&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;/* Last saved ADC sample for each input */&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;&lt;STRONG&gt;volatile&lt;/STRONG&gt;&lt;/SPAN&gt; &lt;SPAN&gt;uint32_t&lt;/SPAN&gt; lastSample[6];&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;/*****************************************************************************&lt;/P&gt;&lt;P&gt;&lt;SPAN class="Apple-converted-space"&gt;&amp;nbsp;&lt;/SPAN&gt;* Private functions&lt;/P&gt;&lt;P&gt;&lt;SPAN class="Apple-converted-space"&gt;&amp;nbsp;&lt;/SPAN&gt;****************************************************************************/&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;/* Returns a computed clock rate based on input clock and divider&lt;/P&gt;&lt;P&gt;&lt;SPAN class="Apple-converted-space"&gt;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;selection */&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;&lt;STRONG&gt;static&lt;/STRONG&gt;&lt;/SPAN&gt; &lt;SPAN&gt;uint32_t&lt;/SPAN&gt; &lt;STRONG&gt;getClockRate&lt;/STRONG&gt;(&lt;SPAN&gt;&lt;STRONG&gt;int&lt;/STRONG&gt;&lt;/SPAN&gt; clkIndex, &lt;SPAN&gt;uint32_t&lt;/SPAN&gt; maxCGU)&lt;/P&gt;&lt;P&gt;{&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;uint32_t&lt;/SPAN&gt; clkRate;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;clkRate = Chip_Clock_GetClockInputHz(adcBaseClkSources[clkIndex]);&lt;/P&gt;&lt;P&gt;clkRate = clkRate / maxCGU;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;&lt;STRONG&gt;return&lt;/STRONG&gt;&lt;/SPAN&gt; clkRate;&lt;/P&gt;&lt;P&gt;}&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;/* Clock setup function for generating approximate HSADC clock. Trim this&lt;/P&gt;&lt;P&gt;&lt;SPAN class="Apple-converted-space"&gt;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;example function as needed to get the size down in a production system. */&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;&lt;STRONG&gt;static&lt;/STRONG&gt;&lt;/SPAN&gt; &lt;SPAN&gt;&lt;STRONG&gt;void&lt;/STRONG&gt;&lt;/SPAN&gt; &lt;STRONG&gt;setupClock&lt;/STRONG&gt;(&lt;SPAN&gt;uint32_t&lt;/SPAN&gt; rate)&lt;/P&gt;&lt;P&gt;{&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;CHIP_CGU_IDIV_T&lt;/SPAN&gt; freeDivider, bestDivider;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;CHIP_CGU_CLKIN_T&lt;/SPAN&gt; divider, mappedCGUDuv, savedClkIn;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;uint32_t&lt;/SPAN&gt; bestRate, testRate, maxCGU, savedMaxCGU;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;uint32_t&lt;/SPAN&gt; maxCGUDiv;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;&lt;STRONG&gt;int&lt;/STRONG&gt;&lt;/SPAN&gt; clkIndex;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;/* The HSADC clock (sample) rate is derived from the HSADC base clock&lt;/P&gt;&lt;P&gt;&lt;SPAN class="Apple-converted-space"&gt;&amp;nbsp; &lt;/SPAN&gt;divided by the HSADC clock divider (only 1 or 2). The HSADC base&lt;/P&gt;&lt;P&gt;&lt;SPAN class="Apple-converted-space"&gt;&amp;nbsp; &lt;/SPAN&gt;clock can be selected from a number of internal clock sources such&lt;/P&gt;&lt;P&gt;&lt;SPAN class="Apple-converted-space"&gt;&amp;nbsp; &lt;/SPAN&gt;as the main PLL1, audio PLL, external crystal rate, IRC, RTC, or a&lt;/P&gt;&lt;P&gt;&lt;SPAN class="Apple-converted-space"&gt;&amp;nbsp; &lt;/SPAN&gt;CGU divider. Unless a PLL is setup for the exact rate desired, a&lt;/P&gt;&lt;P&gt;&lt;SPAN class="Apple-converted-space"&gt;&amp;nbsp; &lt;/SPAN&gt;rate close to the target rate may be the closest approximation. */&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;/* Determine if there are any free dividers in the CGU. Assumes an&lt;/P&gt;&lt;P&gt;&lt;SPAN class="Apple-converted-space"&gt;&amp;nbsp; &lt;/SPAN&gt;unused divider is attached to CLOCKINPUT_PD. Divider A can only&lt;/P&gt;&lt;P&gt;&lt;SPAN class="Apple-converted-space"&gt;&amp;nbsp; &lt;/SPAN&gt;divide 1-4, B/C/D can divide 1-16, E can divider 1-256. */&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;freeDivider = &lt;/SPAN&gt;&lt;SPAN&gt;&lt;I&gt;CLK_IDIV_A&lt;/I&gt;&lt;/SPAN&gt;&lt;SPAN&gt;; &lt;/SPAN&gt;/* Dividers only */&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;divider = &lt;/SPAN&gt;&lt;SPAN&gt;&lt;I&gt;CLKIN_IDIVA&lt;/I&gt;&lt;/SPAN&gt;&lt;SPAN&gt;; &lt;/SPAN&gt;/* CGU clock input sources */&lt;/P&gt;&lt;P&gt;bestDivider = &lt;SPAN&gt;&lt;I&gt;CLK_IDIV_LAST&lt;/I&gt;&lt;/SPAN&gt;;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;&lt;STRONG&gt;while&lt;/STRONG&gt;&lt;/SPAN&gt; (freeDivider &amp;lt; &lt;SPAN&gt;&lt;I&gt;CLK_IDIV_LAST&lt;/I&gt;&lt;/SPAN&gt;) {&lt;/P&gt;&lt;P&gt;CHIP_CGU_CLKIN_T&lt;SPAN&gt; clkIn;&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;/* A CGUI divider that is pulled on input down is free */&lt;/P&gt;&lt;P&gt;clkIn = Chip_Clock_GetDividerSource(freeDivider);&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;&lt;STRONG&gt;if&lt;/STRONG&gt;&lt;/SPAN&gt; (clkIn == &lt;SPAN&gt;&lt;I&gt;CLKINPUT_PD&lt;/I&gt;&lt;/SPAN&gt;) {&lt;/P&gt;&lt;P&gt;/* Save available divider and mapped CGU clock divider source */&lt;/P&gt;&lt;P&gt;bestDivider = freeDivider;&lt;/P&gt;&lt;P&gt;mappedCGUDuv = divider;&lt;/P&gt;&lt;P&gt;}&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;/* Try next divider */&lt;/P&gt;&lt;P&gt;freeDivider++;&lt;/P&gt;&lt;P&gt;divider++;&lt;/P&gt;&lt;P&gt;}&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;/* Determine maximum divider value per CGU divider */&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;&lt;STRONG&gt;if&lt;/STRONG&gt;&lt;/SPAN&gt; (bestDivider != &lt;SPAN&gt;&lt;I&gt;CLK_IDIV_LAST&lt;/I&gt;&lt;/SPAN&gt;) {&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;&lt;STRONG&gt;if&lt;/STRONG&gt;&lt;/SPAN&gt; (bestDivider == &lt;SPAN&gt;&lt;I&gt;CLK_IDIV_A&lt;/I&gt;&lt;/SPAN&gt;) {&lt;/P&gt;&lt;P&gt;maxCGUDiv = 4;&lt;/P&gt;&lt;P&gt;}&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;&lt;STRONG&gt;else&lt;/STRONG&gt;&lt;/SPAN&gt; &lt;SPAN&gt;&lt;STRONG&gt;if&lt;/STRONG&gt;&lt;/SPAN&gt; ((bestDivider &amp;gt;= &lt;SPAN&gt;&lt;I&gt;CLK_IDIV_B&lt;/I&gt;&lt;/SPAN&gt;) &amp;amp;&amp;amp; (bestDivider &amp;lt;= &lt;SPAN&gt;&lt;I&gt;CLK_IDIV_D&lt;/I&gt;&lt;/SPAN&gt;)) {&lt;/P&gt;&lt;P&gt;maxCGUDiv = 16;&lt;/P&gt;&lt;P&gt;}&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;&lt;STRONG&gt;else&lt;/STRONG&gt;&lt;/SPAN&gt; {&lt;/P&gt;&lt;P&gt;maxCGUDiv = 256;&lt;/P&gt;&lt;P&gt;}&lt;/P&gt;&lt;P&gt;}&lt;/P&gt;&lt;P&gt;&lt;STRONG&gt;else&lt;/STRONG&gt;&lt;SPAN&gt; {&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;/* No CGU divider available */&lt;/P&gt;&lt;P&gt;maxCGUDiv = 1;&lt;/P&gt;&lt;P&gt;}&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;/* Using the best available maximum CGU and CCU dividers, attempt to&lt;/P&gt;&lt;P&gt;&lt;SPAN class="Apple-converted-space"&gt;&amp;nbsp; &lt;/SPAN&gt;find a base clock rate that will get as close as possible to the&lt;/P&gt;&lt;P&gt;&lt;SPAN class="Apple-converted-space"&gt;&amp;nbsp; &lt;/SPAN&gt;target rate without going over the rate. */&lt;/P&gt;&lt;P&gt;savedMaxCGU = 1;&lt;/P&gt;&lt;P&gt;bestRate = 0xFFFFFFFF;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;&lt;STRONG&gt;for&lt;/STRONG&gt;&lt;/SPAN&gt; (clkIndex = 0; clkIndex &amp;lt; (&lt;SPAN&gt;&lt;STRONG&gt;sizeof&lt;/STRONG&gt;&lt;/SPAN&gt;(adcBaseClkSources) / &lt;SPAN&gt;&lt;STRONG&gt;sizeof&lt;/STRONG&gt;&lt;/SPAN&gt;(&lt;SPAN&gt;CHIP_CGU_CLKIN_T&lt;/SPAN&gt;)); clkIndex++) {&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;&lt;STRONG&gt;for&lt;/STRONG&gt;&lt;/SPAN&gt; (maxCGU = 1; maxCGU &amp;lt;= maxCGUDiv; maxCGU++) {&lt;/P&gt;&lt;P&gt;testRate = getClockRate(clkIndex, maxCGU);&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;&lt;STRONG&gt;if&lt;/STRONG&gt;&lt;/SPAN&gt; (rate &amp;gt;= testRate) {&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;&lt;STRONG&gt;if&lt;/STRONG&gt;&lt;/SPAN&gt; ((rate - testRate) &amp;lt; (rate - bestRate)) {&lt;/P&gt;&lt;P&gt;bestRate = testRate;&lt;/P&gt;&lt;P&gt;savedClkIn = adcBaseClkSources[clkIndex];&lt;/P&gt;&lt;P&gt;savedMaxCGU = maxCGU;&lt;/P&gt;&lt;P&gt;}&lt;/P&gt;&lt;P&gt;}&lt;/P&gt;&lt;P&gt;}&lt;/P&gt;&lt;P&gt;}&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;/* Now to setup clocks */&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;&lt;STRONG&gt;if&lt;/STRONG&gt;&lt;/SPAN&gt; (maxCGUDiv == 1) {&lt;/P&gt;&lt;P&gt;/* CCU divider and base clock only */&lt;/P&gt;&lt;P&gt;/* Select best clock as HSADC base clock */&lt;/P&gt;&lt;P&gt;Chip_Clock_SetBaseClock(&lt;SPAN&gt;&lt;I&gt;CLK_BASE_ADCHS&lt;/I&gt;&lt;/SPAN&gt;, savedClkIn, true, false);&lt;/P&gt;&lt;P&gt;}&lt;/P&gt;&lt;P&gt;&lt;STRONG&gt;else&lt;/STRONG&gt;&lt;SPAN&gt; {&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;/* CCU divider with base clock routed via a CGU divider */&lt;/P&gt;&lt;P&gt;Chip_Clock_SetDivider(bestDivider, savedClkIn, savedMaxCGU);&lt;/P&gt;&lt;P&gt;Chip_Clock_SetBaseClock(&lt;SPAN&gt;&lt;I&gt;CLK_BASE_ADCHS&lt;/I&gt;&lt;/SPAN&gt;, mappedCGUDuv, true, false);&lt;/P&gt;&lt;P&gt;}&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;/* Enable ADC clock */&lt;/P&gt;&lt;P&gt;Chip_Clock_EnableOpts(&lt;SPAN&gt;&lt;I&gt;CLK_ADCHS&lt;/I&gt;&lt;/SPAN&gt;, true, true, 1);&lt;/P&gt;&lt;P&gt;}&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;&lt;STRONG&gt;static&lt;/STRONG&gt;&lt;/SPAN&gt; &lt;SPAN&gt;&lt;STRONG&gt;void&lt;/STRONG&gt;&lt;/SPAN&gt; &lt;STRONG&gt;timer_setup&lt;/STRONG&gt;(&lt;SPAN&gt;&lt;STRONG&gt;void&lt;/STRONG&gt;&lt;/SPAN&gt;)&lt;/P&gt;&lt;P&gt;{&lt;/P&gt;&lt;P&gt;/* Enable timer 1 clock and reset it */&lt;/P&gt;&lt;P&gt;Chip_TIMER_Init(LPC_TIMER1);&lt;/P&gt;&lt;P&gt;Chip_RGU_TriggerReset(&lt;SPAN&gt;&lt;I&gt;RGU_TIMER1_RST&lt;/I&gt;&lt;/SPAN&gt;);&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;&lt;STRONG&gt;while&lt;/STRONG&gt;&lt;/SPAN&gt; (Chip_RGU_InReset(&lt;SPAN&gt;&lt;I&gt;RGU_TIMER1_RST&lt;/I&gt;&lt;/SPAN&gt;)) {}&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;/* Timer setup for match and interrupt at SAMPLERATE */&lt;/P&gt;&lt;P&gt;Chip_TIMER_Reset(LPC_TIMER1);&lt;/P&gt;&lt;P&gt;Chip_TIMER_MatchEnableInt(LPC_TIMER1, 1);&lt;/P&gt;&lt;P&gt;Chip_TIMER_SetMatch(LPC_TIMER1, 1, (Chip_Clock_GetRate(&lt;SPAN&gt;&lt;I&gt;CLK_MX_TIMER1&lt;/I&gt;&lt;/SPAN&gt;) / SAMPLERATE));&lt;/P&gt;&lt;P&gt;Chip_TIMER_ResetOnMatchEnable(LPC_TIMER1, 1);&lt;/P&gt;&lt;P&gt;Chip_TIMER_Enable(LPC_TIMER1);&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;/* Enable timer interrupt */&lt;/P&gt;&lt;P&gt;NVIC_EnableIRQ(&lt;SPAN&gt;&lt;I&gt;TIMER1_IRQn&lt;/I&gt;&lt;/SPAN&gt;);&lt;/P&gt;&lt;P&gt;NVIC_ClearPendingIRQ(&lt;SPAN&gt;&lt;I&gt;TIMER1_IRQn&lt;/I&gt;&lt;/SPAN&gt;);&lt;/P&gt;&lt;P&gt;}&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;/*****************************************************************************&lt;/P&gt;&lt;P&gt;&lt;SPAN class="Apple-converted-space"&gt;&amp;nbsp;&lt;/SPAN&gt;* Public functions&lt;/P&gt;&lt;P&gt;&lt;SPAN class="Apple-converted-space"&gt;&amp;nbsp;&lt;/SPAN&gt;****************************************************************************/&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;/**&lt;/P&gt;&lt;P&gt;&lt;SPAN class="Apple-converted-space"&gt;&amp;nbsp;&lt;/SPAN&gt;* @brief Handle interrupt from 32-bit timer&lt;/P&gt;&lt;P&gt;&lt;SPAN class="Apple-converted-space"&gt;&amp;nbsp;&lt;/SPAN&gt;* @return Nothing&lt;/P&gt;&lt;P&gt;&lt;SPAN class="Apple-converted-space"&gt;&amp;nbsp;&lt;/SPAN&gt;*/&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;&lt;STRONG&gt;void&lt;/STRONG&gt;&lt;/SPAN&gt; &lt;STRONG&gt;TIMER1_IRQHandler&lt;/STRONG&gt;(&lt;SPAN&gt;&lt;STRONG&gt;void&lt;/STRONG&gt;&lt;/SPAN&gt;)&lt;/P&gt;&lt;P&gt;{&lt;/P&gt;&lt;P&gt;/* Clear timer interrupt */&lt;/P&gt;&lt;P&gt;Chip_TIMER_ClearMatch(LPC_TIMER1, 1);&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;/* Reset descriptor pointer to table 0, descriptor 0 and force SW trigger */&lt;/P&gt;&lt;P&gt;Chip_HSADC_SetActiveDescriptor(LPC_ADCHS, 0, 0);&lt;/P&gt;&lt;P&gt;Chip_HSADC_SWTrigger(LPC_ADCHS);&lt;/P&gt;&lt;P&gt;}&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;/**&lt;/P&gt;&lt;P&gt;&lt;SPAN class="Apple-converted-space"&gt;&amp;nbsp;&lt;/SPAN&gt;* @brief Handle interrupt for HSADC peripheral&lt;/P&gt;&lt;P&gt;&lt;SPAN class="Apple-converted-space"&gt;&amp;nbsp;&lt;/SPAN&gt;* @return Nothing&lt;/P&gt;&lt;P&gt;&lt;SPAN class="Apple-converted-space"&gt;&amp;nbsp;&lt;/SPAN&gt;* @note The HSADC IRQ handler is called SPIFI_ADCHS_IRQHandler() on the&lt;/P&gt;&lt;P&gt;&lt;SPAN class="Apple-converted-space"&gt;&amp;nbsp;&lt;/SPAN&gt;* M0 cores. For the M4 core, it's called ADCHS_IRQHandler().&lt;/P&gt;&lt;P&gt;&lt;SPAN class="Apple-converted-space"&gt;&amp;nbsp;&lt;/SPAN&gt;*/&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;&lt;STRONG&gt;void&lt;/STRONG&gt;&lt;/SPAN&gt; &lt;STRONG&gt;ADCHS_IRQHandler&lt;/STRONG&gt;(&lt;SPAN&gt;&lt;STRONG&gt;void&lt;/STRONG&gt;&lt;/SPAN&gt;)&lt;/P&gt;&lt;P&gt;{&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;uint32_t&lt;/SPAN&gt; sts, data, sample, ch;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;&lt;STRONG&gt;static&lt;/STRONG&gt;&lt;/SPAN&gt; bool on;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;&lt;STRONG&gt;int&lt;/STRONG&gt;&lt;/SPAN&gt; prn_delay = 0;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;/* Toggle LED on each sample interrupt */&lt;/P&gt;&lt;P&gt;on = !on;&lt;/P&gt;&lt;P&gt;Board_LED_Set(0, on);&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;/* Get threshold interrupt status on group 1 and toggle on any crossing */&lt;/P&gt;&lt;P&gt;sts = Chip_HSADC_GetIntStatus(LPC_ADCHS, 1) &amp;amp; Chip_HSADC_GetEnabledInts(LPC_ADCHS, 1);&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;&lt;STRONG&gt;if&lt;/STRONG&gt;&lt;/SPAN&gt; (sts &amp;amp; (HSADC_INT1_THCMP_DCROSS(0) | HSADC_INT1_THCMP_DCROSS(1) |&lt;/P&gt;&lt;P&gt;&lt;SPAN class="Apple-converted-space"&gt;&amp;nbsp; &lt;/SPAN&gt;HSADC_INT1_THCMP_UCROSS(2) | HSADC_INT1_THCMP_UCROSS(3) |&lt;/P&gt;&lt;P&gt;&lt;SPAN class="Apple-converted-space"&gt;&amp;nbsp; &lt;/SPAN&gt;HSADC_INT1_THCMP_DCROSS(4) | HSADC_INT1_THCMP_UCROSS(5))) {&lt;/P&gt;&lt;P&gt;Board_LED_Set(1, true);&lt;/P&gt;&lt;P&gt;}&lt;/P&gt;&lt;P&gt;&lt;STRONG&gt;else&lt;/STRONG&gt;&lt;SPAN&gt; {&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;Board_LED_Set(1, false);&lt;/P&gt;&lt;P&gt;}&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;/* Clear threshold interrupts statuses */&lt;/P&gt;&lt;P&gt;Chip_HSADC_ClearIntStatus(LPC_ADCHS, 1, sts);&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;/* Pull data from FIFO */&lt;/P&gt;&lt;P&gt;data = Chip_HSADC_GetFIFO(LPC_ADCHS);&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;&lt;STRONG&gt;while&lt;/STRONG&gt;&lt;/SPAN&gt; (!(data &amp;amp; HSADC_FIFO_EMPTY)) {&lt;/P&gt;&lt;P&gt;/* Pull sample data and channel from FIFO data */&lt;/P&gt;&lt;P&gt;sample = HSADC_FIFO_SAMPLE(data);&lt;/P&gt;&lt;P&gt;ch = HSADC_FIFO_CHAN_ID(data);&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;/* We don't really have &lt;SPAN&gt;anythng&lt;/SPAN&gt; to do with the data,&lt;/P&gt;&lt;P&gt;&lt;SPAN class="Apple-converted-space"&gt;&amp;nbsp; &lt;/SPAN&gt;so just save it */&lt;/P&gt;&lt;P&gt;lastSample[ch] = sample;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;/* Next sample */&lt;/P&gt;&lt;P&gt;data = Chip_HSADC_GetFIFO(LPC_ADCHS);&lt;/P&gt;&lt;P&gt;}&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;/* Get ADC interrupt status on group 0 */&lt;/P&gt;&lt;P&gt;sts = Chip_HSADC_GetIntStatus(LPC_ADCHS, 0) &amp;amp; Chip_HSADC_GetEnabledInts(LPC_ADCHS, 0);&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;/* Set LED 2 (if it exists) on an error */&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;&lt;STRONG&gt;if&lt;/STRONG&gt;&lt;/SPAN&gt; (sts &amp;amp; (HSADC_INT0_FIFO_OVERFLOW | HSADC_INT0_DSCR_ERROR)) {&lt;/P&gt;&lt;P&gt;Board_LED_Set(2, true);&lt;/P&gt;&lt;P&gt;}&lt;/P&gt;&lt;P&gt;&lt;STRONG&gt;else&lt;/STRONG&gt;&lt;SPAN&gt; {&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;Board_LED_Set(2, false);&lt;/P&gt;&lt;P&gt;}&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;/* Clear group 0 interrupt statuses */&lt;/P&gt;&lt;P&gt;Chip_HSADC_ClearIntStatus(LPC_ADCHS, 0, sts);&lt;/P&gt;&lt;P&gt;}&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;/**&lt;/P&gt;&lt;P&gt;&lt;SPAN class="Apple-converted-space"&gt;&amp;nbsp;&lt;/SPAN&gt;* @brief main routine for HSADC example&lt;/P&gt;&lt;P&gt;&lt;SPAN class="Apple-converted-space"&gt;&amp;nbsp;&lt;/SPAN&gt;* @return Function should not exit&lt;/P&gt;&lt;P&gt;&lt;SPAN class="Apple-converted-space"&gt;&amp;nbsp;&lt;/SPAN&gt;*/&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;&lt;STRONG&gt;int&lt;/STRONG&gt;&lt;/SPAN&gt; &lt;STRONG&gt;main&lt;/STRONG&gt;(&lt;SPAN&gt;&lt;STRONG&gt;void&lt;/STRONG&gt;&lt;/SPAN&gt;)&lt;/P&gt;&lt;P&gt;{&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;uint32_t&lt;/SPAN&gt; freqHSADC = 0;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;uint32_t&lt;/SPAN&gt; stored_last_0 = 0;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;SystemCoreClockUpdate();&lt;/P&gt;&lt;P&gt;Board_Init();&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;/* Setting up the HSADC clock is more complex than other peripherals.&lt;/P&gt;&lt;P&gt;&lt;SPAN class="Apple-converted-space"&gt;&amp;nbsp; &lt;/SPAN&gt;The HSADC clock is driven directly from the CGU/CCU and has limited&lt;/P&gt;&lt;P&gt;&lt;SPAN class="Apple-converted-space"&gt;&amp;nbsp; &lt;/SPAN&gt;source and divider options. Because the HSADC clocking is entirely&lt;/P&gt;&lt;P&gt;&lt;SPAN class="Apple-converted-space"&gt;&amp;nbsp; &lt;/SPAN&gt;handled outside the HSADC peripheral, example code for setting up&lt;/P&gt;&lt;P&gt;&lt;SPAN class="Apple-converted-space"&gt;&amp;nbsp; &lt;/SPAN&gt;the CGU/CCU to get a rough HSADC clock rate is included in this&lt;/P&gt;&lt;P&gt;&lt;SPAN class="Apple-converted-space"&gt;&amp;nbsp; &lt;/SPAN&gt;example. */&lt;/P&gt;&lt;P&gt;setupClock(HSADC_CLOCK_RATE);&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;/* Initialize HSADC */&lt;/P&gt;&lt;P&gt;Chip_HSADC_Init(LPC_ADCHS);&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;/* Show the actual HSADC clock rate */&lt;/P&gt;&lt;P&gt;freqHSADC = Chip_HSADC_GetBaseClockRate(LPC_ADCHS);&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;DEBUGOUT(&lt;/SPAN&gt;"HSADC sampling rate = %dKHz\r\n"&lt;SPAN&gt;, freqHSADC / 1000);&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;/* Setup FIFO trip points for interrupt/DMA to 8 samples, no packing */&lt;/P&gt;&lt;P&gt;Chip_HSADC_SetupFIFO(LPC_ADCHS, 8, false);&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;/* Software trigger only, 0x90 recovery clocks, add channel IF to FIFO entry */&lt;/P&gt;&lt;P&gt;Chip_HSADC_ConfigureTrigger(LPC_ADCHS, &lt;SPAN&gt;&lt;I&gt;HSADC_CONFIG_TRIGGER_SW&lt;/I&gt;&lt;/SPAN&gt;,&lt;/P&gt;&lt;P&gt;&lt;I&gt;HSADC_CONFIG_TRIGGER_RISEEXT&lt;/I&gt;&lt;SPAN&gt;, &lt;/SPAN&gt;&lt;I&gt;HSADC_CONFIG_TRIGGER_NOEXTSYNC&lt;/I&gt;&lt;SPAN&gt;,&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;I&gt;HSADC_CHANNEL_ID_EN_ADD&lt;/I&gt;&lt;SPAN&gt;, 0x90);&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;/* Select both positive and negative DC biasing for input 3 */&lt;/P&gt;&lt;P&gt;//Chip_HSADC_SetACDCBias(LPC_ADCHS, 3, HSADC_CHANNEL_DCBIAS, HSADC_CHANNEL_DCBIAS);&lt;/P&gt;&lt;P&gt;Chip_HSADC_SetACDCBias(LPC_ADCHS, 0, &lt;SPAN&gt;&lt;I&gt;HSADC_CHANNEL_DCBIAS&lt;/I&gt;&lt;/SPAN&gt;, &lt;SPAN&gt;&lt;I&gt;HSADC_CHANNEL_NODCBIAS&lt;/I&gt;&lt;/SPAN&gt;);&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;/* Set low A threshold to 10% and high A threshold to 90% */&lt;/P&gt;&lt;P&gt;Chip_HSADC_SetThrLowValue(LPC_ADCHS, 0, ((HSADC_MAX_SAMPLEVAL * 1) / 10));&lt;/P&gt;&lt;P&gt;Chip_HSADC_SetThrHighValue(LPC_ADCHS, 0, ((HSADC_MAX_SAMPLEVAL * 9) / 10));&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;/* Set low B threshold to 40% and high B threshold to 60% */&lt;/P&gt;&lt;P&gt;Chip_HSADC_SetThrLowValue(LPC_ADCHS, 1, ((HSADC_MAX_SAMPLEVAL * 4) / 10));&lt;/P&gt;&lt;P&gt;Chip_HSADC_SetThrHighValue(LPC_ADCHS, 1, ((HSADC_MAX_SAMPLEVAL * 6) / 10));&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;/* Setup data format for 2's complement and update clock settings. This function&lt;/P&gt;&lt;P&gt;&lt;SPAN class="Apple-converted-space"&gt;&amp;nbsp; &lt;/SPAN&gt;should be called whenever a clock change is made to the HSADC */&lt;/P&gt;&lt;P&gt;Chip_HSADC_SetPowerSpeed(LPC_ADCHS, true);&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;/* Enable HSADC power */&lt;/P&gt;&lt;P&gt;Chip_HSADC_EnablePower(LPC_ADCHS);&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;/* Setup HSADC table 0 descriptors */&lt;/P&gt;&lt;P&gt;/* Descriptor entries are mapped as follows */&lt;/P&gt;&lt;P&gt;/* 0 : mapped to input 0, branch to next descriptor after sample, match time&lt;/P&gt;&lt;P&gt;&lt;SPAN class="Apple-converted-space"&gt;&amp;nbsp; &lt;/SPAN&gt;is 0x90 clocks for the initial sample (must be greater than or equal to&lt;/P&gt;&lt;P&gt;&lt;SPAN class="Apple-converted-space"&gt;&amp;nbsp; &amp;nbsp; &lt;/SPAN&gt;recovery clocks for auto power-up), test against threshold A */&lt;/P&gt;&lt;P&gt;Chip_HSADC_SetupDescEntry(LPC_ADCHS, 0, 0, (HSADC_DESC_CH(0) |&lt;/P&gt;&lt;P&gt;HSADC_DESC_BRANCH_NEXT | HSADC_DESC_MATCH(0x95) | HSADC_DESC_THRESH_A |&lt;/P&gt;&lt;P&gt;HSADC_DESC_RESET_TIMER));&lt;/P&gt;&lt;P&gt;/* 1 : mapped to input 0, branch to next descriptor after sample, match time&lt;/P&gt;&lt;P&gt;&lt;SPAN class="Apple-converted-space"&gt;&amp;nbsp; &lt;/SPAN&gt;is 1, test against threshold A */&lt;/P&gt;&lt;P&gt;Chip_HSADC_SetupDescEntry(LPC_ADCHS, 0, 1, (HSADC_DESC_CH(0) |&lt;/P&gt;&lt;P&gt;HSADC_DESC_BRANCH_NEXT | HSADC_DESC_MATCH(1) |&lt;/P&gt;&lt;P&gt;HSADC_DESC_THRESH_A | HSADC_DESC_RESET_TIMER));&lt;/P&gt;&lt;P&gt;/* 2-3 : mapped to input 1, branch to next descriptor after sample, match time&lt;/P&gt;&lt;P&gt;&lt;SPAN class="Apple-converted-space"&gt;&amp;nbsp; &lt;/SPAN&gt;is 1 test against threshold A */&lt;/P&gt;&lt;P&gt;Chip_HSADC_SetupDescEntry(LPC_ADCHS, 0, 2, (HSADC_DESC_CH(1) |&lt;/P&gt;&lt;P&gt;HSADC_DESC_BRANCH_NEXT | HSADC_DESC_MATCH(1) |&lt;/P&gt;&lt;P&gt;HSADC_DESC_THRESH_A | HSADC_DESC_RESET_TIMER));&lt;/P&gt;&lt;P&gt;Chip_HSADC_SetupDescEntry(LPC_ADCHS, 0, 3, (HSADC_DESC_CH(1) |&lt;/P&gt;&lt;P&gt;HSADC_DESC_BRANCH_NEXT | HSADC_DESC_MATCH(1) |&lt;/P&gt;&lt;P&gt;HSADC_DESC_THRESH_A | HSADC_DESC_RESET_TIMER));&lt;/P&gt;&lt;P&gt;/* 4-5 : mapped to input 2, branch to next descriptor after sample, match time&lt;/P&gt;&lt;P&gt;&lt;SPAN class="Apple-converted-space"&gt;&amp;nbsp; &lt;/SPAN&gt;is 1 test against threshold A */&lt;/P&gt;&lt;P&gt;Chip_HSADC_SetupDescEntry(LPC_ADCHS, 0, 4, (HSADC_DESC_CH(2) |&lt;/P&gt;&lt;P&gt;HSADC_DESC_BRANCH_NEXT | HSADC_DESC_MATCH(1) |&lt;/P&gt;&lt;P&gt;HSADC_DESC_THRESH_A | HSADC_DESC_RESET_TIMER));&lt;/P&gt;&lt;P&gt;Chip_HSADC_SetupDescEntry(LPC_ADCHS, 0, 5, (HSADC_DESC_CH(2) |&lt;/P&gt;&lt;P&gt;HSADC_DESC_BRANCH_NEXT | HSADC_DESC_MATCH(1) |&lt;/P&gt;&lt;P&gt;HSADC_DESC_THRESH_A | HSADC_DESC_RESET_TIMER));&lt;/P&gt;&lt;P&gt;/* 6 : mapped to input 3, branch to next descriptor after sample, match time&lt;/P&gt;&lt;P&gt;&lt;SPAN class="Apple-converted-space"&gt;&amp;nbsp; &lt;/SPAN&gt;is 1 test against threshold A */&lt;/P&gt;&lt;P&gt;Chip_HSADC_SetupDescEntry(LPC_ADCHS, 0, 6, (HSADC_DESC_CH(3) |&lt;/P&gt;&lt;P&gt;HSADC_DESC_BRANCH_NEXT | HSADC_DESC_MATCH(1) |&lt;/P&gt;&lt;P&gt;HSADC_DESC_THRESH_A | HSADC_DESC_RESET_TIMER));&lt;/P&gt;&lt;P&gt;/* 7 : mapped to input 4, branch to next descriptor after sample, match time&lt;/P&gt;&lt;P&gt;&lt;SPAN class="Apple-converted-space"&gt;&amp;nbsp; &lt;/SPAN&gt;is 1, test against threshold B, halt after conversion with interrupt, power&lt;/P&gt;&lt;P&gt;&lt;SPAN class="Apple-converted-space"&gt;&amp;nbsp; &amp;nbsp; &lt;/SPAN&gt;down after conversion */&lt;/P&gt;&lt;P&gt;Chip_HSADC_SetupDescEntry(LPC_ADCHS, 0, 7, (HSADC_DESC_CH(4) |&lt;/P&gt;&lt;P&gt;HSADC_DESC_HALT | HSADC_DESC_INT | HSADC_DESC_POWERDOWN |&lt;/P&gt;&lt;P&gt;HSADC_DESC_MATCH(1) | HSADC_DESC_THRESH_B | HSADC_DESC_RESET_TIMER));&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;/* Setup HSADC interrupts on group 0 - FIFO trip (full), FIFO overrun&lt;/P&gt;&lt;P&gt;&lt;SPAN class="Apple-converted-space"&gt;&amp;nbsp; &lt;/SPAN&gt;error, and descriptor statuses */&lt;/P&gt;&lt;P&gt;Chip_HSADC_EnableInts(LPC_ADCHS, 0, (HSADC_INT0_FIFO_FULL | HSADC_INT0_DSCR_DONE |&lt;/P&gt;&lt;P&gt;HSADC_INT0_FIFO_OVERFLOW | HSADC_INT0_DSCR_ERROR));&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;/* Setup HSADC threshold interrupts on group 1 */&lt;/P&gt;&lt;P&gt;Chip_HSADC_EnableInts(LPC_ADCHS, 1,&lt;/P&gt;&lt;P&gt;&lt;SPAN class="Apple-converted-space"&gt;&amp;nbsp; &lt;/SPAN&gt;(HSADC_INT1_THCMP_DCROSS(0) | HSADC_INT1_THCMP_DCROSS(1) |&lt;SPAN&gt;/* Inputs 0 and 1 below threshold below range */&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN class="Apple-converted-space"&gt;&amp;nbsp; &lt;/SPAN&gt;HSADC_INT1_THCMP_UCROSS(2) | HSADC_INT1_THCMP_UCROSS(3) |&lt;SPAN&gt;/* Inputs 2 and 3 above threshold range */&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;&lt;SPAN class="Apple-converted-space"&gt;&amp;nbsp; &lt;/SPAN&gt;HSADC_INT1_THCMP_DCROSS(4) | &lt;/SPAN&gt;/* Inputs 4 downward threshold crossing detect */&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;&lt;SPAN class="Apple-converted-space"&gt;&amp;nbsp; &lt;/SPAN&gt;HSADC_INT1_THCMP_UCROSS(5)));&lt;/SPAN&gt;/* Inputs 5 upward threshold crossing detect */&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;/* Enable HSADC interrupts in NVIC */&lt;/P&gt;&lt;P&gt;NVIC_EnableIRQ(&lt;SPAN&gt;&lt;I&gt;ADCHS_IRQn&lt;/I&gt;&lt;/SPAN&gt;);&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;/* Update descriptor tables - needed after updating any descriptors */&lt;/P&gt;&lt;P&gt;Chip_HSADC_UpdateDescTable(LPC_ADCHS, 0);&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;/* Setup periodic timer to perform software triggering */&lt;/P&gt;&lt;P&gt;timer_setup();&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;/* Sleep while waiting for conversions */&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;&lt;STRONG&gt;while&lt;/STRONG&gt;&lt;/SPAN&gt; (1) {&lt;/P&gt;&lt;P&gt;__WFI();&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;&lt;STRONG&gt;if&lt;/STRONG&gt;&lt;/SPAN&gt; (lastSample[0] &amp;gt;&amp;gt; 6 != stored_last_0 &amp;gt;&amp;gt; 6) {&lt;/P&gt;&lt;P&gt;DEBUGOUT(&lt;SPAN&gt;"ADC VALUE[0]: %08x\r\n"&lt;/SPAN&gt;, lastSample[0]);&lt;/P&gt;&lt;P&gt;stored_last_0 = lastSample[0];&lt;/P&gt;&lt;P&gt;}&lt;/P&gt;&lt;P&gt;}&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;/* Shutdown HSADC when done */&lt;/P&gt;&lt;P&gt;Chip_HSADC_DeInit(LPC_ADCHS);&lt;/P&gt;&lt;P&gt;}&lt;/P&gt;</description>
      <pubDate>Sat, 24 Oct 2020 00:13:07 GMT</pubDate>
      <guid>https://community.nxp.com/t5/LPC-Microcontrollers/Link2-software-how-to-modify-hsadc-code/m-p/1172636#M42689</guid>
      <dc:creator>QM</dc:creator>
      <dc:date>2020-10-24T00:13:07Z</dc:date>
    </item>
    <item>
      <title>Re: Link2 software, how to modify hsadc code?</title>
      <link>https://community.nxp.com/t5/LPC-Microcontrollers/Link2-software-how-to-modify-hsadc-code/m-p/1172960#M42698</link>
      <description>&lt;P&gt;Hello &lt;SPAN class="UserName lia-user-name lia-user-rank-Contributor-I lia-component-message-view-widget-author-username"&gt;&lt;A id="link_12" class="lia-link-navigation lia-page-link lia-user-name-link" style="color: #333f48;" href="https://community.nxp.com/t5/user/viewprofilepage/user-id/178394" target="_self"&gt;&lt;SPAN class=""&gt;QM&lt;/SPAN&gt;&lt;/A&gt;&lt;/SPAN&gt;,&lt;/P&gt;
&lt;P&gt;Recommend you first compile your project and run it , check whether there is problem,&lt;/P&gt;
&lt;P&gt;then you can show the problem to us.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Regards,&lt;/P&gt;
&lt;P&gt;Alice&lt;/P&gt;</description>
      <pubDate>Mon, 26 Oct 2020 08:30:09 GMT</pubDate>
      <guid>https://community.nxp.com/t5/LPC-Microcontrollers/Link2-software-how-to-modify-hsadc-code/m-p/1172960#M42698</guid>
      <dc:creator>Alice_Yang</dc:creator>
      <dc:date>2020-10-26T08:30:09Z</dc:date>
    </item>
    <item>
      <title>Re: Link2 software, how to modify hsadc code?</title>
      <link>https://community.nxp.com/t5/LPC-Microcontrollers/Link2-software-how-to-modify-hsadc-code/m-p/1176140#M42752</link>
      <description>&lt;P&gt;The above code compiles without error as it is just unmodified example code from the LPC_Open library. The point is I want some advice on modifying it to do what I outlined in the first post.&amp;nbsp;&lt;/P&gt;&lt;P&gt;I have done some more research and have found the following answers to my above questions (the numbers in this post correspond to the numbers in the first post).&lt;/P&gt;&lt;P&gt;1. The hsadc code I have shown above should work to sample at 40 Msps I just need to modify it to do the following,&lt;/P&gt;&lt;P&gt;2. Implement an FFT function from CMSIS DSP library such as &lt;A target="_blank"&gt;arm_cfft_init_q15. &lt;/A&gt;Still unsure which FFT function I need to use. The ADC is sampling at 12-bit so this one may be correct but it probably still needs to prepared in some way going from ADC to this function.&amp;nbsp;&lt;/P&gt;&lt;P&gt;3. I am going to try to use the usbd_rom_libusb example (again from LPC_Open like the hsadc code in the first post) to transfer the processed FFT data to a computer. This example code needs to be used in combination with the hsadc code.&amp;nbsp;&lt;/P&gt;&lt;P&gt;I will continue to update this with my progress and anything people can add to help would be very appreciated.&amp;nbsp;&lt;/P&gt;&lt;P&gt;Thank you,&amp;nbsp;&lt;/P&gt;&lt;P&gt;Quinn&lt;/P&gt;</description>
      <pubDate>Sat, 31 Oct 2020 02:59:48 GMT</pubDate>
      <guid>https://community.nxp.com/t5/LPC-Microcontrollers/Link2-software-how-to-modify-hsadc-code/m-p/1176140#M42752</guid>
      <dc:creator>QM</dc:creator>
      <dc:date>2020-10-31T02:59:48Z</dc:date>
    </item>
  </channel>
</rss>

