Ultra-Low Power Arm Cortex-M4 Darwin MCU EVM - Review

Table of contents

RoadTest: Ultra-Low Power Arm Cortex-M4 Darwin MCU EVM

Author: mahmood.hassan

Creation date:

Evaluation Type: Development Boards & Tools

Did you receive all parts the manufacturer stated would be included in the package?: True

What other parts do you consider comparable to this product?: ST Microelectronics - STM32L4 series of ultra-low-power MCUs Texas Instruments - MSP430 series ultra-low-power MCUs

What were the biggest problems encountered?: Earlier I had some issues with SDK but found a solution easily :)

Detailed Review:


Evaluation system for MAXIM Ultra-Low Power Arm Cortex-M4 Darwin MCU MAX32660 (MAX32660-EVSYS#MAX32660-EVSYS#) consist of following components

    • MAX 32660 Evaluation board with integrated debugger/programmer,
    • USB standard A to micro B cable,
    • Pin out diagram card

     MAX 32660 evaluation system is a low-cost, ultra-low power evaluation board for evaluating the MAXIM Ultra-Low Power Arm Cortex-M4 with FPU-Based Microcontroller MAX32660 which is specifically designed to fit in very small spaces with one of the world smallest MCU package (16pin WLP 1.6mmx1.6mm) but this board is equipped with 4mmx4mm 20pin TQFN package. MAXIM is targeting this MCU for the application/uses with ultra low power requirements along with space constraint i.e: wearable medical patches, fitness monitors, IOT, remote sensing, optical modules etc.

The evaluation board PCB is divided into two separable halves where one half has the application mcu while the other half is consist of MAX32625 based SWD/MAXDAP programmer and debugger.


Programmable Half
  • the MAX32660 as an application MCU
  • a user input button
  • an LED indicator connected to IO pin
  • each IO and PWR pin is broken out to breadboard compatible 0.1" DIL header
  • secure authenticator "MAXIM DS28E05 (1-Wire EEPROM)"
Programmer Half
  • MAX32525 based USB programmer/debugger
  • RGB led for programming status indication
  • MAXIM MAX8841 (1.2V, 1.8V & 3.3V) LDO regulator to power up the system
  • user selectable jumper for 1.8V or 3.3V operations
  • Rest or Programmer firmware update button


Thanks Element14 Community and MAXIM for providing me this opportunity.


The MAX32660 evaluation system is securely placed inside a strong, purposefully built cardboard box. The board itself is sealed inside a electrostatic shielding bag and then bubble wrapped along with pin-out reference card to keep the these safe from damage during transport or storage (when the kit is not in use it is recommended to keep it inside the box in order to prevent ESD and avoid interference).


First Impressions

     The MAX32660 board is designed quite well with breadboard compatible dual in line headers. This board is full of tiny (0402 and 0201) passive components which rarity among low cost MCU evaluation boards. The PCB quality is very impressive and every component is perfectly aligned and placed. Being an ESD sensitive device extra caution is required in the use of user input button because it is very small and placed close to IO pins. The jumper to select operating target voltage has long handle which makes it very easy to use. Overall MAXIM did a great job in packing everything nicely and securely. The inclusion of micro USB cable in its content enable user to start testing and developing right out of the box. The Pin out reference card is very helpful during connecting sensors or devices with it because there is no IO pins marking on this boards.

Below are the unboxing images of this evaluation system.


{gallery} Unboxing the MAXIM MAX32660 Evaluation System


IMAGE TITLE: Ultra-Low Power Arm Cortex-M4 Darwin MCU EVM - unboxing - E14 Box Top View


IMAGE TITLE: Ultra-Low Power Arm Cortex-M4 Darwin MCU EVM - unboxing - E14 Box Bottom View


IMAGE TITLE: Ultra-Low Power Arm Cortex-M4 Darwin MCU EVM - unboxing - E14 Box First Inside View


IMAGE TITLE: Ultra-Low Power Arm Cortex-M4 Darwin MCU EVM - unboxing - E14 Box First Inside View


IMAGE TITLE: Ultra-Low Power Arm Cortex-M4 Darwin MCU EVM - unboxing - Maxim Box First View


IMAGE TITLE: Ultra-Low Power Arm Cortex-M4 Darwin MCU EVM - unboxing - Maxim Box First Inside View


IMAGE TITLE: Ultra-Low Power Arm Cortex-M4 Darwin MCU EVM - unboxing - Maxim Box Contents


IMAGE TITLE: Ultra-Low Power Arm Cortex-M4 Darwin MCU EVM - unboxing - MAX32660 Evaluation System Pack Contents


IMAGE TITLE: Ultra-Low Power Arm Cortex-M4 Darwin MCU EVM - unboxing - MAX32660 Evaluation System First View


IMAGE TITLE: Ultra-Low Power Arm Cortex-M4 Darwin MCU EVM - unboxing - MAX32660 Evaluation System Side View


IMAGE TITLE: Ultra-Low Power Arm Cortex-M4 Darwin MCU EVM - unboxing - MAX32660 Evaluation System Top View


IMAGE TITLE:Ultra-Low Power Arm Cortex-M4 Darwin MCU EVM - unboxing - MAX32660 Evaluation System Bottom View


IMAGE TITLE: Ultra-Low Power Arm Cortex-M4 Darwin MCU EVM - unboxing - MAX32660 Evaluation System Pin-out Card


IMAGE TITLE: Ultra-Low Power Arm Cortex-M4 Darwin MCU EVM - unboxing - USB Cable


IMAGE TITLE: Ultra-Low Power Arm Cortex-M4 Darwin MCU EVM - unboxing - USB Cable


Key Features

Here is the list of few key features of this evaluation board.

  • MAX32660 Microcontroller
    • Arm Cortex-M4F, 96MHz
    • 256KB Flash Memory
    • 96KB SRAM
    • 16KB Instruction Cache
    • Two SPIs
    • Two I2Cs
    • Two UARTs
    • 14 GPIOs
  • DIP Breakout Board
    • 100mil Pitch Dual Inline Pin Headers
    • Breadboard Compatible
  • Integrated Peripherals
    • Red Indicator LED
    • User Pushbutton
  • MAX32625PICO-Based Debug Adapter
    • CMSIS-DAP SWD Debugger
    • Virtual UART Console

source: https://www.maximintegrated.com/en/products/microcontrollers/MAX32660-EVSYS.html/



The schematics of all the Important parts of MAX32660 side of this EVSYS board are shown below:


MAX32660 - UART1 (P0_10 and P0_11), SDA1 (P0_2, P0_3) and SWD(P0_0, P0_1) along with RSTN pin are connected to Debug Adapter.


The DS28E05 is a user-programmable EEPROM with write  protected  or  EPROM  emulation  mode  and guaranteed  unique  64-bit  ROM  identi-fication  number  (ROM  ID).  It communicates  over  Maxim  Integrated’s single contact 1-Wire® interface with  the  ROM  ID  acting  as  node  address  in  the  case of a multiple-device 1-Wire network.

source: https://datasheets.maximintegrated.com/en/ds/DS28E05.pdf


Both halves of this evaluation board can be separated and used as an individual parts if programming/debugging is required then you can use 10PIN J4 (SWD/MAXDAP) connector or by restoring the electrical connections between JH1 and JH2.


Software (IDEs)

Maxim 32660 is supported by:

  • IAR workbench
  • Keil µVision
  • Eclipse CDT (Open Source)

During this road test I will be using Keil µVision for examples testing and application development.

Both IAR workbench and Keil µVision suport MAX32660 MCU and CMSIS manager of each IDE has MAX32660 EVKIT (same as EVSYS but without integrated debug adapter) board support with examples (figures 1, 2 and 3).


Figure 1: CMSIS/PACK manager in both IAR workbench and Keil uVision IDE


Figure 2: IAR workbench - MAX32660 EVKIT example in CMSIS Manager


Figure 3: Keil µVision - MAX32660 EVKIT example in CMSIS Manager (aka Pack Installer)

Someone can also use eclipse CDT as development tool by simply downloading the Maxim MAX32660 SDK from their website (HERE) or if eclipse CDT is not already install then Maxim has already provided an easy to install bundle with fully configured IDE and SDK (HERE).

The SDK of MAX32660 contain more examples then shown IAR and Keil CMSIS manager. But on investigating I found out that .pdsc file is responsible for less example visibility to CMSIS manager and the actual downloaded examples are the same as contained in SDK (figure 4, 5 and 6).


Figure 4: Keil µVision - MAX32660 EVKIT example downloaded by CMSIS Manager (aka Pack Installer)


Figure 5: PDSC file from Maxim for MAX32660 EVKIT is responsible of less example visibility to CMSIS/PACK manager


Figure 6: Examples listed in PDSC file by Maxim for MAX32660 EVKIT along with other details

Running First Example (GPIO)

After downloading MAX32660 SDK for Keil µVision its time to run our first example. GPIO example is chosen as first example to load and test MAX32660 board. Its abstract file will tell us about the exact functionality of this example which is also given below:

GPIO Example functionality:

  -  Uses GPIO as inputs and outputs

  -  The example reads P0.12 (S1) and outputs the input value onto P0.13 (DS1). (Its S2 and D2 for MAX32660 EVSYS)

  -  Uses the GPIO IRQ and responds to events on P0.3.

     *  When P0.3 changes state, the IRQ handler toggles P0.2.

  -  Status is transmitted via stdout using UART0 to a host terminal at 115,200 Baud, 8N1. (Its UART1A not UART0 for MAX32660 EVSYS)

Now we have to have to connect a button on P0.3 and monitor the output on P0.2. Here our pin out reference card will come to our rescue to choose the correct IO pins (figure 7). But the image on our reference cards is confusing. Now are VDDIO and GND pins right next to MAXDAP half of our board or not and where exactly are the pin P0.2 and P0.3. To solve this mystery we can either take help of our DMM to find out exactly which pins are the VDDIO and GND or look into MAX32660 EVSYS datasheet and rest of it will be easy.

The guys from MAXIM have missed to update the title and picture on Pin-out reference card. And this outdated reference card with image of Evaluation Kit instead of Evaluation System (figure 8), will definitely make you little confuse even though datasheet is displaying correct image along with pin-out diagram (figure 9).


Figure 7: Pin-out Reference Card is for MAX32660 EVKIT not EVSYS


Figure 8: Actual Images of MAX32660 EVSYS and EVKIT

source: https://datasheets.maximintegrated.com/en/ds/MAX32660-EVSYS.pdf and https://datasheets.maximintegrated.com/en/ds/MAX32660EVKIT.pdf


Figure 9: MAX32660 EVSYS pin out diagram from its datasheet

After setting up the hardware to test GPIO example, build the code and it worked like a charm no warning or error (figure 10). So now before uploading it to our board we need to select the correct debug device from target options. Selected the "CMSIS-DAP Debugger" in debug tab of "Options for Target" (figure 11) and then select debugger setting from button next to debugger menu. Goto Flash Download tab and check "Reset and Run" option if its not already selected (figure 12). Now we are good to load our first onto our board.


Figure 10: Build Output of our first GPIO example


Figure 11: Examples listed in PDSC file by Maxim for MAX32660 EVKIT along with other details


Figure 12: Examples listed in PDSC file by Maxim for MAX32660 EVKIT along with other details

This example worked exactly as it was told in its abstract file with 1V8 and 3V3 target voltages. Similarly other example were tested and each example worked without any problem. Now its time to build our first project and test its capabilities and user-friendliness.

Another important thing to take care of during Example testing is always check the USE Micro LIB option in Target tab of "Options for Target" Dialog (figure 13) or else you will get an error message".\Objects\GPIO_Demo.axf: Error: L6218E: Undefined symbol $Super$$__main_after_scatterload (referred from system_max32660.o)." (figure 14).


Figure 13: In "Options for Target" dialog -and "Target" tab - Always check Use Micro LIB option to avoid any error during build


Figure 14: Error without enabling the Use Micro LIB option



Low Power Digital Proximity and Ambient Light Sensor (APDS9930)

As mentioned earlier, the one the main application of this board is wearable products. Then the best choice to reduce the power consumption in smart watches or fitness monitors, is using low power and miniature ambient light and proximity sensor to control the brightness and auto ON/OFF the display. I have bought few sensor for my another project so why not test it with this MAX32660 board.


Little bit about Sensor:     APDS-9930 is a digital I2C compatible ambient light sensor (ALS) with a low lux performance at 0.01 lux and proximity sensor with IR LED which operates well from bright sunlight to dark rooms. In addition, an internal state machine provides the ability to put the device into a low power mode in between ALS and proximity measurements providing very low average power consumption.

There is an Arduino library available for this module (HERE) and with some knowledge of c/c++ you can easily port it to other platform. With a little effort I have successfully make it compatible to our board with help of MAX32660 HAL communication libraries. The details of HAL I2C library functions used in APDS9930 library is given below (figure 15).


Figure 15:Board I2C communication library function used in APDS9930 library with details


Anyone can use it with other platforms by modifying these functions of APADS9930 library according to there platform:

bool read_byte(uint8_t reg, uint8_t *val);
bool write_byte(uint8_t reg, uint8_t val);
bool write_cmd(uint8_t val);


In order to use this sensor module first of all initialize any MAX32660 I2C interface in master and fast mode (400KHz Bus Speed) then initialize sensor and enable light and proximity sensor according to your requirement.

int error;
const sys_cfg_i2c_t sys_i2c_cfg = NULL; /* No system specific configuration needed. */
if((error = I2C_Init(I2C_MASTER, I2C_FAST_MODE, &sys_i2c_cfg)) != E_NO_ERROR) {
    printf("Error initializing I2C%d.  (Error code = %d)\n", I2C_MASTER_IDX, error);
    return 1;
if(!APDS9930_init())    // initialize the sensor
    printf("Init Error\n");
    printf("Init OK\n");

if(!enableLightSensor(false))    // enable the ALS
    printf("ALS Error\n");
    printf("ALS OK\n");

if(!enableProximitySensor(false))    // enable the proximity sensor
    printf("PMS Error\n");
    printf("PMS OK\n");


After initializing and enabling sensors you can read sensors and builtin ADC values using this functions.

bool readProximity(uint16_t *val);
bool readCh0Light(uint16_t *val);
bool readCh1Light(uint16_t *val);
bool readAmbientLightLuxF(float *val);
bool readAmbientLightLuxUL(unsigned long *val);


Every thing worked perfectly (figure 16).

(At this stage its not power optimized)


Figure 16: Board I2C communication library function used in APDS9930 library with details


Arduino library: https://github.com/Depau/APDS9930

APDS9930 sensor details: https://www.broadcom.com/products/optical-sensors/integrated-ambient-light-proximity-sensors/apds-9930

APDS9930 datasheet: https://docs.broadcom.com/docs/AV02-3190EN

OLED Display (0.96" 128x64 Yellow-Blue Color + SSD1306)

After successfully interfacing the APDS9930 sensor with MAX32660 its time to add a display to bring to view all sensor values or any other info. Here I choose OLED display instead of conventional 16x2 or TFT LCD due to its low power consumption (figure 17). There are some excellent libraries available for Arduino IDE and one of the best Arduino library with graphics support is u8g2. And there is also an c version of this library available to use with other IDE but require some coding to port it to new platform.


Figure 17: Available Display options to choose from for MAX32660


To successfully use the u8g2 with our MCU we need to add two new functions 1) GPIO and Delay callback 2) Hardware I2C Communication and template of these functions is given HERE. I have created a separate header file to define both these function and placed it inside u8g2 folder. After successfully porting to our platform, we can use this library in our program by including our newly created header file and defining a new display variable:

#include "u8g2_arm.h"
static u8g2_t u8g2;

And then setup the display by using the correct OLED setup function. For this our OLED the correct setup function is given below and complete list of setup functions can be found HERE.

u8g2_Setup_ssd1306_i2c_128x64_noname_1(u8g2, rotation, u8x8_byte_hw_i2c, uC specific)

After finding the correct setup function we can initialize the display in our code by calling these function after initializing the I2C interface and defining the GPIO and Delay callback + Hardware I2C communication function.

u8g2_Setup_ssd1306_i2c_128x64_noname_1(&u8g2, U8G2_R0, u8x8_byte_maxim_hw_i2c, u8x8_gpio_and_delay);
u8g2_SetPowerSave(&u8g2, 0);

IMPORTANT! In order to successfully build the code we need to choose at least level 2 (-O2) optimization otherwise it will give an error.


u8g2 Details:

github: https://github.com/olikraus/u8g2

wiki: https://github.com/olikraus/u8g2/wiki

porting to new MCU platform guide: https://github.com/olikraus/u8g2/wiki/Porting-to-new-MCU-platform

reference: https://github.com/olikraus/u8g2/wiki/u8g2reference

All available fonts: https://github.com/olikraus/u8g2/wiki/fntlistall

After successfully interfacing and testing both sensor and display with MAX32660, we can combine the both codes.


Figure 18: Interfacing of APDS9930 and OLED display with MAX32660




Comparison With ST NUCLEO-L432KC

NUCLEO-L432KC is an development board with one of ultra low power MCU from ST microelectronics. I found only this development board with almost similar core spec even though its max CPU operating frequency is 80Mhz. If we compare the specifications of both MCUs then MAX32660 is definitely winner in processing power, ultra small size, multiple packages, SRAM size and low cost otherwise ST32L432KC is winner in MCU various capabilities and functionalities. I am rating ST controller higher in LP consumption due to it various LP operating modes and Batch acquisition mode (BAM).


MCU Block Diagrams






CoreArm® 32-bit Cortex®-M4 with FPU
Frequency up to 96 MHz

Arm® 32-bit Cortex®-M4 CPU with FPU

Adaptive real-time accelerator (ART Accelerator™) allowing 0-wait-state execution from Flash memory

Frequency up to 80 MHz


100DMIPS and DSP instructions

Performance benchmark--

1.25 DMIPS/MHz (Drystone 2.1)

273.55 CoreMark® (3.42 CoreMark/MHz @ 80 MHz)

Energy benchmark--176.7 ULPBench® score
Clock Sources

Internal 96MHz high-frequency internal oscillator (HFIO)

Internal 8kHz nano-ring oscillator

External 32.768kHz crystal is required for RTC

32 kHz crystal oscillator for RTC (LSE)

Internal 16 MHz factory-trimmed RC (±1%)

Internal low-power 32 kHz RC (±5%)

Internal multispeed 100 kHz to 48 MHz oscillator, auto-trimmed by LSE (better than ±0.25 % accuracy)

Internal 48 MHz with clock recovery

2 PLLs for system clock, USB, audio, ADC


256KB Flash Memory

96KB SRAM, Optionally Preserved in Lowest Power Backup Mode

16KB Instruction Cache

Up to 256 KB single bank Flash, proprietary code readout protection

64 KB of SRAM including 16 KB with hardware parity check

Quad SPI memory interface

Power Management

1.71 V to 3.6 V power supply

Low 1.1V VCORE Supply Voltage in Dual Supply Mode

85μA/MHz Active Executing from Flash

2μA Full Memory Retention Power in Backup Mode at VDD = 1.8V

570nA Ultra-Low Power RTC at VDD = 1.8V

Internal LDO Provides Operation from Single Supply

1.71 V to 3.6 V power supply

84 μA/MHz run mode

1.0 μA Stop 2 mode, 1.28 μA with RTC

280 nA Standby mode with RTC

28 nA Standby mode (2 wakeup pins)

8 nA Shutdown mode (2 wakeup pins)

Batch acquisition mode (BAM)

4 μs wakeup from Stop mode
IO pinsUp to 14 General-Purpose I/O PinsUp to 26 fast I/Os, most 5 V-tolerant
Analog Peripherals--

1x 12-bit ADC 5 Msps, up to 16-bit with hardware oversampling, 200 μA/Msps

2x 12-bit DAC output channels, low-power sample and hold

1x operational amplifier with built-in PGA

2x ultra-low-power comparators


5x timers:

3x 32-bit

1x watchdog

1x SysTick timer

11x timers:

1x 16-bit advanced motor-control

1x 32-bit

2x 16-bit general purpose

2x 16-bit basic

2x low-power 16-bit timers (available in Stop mode)

2x watchdogs

1x SysTick timer

communication interfaces2x SPI Master/Slave
1x I2S Master/Slave
2x UARTs
2x I2C Master/Slave, 3.4Mbps High Speed

USB 2.0 full-speed crystal less solution with LPM and BCD

1x SAI (serial audio interface)

2x I2C FM+(1 Mbit/s), SMBus/PMBus

3x USARTs (ISO 7816, LIN, IrDA, modem)

1x LPUART (Stop 2 wake-up)

2x SPIs (and 1x Quad SPI)

CAN (2.0B Active)

SWPMI single wire protocol master I/F

IRTIM (Infrared interface)

DMA4-channel DMA controller14-channel DMA controller
RTCRTC with subsecond alarm and calibrationRTC with HW calendar, alarms and calibration
CRC calculation unitNOYES
Special Function IONOUp to 3 capacitive sensing channels

16 WLP (1.6mm x 1.6mm x 0.65mm)

20 TQFN-EP (4mm x 4mm x 0.75mm)

24 TQFN-EP (3mm x 3mm x 0.75mm)

UFQFPN 32 (5mm x 5mm x 0.55mm)
Operating Temperature-40°C to +105°C-40 °C to 85/105/125 °C temperature range
Operating Modes


Product LinkProduct Link


Product LinkProduct Link


When it come to dev-boards then for me MAX32660 is better because of its very simple design and separable debug part even though Nucleo board has well known Arduino Nano form factor and almost compatible with it. But the main reason of placing Nucleo board in second place is adding/removing the onboard component to take full advantages of different communication peripherals and inseparable ST-Link part unlike Nucleo64 and 144 boards. And if we talk about the various easy to use IDEs and online support then ST is way ahead of MAXIM especially with Arduino and mBed IDEs support for these particular boards.


{gallery} MAX32660-EVSYS and NUCLEO-L432KC








IMAGE TITLE: MAX32660-EVSYS V NUCLEO-L432KC - Pin-out Diagrams





Virtual UART Console


Virtual COM port

Integrated Peripherals

User LED

User Push button

User LED
Board expansion connector

100mil Pitch Dual Inline Pin Headers

Breadboard Compatible

Arduino™ Nano

100mil Pitch Dual Inline Pin Headers

Breadboard Compatible

Power-supply options


External sources

User Selectable 1V8 or 3V3 operation


External sources

Fixed 3V3 operation

IDEsIAR™, Keil®, GCC-based IDEsIAR™, Keil®, GCC-based IDEs, Arm® Mbed™, Arduino


$15.96 Product LinkProduct Link
$12.45 Product LinkProduct Link





The MAX32660 EVSYS is one of the easy to use ARM development board with MCU clocked at 96Mhz + FPU which make it powerful enough to handle fairly complex tasks. The best thing of this tiny power house is the simplicity where every IO pin is available on 0.1" header. The SDK contains all the necessary configuration, peripherals, communication and BSP files with every bit of required information to start with. One can easily build any project by either modifying the given examples or through CMSIS manager. The only thing that its SDK lack is RTOS support. The easy to understandable board support files make it very easy to learn and use for someone with some knowledge of MCU programming. One of the package of the MAX32660 is really small (16 WLP 1.6mm x 1.6mm) and sound very attractive but its PCB designing and manufacturing will not be cost effective if there is no space constraint while other two (20 and 24 pin TQFN) packages are commonly used packages for ICs with easy to built and assemble PCB.

The only down side of this MCU is no builtin ADC. But the lack of ADC peripherals, unlike other arm ultra power MCU from ST and TI, should not be a big concern for modern day LP application designer because one can easily find any type of sensor or control module with I2C or SPI interface. Nevertheless, its a good and easy to use MCU board with several digital communication interfaces and it can easily be used by the newbies in the ARM world but not in embedded development.

One little request to MAXIM guys, please update the title and image on pin out reference card.


Few suggestion to make this board more user friendly;

     Add the Absolute Maximum Ratings and Recommended Operating Conditions of this boards in its datasheet.

     Mention the maximum/recommended current capabilities of VDDIO pin (onboard MAX8841 LDO) in MAX32660EVSYS datasheet because it helps the developer to know either he the can power up certain sensor through it during development or not.

     Add some sort of silk screen marking around IO pins to make it easy to use without pin-out diagram i.e: square or dot around supply pins etc.

     If possible, add a small jumper to measure the MCU current like ST Nucleo boards (figure xx) or anything else because this is an ultra low power MCU board and therefore lots of current measurements will be taken by the users during product development phase.


Figure xx: IDD jumper to measure MCU current consumption

I am simply fall in love with this board and once again thanks to Element14 communicty and MAXIM for organizing this RoadTest.


MAX32660 Datasheet: https://datasheets.maximintegrated.com/en/ds/MAX32660.pdf

MAX32660 EVSYS Datasheet: https://datasheets.maximintegrated.com/en/ds/MAX32660-EVSYS.pdf

MAX32660 User Guide: http://pdfserv.maximintegrated.com/en/an/AN6659.pdf