Adafruit Feather M0 Basic Proto
Created by lady ada
https://learn.adafruit.com/adafruit-feather-m0-basic-proto
Last updated on 2022-07-26 04:35:21 PM EDT
©Adafruit Industries
Page 1 of 50
Table of Contents
Overview
5
Pinouts
8
• Power Pins
• Logic pins
• Other Pins!
Assembly
•
•
•
•
•
•
•
•
•
Header Options!
Soldering in Plain Headers
Prepare the header strip:
Add the breakout board:
And Solder!
Soldering on Female Header
Tape In Place
Flip & Tack Solder
And Solder!
Power Management
•
•
•
•
•
11
20
Battery + USB Power
Power Supplies
Measuring Battery
ENable pin
Alternative Power Options
Arduino IDE Setup
25
Using with Arduino IDE
27
•
•
•
•
•
•
•
•
Install SAMD Support
Install Adafruit SAMD
Install Drivers (Windows 7 & 8 Only)
Blink
Successful Upload
Compilation Issues
Manually bootloading
Ubuntu & Linux Issue Fix
Adapting Sketches to M0 & M4
•
•
•
•
•
•
•
•
•
•
•
•
•
•
35
Analog References
Pin Outputs & Pullups
Serial vs SerialUSB
AnalogWrite / PWM on Feather/Metro M0
analogWrite() PWM range
analogWrite() DAC on A0
Missing header files
Bootloader Launching
Aligned Memory Access
Floating Point Conversion
How Much RAM Available?
Storing data in FLASH
Pretty-Printing out registers
M4 Performance Options
©Adafruit Industries
Page 2 of 50
•
•
•
•
•
CPU Speed (overclocking)
Optimize
Cache
Max SPI and Max QSPI
Enabling the Buck Converter on some M4 Boards
Feather HELP!
43
Downloads
48
•
•
•
•
Datasheets
Firmware
Schematic
Fabrication Print
©Adafruit Industries
Page 3 of 50
©Adafruit Industries
Page 4 of 50
Overview
Feather is the new development board from Adafruit, and like it's namesake it is thin,
light, and lets you fly! We designed Feather to be a new standard for portable
microcontroller cores.
At the Feather M0's heart is an ATSAMD21G18 ARM Cortex M0 processor, clocked at
48 MHz and at 3.3V logic, the same one used in the new Arduino Zero (http://
adafru.it/2843). This chip has a whopping 256K of FLASH (8x more than the
Atmega328 or 32u4) and 32K of RAM (16x as much)! This chip comes with built in USB
so it has USB-to-Serial program & debug capability built in with no need for an FTDIlike chip.
©Adafruit Industries
Page 5 of 50
To make it easy to use for portable projects, we added a connector for any of our 3.7V
Lithium polymer batteries and built in battery charging. You don't need a battery, it will
run just fine straight from the micro USB connector. But, if you do have a battery, you
can take it on the go, then plug in the USB to recharge. The Feather will automatically
switch over to USB power when its available. We also tied the battery thru a divider to
an analog pin, so you can measure and monitor the battery voltage to detect when
you need a recharge.
©Adafruit Industries
Page 6 of 50
Here's some handy specs!
• Measures 2.0" x 0.9" x 0.28" (51mm x 23mm x 8mm) without headers soldered in
• Light as a (large?) feather - 4.6 grams
• ATSAMD21G18 @ 48MHz with 3.3V logic/power
• 256KB of FLASH + 32KB of RAM
• 32.768 KHz crystal for clock generation & RTC
• 3.3V regulator with 500mA peak current output
• USB native support, comes with USB bootloader and serial port debugging
• You also get tons of pins - 20 GPIO pins
• Hardware Serial, hardware I2C, hardware SPI support
• PWM outputs on all pins
• 6 x 12-bit analog inputs
• 1 x 10-bit analog output (DAC)
• Built in 100mA lipoly charger with charging status indicator LED
• Pin #13 red LED for general purpose blinking
• Power/enable pin
• 4 mounting holes
• Reset button
The Feather M0 Basic Proto has some extra space left over, so we give you a tiny little
prototyping area. If you just need to attach a button or sensor, you may be able to
skip out on a breadboard and wire it directly on there.
©Adafruit Industries
Page 7 of 50
Comes fully assembled and tested, with a USB bootloader that lets you quickly use it
with the Arduino IDE. We also toss in some header so you can solder it in and plug
into a solderless breadboard. Lipoly battery and USB cable not included (but we do
have lots of options in the shop if you'd like!)
Pinouts
Click here to view a PDF version of the pinout diagram (https://adafru.it/ZDD)
The Feather M0 Basic is chock-full of microcontroller goodness. There's also a lot of
pins and ports. We'll take you a tour of them now!
©Adafruit Industries
Page 8 of 50
Power Pins
• GND - this is the common ground for all power and logic
• BAT - this is the positive voltage to/from the JST jack for the optional Lipoly
battery
• USB - this is the positive voltage to/from the micro USB jack if connected
• EN - this is the 3.3V regulator's enable pin. It's pulled up, so connect to ground
to disable the 3.3V regulator
• 3V - this is the output from the 3.3V regulator, it can supply 500mA peak
Logic pins
This is the general purpose I/O pin set for the microcontroller.
All logic is 3.3V
Nearly all pins can do PWM output
All pins can be interrupt inputs
• #0 / RX - GPIO #0, also receive (input) pin for Serial1 (hardware UART), also can
be analog input
• #1 / TX - GPIO #1, also transmit (output) pin for Serial1, also can be analog input
• #20 / SDA - GPIO #20, also the I2C (Wire) data pin. There's no pull up on this pin
by default so when using with I2C, you may need a 2.2K-10K pullup.
• #21 / SCL - GPIO #21, also the I2C (Wire) clock pin. There's no pull up on this pin
by default so when using with I2C, you may need a 2.2K-10K pullup.
• #5 - GPIO #5
• #6 - GPIO #6
• #9 - GPIO #9, also analog input A7. This analog input is connected to a voltage
divider for the lipoly battery so be aware that this pin naturally 'sits' at around
2VDC due to the resistor divider
©Adafruit Industries
Page 9 of 50
• #10 - GPIO #10
• #11 - GPIO #11
• #12 - GPIO #12
• #13 - GPIO #13 and is connected to the red LED next to the USB jack
• A0 - This pin is analog input A0 but is also an analog output due to having a
DAC (digital-to-analog converter). You can set the raw voltage to anything from 0
to 3.3V, unlike PWM outputs this is a true analog output
• A1 thru A5 - These are each analog input as well as digital I/O pins.
• SCK/MOSI/MISO (GPIO 24/23/22)- These are the hardware SPI pins, you can use
them as everyday GPIO pins (but recommend keeping them free as they are
best used for hardware SPI connections for high speed.
Other Pins!
• RST - this is the Reset pin, tie to ground to manually reset the AVR, as well as
launch the bootloader manually
• ARef - the analog reference pin. Normally the reference voltage is the same as
the chip logic voltage (3.3V) but if you need an alternative analog reference,
connect it to this pin and select the external AREF in your firmware. Can't go
higher than 3.3V!
• SWCLK & SWDIO - These pads on the bottom are used to program the chip.
They can also be connected to an SWD debugger.
©Adafruit Industries
Page 10 of 50
Assembly
We ship Feathers fully tested but without headers attached - this gives you the most
flexibility on choosing how to use and configure your Feather
Header Options!
Before you go gung-ho on soldering, there's a few options to consider!
The first option is soldering in plain male
headers, this lets you plug in the Feather
into a solderless breadboard
©Adafruit Industries
Page 11 of 50
Another option is to go with socket female
headers. This won't let you plug the
Feather into a breadboard but it will let
you attach featherwings very easily
©Adafruit Industries
Page 12 of 50
We also have 'slim' versions of the female
headers, that are a little shorter and give a
more compact shape
©Adafruit Industries
Page 13 of 50
Finally, there's the "Stacking Header"
option. This one is sort of the best-of-bothworlds. You get the ability to plug into a
solderless breadboard and plug a
featherwing on top. But its a little bulky
Soldering in Plain Headers
Prepare the header strip:
Cut the strip to length if necessary. It will
be easier to solder if you insert it into a
breadboard - long pins down
©Adafruit Industries
Page 14 of 50
Add the breakout board:
Place the breakout board over the pins so
that the short pins poke through the
breakout pads
And Solder!
Be sure to solder all pins for reliable
electrical contact.
(For tips on soldering, be sure to check out
our Guide to Excellent Soldering (https://
adafru.it/aTk)).
©Adafruit Industries
Page 15 of 50
Solder the other strip as well.
©Adafruit Industries
Page 16 of 50
You're done! Check your solder joints
visually and continue onto the next steps
Soldering on Female Header
Tape In Place
For sockets you'll want to tape them in
place so when you flip over the board they
don't fall out
©Adafruit Industries
Page 17 of 50
Flip & Tack Solder
After flipping over, solder one or two
points on each strip, to 'tack' the header in
place
©Adafruit Industries
Page 18 of 50
And Solder!
Be sure to solder all pins for reliable
electrical contact.
(For tips on soldering, be sure to check out
our Guide to Excellent Soldering (https://
adafru.it/aTk)).
©Adafruit Industries
Page 19 of 50
You're done! Check your solder joints
visually and continue onto the next steps
Power Management
©Adafruit Industries
Page 20 of 50
Battery + USB Power
We wanted to make our Feather boards easy to power both when connected to a
computer as well as via battery.
There's two ways to power a Feather:
1. You can connect with a USB cable (just plug into the jack) and the Feather will
regulate the 5V USB down to 3.3V.
2. You can also connect a 4.2/3.7V Lithium Polymer (LiPo/LiPoly) or Lithium Ion
(LiIon) battery to the JST jack. This will let the Feather run on a rechargeable
battery.
When the USB power is powered, it will automatically switch over to USB for power,
as well as start charging the battery (if attached). This happens 'hot-swap' style so you
can always keep the LiPoly connected as a 'backup' power that will only get used
when USB power is lost.
The JST connector polarity is matched to Adafruit LiPoly batteries. Using wrong
polarity batteries can destroy your Feather.
The above shows the Micro USB jack (left), LiPoly JST jack (top left), as well as the
3.3V regulator and changeover diode (just to the right of the JST jack) and the LiPoly
charging circuitry (to the right of the Reset button).
There's also a CHG LED next to the USB jack, which will light up while the battery is
charging. This LED might also flicker if the battery is not connected, it's normal.
The charge LED is automatically driven by the LiPoly charger circuit. It will try to
detect a battery and is expecting one to be attached. If there isn't one it may
©Adafruit Industries
Page 21 of 50
flicker once in a while when you use power because it's trying to charge a (nonexistent) battery. It's not harmful, and its totally normal!
Power Supplies
You have a lot of power supply options here! We bring out the BAT pin, which is tied
to the LiPoly JST connector, as well as USB which is the +5V from USB if connected.
We also have the 3V pin which has the output from the 3.3V regulator. We use a
500mA peak regulator. While you can get 500mA from it, you can't do it continuously
from 5V as it will overheat the regulator.
It's fine for, say, powering an ESP8266 WiFi chip or XBee radio though, since the
current draw is 'spikey' & sporadic.
Measuring Battery
If you're running off of a battery, chances are you wanna know what the voltage is at!
That way you can tell when the battery needs recharging. LiPoly batteries are 'maxed
out' at 4.2V and stick around 3.7V for much of the battery life, then slowly sink down
to 3.2V or so before the protection circuitry cuts it off. By measuring the voltage you
can quickly tell when you're heading below 3.7V.
To make this easy we stuck a double-100K resistor divider on the BAT pin, and
connected it to D9 (a.k.a analog #7 A7).
©Adafruit Industries
Page 22 of 50
In Arduino, you can read this pin's voltage, then double it, to get the battery voltage.
// Arduino Example Code
#define VBATPIN A7
float measuredvbat = analogRead(VBATPIN);
measuredvbat *= 2;
// we divided by 2, so multiply back
measuredvbat *= 3.3; // Multiply by 3.3V, our reference voltage
measuredvbat /= 1024; // convert to voltage
Serial.print("VBat: " ); Serial.println(measuredvbat);
For CircuitPython, we've written a get_voltage() helper function to do the math for
you. All you have to do is call the function, provide the pin and print the results.
# SPDX-FileCopyrightText: 2018 Kattni Rembor for Adafruit Industries
#
# SPDX-License-Identifier: MIT
import board
import analogio
vbat_voltage = analogio.AnalogIn(board.D9)
def get_voltage(pin):
return (pin.value * 3.3) / 65536 * 2
battery_voltage = get_voltage(vbat_voltage)
print("VBat voltage: {:.2f}".format(battery_voltage))
ENable pin
If you'd like to turn off the 3.3V regulator, you can do that with the EN(able) pin. Simply
tie this pin to Ground and it will disable the 3V regulator. The BAT and USB pins will
still be powered.
©Adafruit Industries
Page 23 of 50
Alternative Power Options
The two primary ways for powering a feather are a 3.7/4.2V LiPo battery plugged into
the JST port or a USB power cable.
If you need other ways to power the Feather, here's what we recommend:
• For permanent installations, a 5V 1A USB wall adapter (https://adafru.it/duP) will
let you plug in a USB cable for reliable power
• For mobile use, where you don't want a LiPoly, use a USB battery pack! (https://
adafru.it/e2q)
• If you have a higher voltage power supply, use a 5V buck converter (https://
adafru.it/DHs) and wire it to a USB cable's 5V and GND input (https://adafru.it/
DHu)
Here's what you cannot do:
• Do not use alkaline or NiMH batteries and connect to the battery port - this will
destroy the LiPoly charger and there's no way to disable the charger
• Do not use 7.4V RC batteries on the battery port - this will destroy the board
The Feather is not designed for external power supplies - this is a design decision to
make the board compact and low cost. It is not recommended, but technically
possible:
• Connect an external 3.3V power supply to the 3V and GND pins. Not
recommended, this may cause unexpected behavior and the EN pin will no
longer. Also this doesn't provide power on BAT or USB and some Feathers/
©Adafruit Industries
Page 24 of 50
Wings use those pins for high current usages. You may end up damaging your
Feather.
• Connect an external 5V power supply to the USB and GND pins. Not
recommended, this may cause unexpected behavior when plugging in the USB
port because you will be back-powering the USB port, which could confuse or
damage your computer.
Arduino IDE Setup
The first thing you will need to do is to download the latest release of the Arduino
IDE. You will need to be using version 1.8 or higher for this guide
Arduino IDE Download
https://adafru.it/f1P
After you have downloaded and installed the latest version of Arduino IDE, you will
need to start the IDE and navigate to the Preferences menu. You can access it from
the File menu in Windows or Linux, or the Arduino menu on OS X.
A dialog will pop up just like the one shown below.
©Adafruit Industries
Page 25 of 50
We will be adding a URL to the new Additional Boards Manager URLs option. The list
of URLs is comma separated, and you will only have to add each URL once. New
Adafruit boards and updates to existing boards will automatically be picked up by the
Board Manager each time it is opened. The URLs point to index files that the Board
Manager uses to build the list of available & installed boards.
To find the most up to date list of URLs you can add, you can visit the list of third party
board URLs on the Arduino IDE wiki (https://adafru.it/f7U). We will only need to add
one URL to the IDE in this example, but you can add multiple URLS by separating
them with commas. Copy and paste the link below into the Additional Boards
Manager URLs option in the Arduino IDE preferences.
https://adafruit.github.io/arduino-board-index/
package_adafruit_index.json
©Adafruit Industries
Page 26 of 50
Here's a short description of each of the Adafruit supplied packages that will be
available in the Board Manager when you add the URL:
• Adafruit AVR Boards - Includes support for Flora, Gemma, Feather 32u4,
ItsyBitsy 32u4, Trinket, & Trinket Pro.
• Adafruit SAMD Boards - Includes support for Feather M0 and M4, Metro M0 and
M4, ItsyBitsy M0 and M4, Circuit Playground Express, Gemma M0 and Trinket
M0
• Arduino Leonardo & Micro MIDI-USB - This adds MIDI over USB support for the
Flora, Feather 32u4, Micro and Leonardo using the arcore project (https://
adafru.it/eSI).
If you have multiple boards you want to support, say ESP8266 and Adafruit, have
both URLs in the text box separated by a comma (,)
Once done click OK to save the new preference settings. Next we will look at
installing boards with the Board Manager.
Now continue to the next step to actually install the board support package!
Using with Arduino IDE
The Feather/Metro/Gemma/QTPy/Trinket M0 and M4 use an ATSAMD21 or ATSAMD51
chip, and you can pretty easily get it working with the Arduino IDE. Most libraries
(including the popular ones like NeoPixels and display) will work with the M0 and M4,
especially devices & sensors that use I2C or SPI.
Now that you have added the appropriate URLs to the Arduino IDE preferences in the
previous page, you can open the Boards Manager by navigating to the Tools->Board
menu.
©Adafruit Industries
Page 27 of 50
Once the Board Manager opens, click on the category drop down menu on the top
left hand side of the window and select All. You will then be able to select and install
the boards supplied by the URLs added to the preferences.
Remember you need SETUP the Arduino IDE to support our board packages see the previous page on how to add adafruit's URL to the preferences
Install SAMD Support
First up, install the latest Arduino SAMD Boards (version 1.6.11 or later)
You can type Arduino SAMD in the top search bar, then when you see the entry, click I
nstall
Install Adafruit SAMD
Next you can install the Adafruit SAMD package to add the board file definitions
Make sure you have Type All selected to the left of the Filter your search... box
You can type Adafruit SAMD in the top search bar, then when you see the entry, click I
nstall
©Adafruit Industries
Page 28 of 50
Even though in theory you don't need to - I recommend rebooting the IDE
Quit and reopen the Arduino IDE to ensure that all of the boards are properly
installed. You should now be able to select and upload to the new boards listed in the
Tools->Board menu.
Select the matching board, the current options are:
• Feather M0 (for use with any Feather M0 other than the Express)
• Feather M0 Express
• Metro M0 Express
• Circuit Playground Express
• Gemma M0
• Trinket M0
• QT Py M0
• ItsyBitsy M0
• Hallowing M0
• Crickit M0 (this is for direct programming of the Crickit, which is probably not
what you want! For advanced hacking only)
• Metro M4 Express
• Grand Central M4 Express
• ItsyBitsy M4 Express
• Feather M4 Express
• Trellis M4 Express
• PyPortal M4
• PyPortal M4 Titano
• PyBadge M4 Express
• Metro M4 Airlift Lite
• PyGamer M4 Express
• MONSTER M4SK
©Adafruit Industries
Page 29 of 50
• Hallowing M4
• MatrixPortal M4
• BLM Badge
Install Drivers (Windows 7 & 8 Only)
When you plug in the board, you'll need to possibly install a driver
Click below to download our Driver Installer
Download Latest Adafruit Drivers
package
https://adafru.it/mb8
Download and run the installer
Run the installer! Since we bundle the SiLabs and FTDI drivers as well, you'll need to
click through the license
©Adafruit Industries
Page 30 of 50
Select which drivers you want to install, the defaults will set you up with just about
every Adafruit board!
Click Install to do the installin'
©Adafruit Industries
Page 31 of 50
Blink
Now you can upload your first blink sketch!
Plug in the M0 or M4 board, and wait for it to be recognized by the OS (just takes a
few seconds). It will create a serial/COM port, you can now select it from the dropdown, it'll even be 'indicated' as Trinket/Gemma/Metro/Feather/ItsyBitsy/Trellis!
Please note, the QT Py and Trellis M4 Express are two of our very few boards that
does not have an onboard pin 13 LED so you can follow this section to practice
uploading but you wont see an LED blink!
Now load up the Blink example
// the setup function runs once when you press reset or power the board
void setup() {
// initialize digital pin 13 as an output.
pinMode(13, OUTPUT);
}
// the loop function runs over and over again forever
©Adafruit Industries
Page 32 of 50
void loop() {
digitalWrite(13, HIGH);
delay(1000);
digitalWrite(13, LOW);
delay(1000);
}
//
//
//
//
turn
wait
turn
wait
the
for
the
for
LED on (HIGH is the voltage level)
a second
LED off by making the voltage LOW
a second
And click upload! That's it, you will be able to see the LED blink rate change as you
adapt the delay() calls.
If you are having issues, make sure you selected the matching Board in the menu
that matches the hardware you have in your hand.
Successful Upload
If you have a successful upload, you'll get a bunch of red text that tells you that the
device was found and it was programmed, verified & reset
After uploading, you may see a message saying "Disk Not Ejected Properly" about the
...BOOT drive. You can ignore that message: it's an artifact of how the bootloader and
uploading work.
Compilation Issues
If you get an alert that looks like
Cannot run program "{runtime.tools.arm-none-eabi-gcc.path}\bin\arm-non-eabi-g++"
©Adafruit Industries
Page 33 of 50
Make sure you have installed the Arduino SAMD boards package, you need both Ard
uino & Adafruit SAMD board packages
Manually bootloading
If you ever get in a 'weird' spot with the bootloader, or you have uploaded code that
crashes and doesn't auto-reboot into the bootloader, click the RST button twice (like a
double-click)to get back into the bootloader.
The red LED will pulse and/or RGB LED will be green, so you know that its in
bootloader mode.
Once it is in bootloader mode, you can select the newly created COM/Serial port and
re-try uploading.
You may need to go back and reselect the 'normal' USB serial port next time you want
to use the normal upload.
Ubuntu & Linux Issue Fix
Follow the steps for installing Adafruit's udev rules on this page. (https://adafru.it/iOE)
©Adafruit Industries
Page 34 of 50
Adapting Sketches to M0 & M4
The ATSAMD21 and 51 are very nice little chips, but fairly new as Arduino-compatible
cores go. Most sketches & libraries will work but here’s a collection of things we
noticed.
The notes below cover a range of Adafruit M0 and M4 boards, but not every rule will
apply to every board (e.g. Trinket and Gemma M0 do not have ARef, so you can skip
the Analog References note!).
Analog References
If you'd like to use the ARef pin for a non-3.3V analog reference, the code to use is
analogReference(AR_EXTERNAL) (it's AR_EXTERNAL not EXTERNAL)
Pin Outputs & Pullups
The old-style way of turning on a pin as an input with a pullup is to use
pinMode(pin, INPUT)
digitalWrite(pin, HIGH)
This is because the pullup-selection register on 8-bit AVR chips is the same as the
output-selection register.
For M0 & M4 boards, you can't do this anymore! Instead, use:
pinMode(pin, INPUT_PULLUP)
Code written this way still has the benefit of being backwards compatible with AVR.
You don’t need separate versions for the different board types.
Serial vs SerialUSB
99.9% of your existing Arduino sketches use Serial.print to debug and give output. For
the Official Arduino SAMD/M0 core, this goes to the Serial5 port, which isn't exposed
on the Feather. The USB port for the Official Arduino M0 core is called SerialUSB
instead.
©Adafruit Industries
Page 35 of 50
In the Adafruit M0/M4 Core, we fixed it so that Serial goes to USB so it will
automatically work just fine.
However, on the off chance you are using the official Arduino SAMD core and not the
Adafruit version (which really, we recommend you use our version because it’s been
tuned to our boards), and you want your Serial prints and reads to use the USB port,
use SerialUSB instead of Serial in your sketch.
If you have existing sketches and code and you want them to work with the M0
without a huge find-replace, put
#if defined(ARDUINO_SAMD_ZERO) && defined(SERIAL_PORT_USBVIRTUAL)
// Required for Serial on Zero based boards
#define Serial SERIAL_PORT_USBVIRTUAL
#endif
right above the first function definition in your code. For example:
AnalogWrite / PWM on Feather/Metro M0
After looking through the SAMD21 datasheet, we've found that some of the options
listed in the multiplexer table don't exist on the specific chip used in the Feather M0.
For all SAMD21 chips, there are two peripherals that can generate PWM signals: The
Timer/Counter (TC) and Timer/Counter for Control Applications (TCC). Each SAMD21
has multiple copies of each, called 'instances'.
Each TC instance has one count register, one control register, and two output
channels. Either channel can be enabled and disabled, and either channel can be
inverted. The pins connected to a TC instance can output identical versions of the
same PWM waveform, or complementary waveforms.
©Adafruit Industries
Page 36 of 50
Each TCC instance has a single count register, but multiple compare registers and
output channels. There are options for different kinds of waveform, interleaved
switching, programmable dead time, and so on.
The biggest members of the SAMD21 family have five TC instances with two
'waveform output' (WO) channels, and three TCC instances with eight WO channels:
• TC[0-4],WO[0-1]
• TCC[0-2],WO[0-7]
And those are the ones shown in the datasheet's multiplexer tables.
The SAMD21G used in the Feather M0 only has three TC instances with two output
channels, and three TCC instances with eight output channels:
• TC[3-5],WO[0-1]
• TCC[0-2],WO[0-7]
Tracing the signals to the pins broken out on the Feather M0, the following pins can't
do PWM at all:
• Analog pin A5
The following pins can be configured for PWM without any signal conflicts as long as
the SPI, I2C, and UART pins keep their protocol functions:
• Digital pins 5, 6, 9, 10, 11, 12, and 13
• Analog pins A3 and A4
If only the SPI pins keep their protocol functions, you can also do PWM on the
following pins:
• TX and SDA (Digital pins 1 and 20)
analogWrite() PWM range
On AVR, if you set a pin's PWM with analogWrite(pin, 255) it will turn the pin fully
HIGH. On the ARM cortex, it will set it to be 255/256 so there will be very slim but
©Adafruit Industries
Page 37 of 50
still-existing pulses-to-0V. If you need the pin to be fully on, add test code that checks
if you are trying to analogWrite(pin, 255) and, instead, does a
digitalWrite(pin, HIGH)
analogWrite() DAC on A0
If you are trying to use analogWrite() to control the DAC output on A0, make sure
you do not have a line that sets the pin to output. Remove: pinMode(A0, OUTPUT) .
Missing header files
There might be code that uses libraries that are not supported by the M0 core. For
example if you have a line with
#include
you'll get an error that says
fatal error: util/delay.h: No such file or directory
#include
^
compilation terminated.
Error compiling.
In which case you can simply locate where the line is (the error will give you the file
name and line number) and 'wrap it' with #ifdef's so it looks like:
#if !defined(ARDUINO_ARCH_SAM) && !defined(ARDUINO_ARCH_SAMD) && !
defined(ESP8266) && !defined(ARDUINO_ARCH_STM32F2)
#include <util/delay.h>
#endif
The above will also make sure that header file isn't included for other architectures
If the #include is in the arduino sketch itself, you can try just removing the line.
Bootloader Launching
For most other AVRs, clicking reset while plugged into USB will launch the bootloader
manually, the bootloader will time out after a few seconds. For the M0/M4, you'll need
©Adafruit Industries
Page 38 of 50
to double click the button. You will see a pulsing red LED to let you know you're in
bootloader mode. Once in that mode, it wont time out! Click reset again if you want to
go back to launching code.
Aligned Memory Access
This is a little less likely to happen to you but it happened to me! If you're used to 8bit platforms, you can do this nice thing where you can typecast variables around. e.g.
uint8_t mybuffer[4];
float f = (float)mybuffer;
You can't be guaranteed that this will work on a 32-bit platform because mybuffer
might not be aligned to a 2 or 4-byte boundary. The ARM Cortex-M0 can only directly
access data on 16-bit boundaries (every 2 or 4 bytes). Trying to access an oddboundary byte (on a 1 or 3 byte location) will cause a Hard Fault and stop the MCU.
Thankfully, there's an easy work around ... just use memcpy!
uint8_t mybuffer[4];
float f;
memcpy(&f, mybuffer, 4)
Floating Point Conversion
Like the AVR Arduinos, the M0 library does not have full support for converting
floating point numbers to ASCII strings. Functions like sprintf will not convert floating
point. Fortunately, the standard AVR-LIBC library includes the dtostrf function which
can handle the conversion for you.
Unfortunately, the M0 run-time library does not have dtostrf. You may see some
references to using #include to get dtostrf in your code. And while it
will compile, it does not work.
Instead, check out this thread to find a working dtostrf function you can include in
your code:
http://forum.arduino.cc/index.php?topic=368720.0 (https://adafru.it/lFS)
©Adafruit Industries
Page 39 of 50
How Much RAM Available?
The ATSAMD21G18 has 32K of RAM, but you still might need to track it for some
reason. You can do so with this handy function:
extern "C" char *sbrk(int i);
int FreeRam () {
char stack_dummy = 0;
return &stack_dummy - sbrk(0);
}
Thx to http://forum.arduino.cc/index.php?topic=365830.msg2542879#msg2542879 (h
ttps://adafru.it/m6D) for the tip!
Storing data in FLASH
If you're used to AVR, you've probably used PROGMEM to let the compiler know
you'd like to put a variable or string in flash memory to save on RAM. On the ARM, its
a little easier, simply add const before the variable name:
const char str[] = "My very long string";
That string is now in FLASH. You can manipulate the string just like RAM data, the
compiler will automatically read from FLASH so you dont need special progmemknowledgeable functions.
You can verify where data is stored by printing out the address:
Serial.print("Address of str $"); Serial.println((int)&str, HEX);
If the address is $2000000 or larger, its in SRAM. If the address is between $0000
and $3FFFF Then it is in FLASH
Pretty-Printing out registers
There's a lot of registers on the SAMD21, and you often are going through ASF or
another framework to get to them. So having a way to see exactly what's going on is
handy. This library from drewfish will help a ton!
https://github.com/drewfish/arduino-ZeroRegs (https://adafru.it/Bet)
©Adafruit Industries
Page 40 of 50
M4 Performance Options
As of version 1.4.0 of the Adafruit SAMD Boards package in the Arduino Boards
Manager, some options are available to wring extra performance out of M4-based
devices. These are in the Tools menu.
All of these performance tweaks involve a degree of uncertainty. There’s no
guarantee of improved performance in any given project, and some may even be
detrimental, failing to work in part or in whole. If you encounter trouble, select the
default performance settings and re-upload.
Here’s what you get and some issues you might encounter…
CPU Speed (overclocking)
This option lets you adjust the microcontroller core clock…the speed at which it
processes instructions…beyond the official datasheet specifications.
Manufacturers often rate speeds conservatively because such devices are marketed
for harsh industrial environments…if a system crashes, someone could lose a limb or
worse. But most creative tasks are less critical and operate in more comfortable
settings, and we can push things a bit if we want more speed.
There is a small but nonzero chance of code locking up or failing to run entirely. If this
happens, try dialing back the speed by one notch and re-upload, see if it’s more
stable.
Much more likely, some code or libraries may not play well with the nonstandard CPU
speed. For example, currently the NeoPixel library assumes a 120 MHz CPU speed
and won’t issue the correct data at other settings (this will be worked on). Other
©Adafruit Industries
Page 41 of 50
libraries may exhibit similar problems, usually anything that strictly depends on CPU
timing…you might encounter problems with audio- or servo-related code depending
how it’s written. If you encounter such code or libraries, set the CPU speed to the
default 120 MHz and re-upload.
Optimize
There’s usually more than one way to solve a problem, some more resource-intensive
than others. Since Arduino got its start on resource-limited AVR microcontrollers, the
C++ compiler has always aimed for the smallest compiled program size. The
“Optimize” menu gives some choices for the compiler to take different and often
faster approaches, at the expense of slightly larger program size…with the huge flash
memory capacity of M4 devices, that’s rarely a problem now.
The “Small” setting will compile your code like it always has in the past, aiming for the
smallest compiled program size.
The “Fast” setting invokes various speed optimizations. The resulting program should
produce the same results, is slightly larger, and usually (but not always) noticably
faster. It’s worth a shot!
“Here be dragons” invokes some more intensive optimizations…code will be larger
still, faster still, but there’s a possibility these optimizations could cause unexpected
behaviors. Some code may not work the same as before. Hence the name. Maybe
you’ll discover treasure here, or maybe you’ll sail right off the edge of the world.
Most code and libraries will continue to function regardless of the optimizer settings.
If you do encounter problems, dial it back one notch and re-upload.
Cache
This option allows a small collection of instructions and data to be accessed more
quickly than from flash memory, boosting performance. It’s enabled by default and
should work fine with all code and libraries. But if you encounter some esoteric
situation, the cache can be disabled, then recompile and upload.
Max SPI and Max QSPI
These should probably be left at their defaults. They’re present mostly for our own
experiments and can cause serious headaches.
©Adafruit Industries
Page 42 of 50
Max SPI determines the clock source for the M4’s SPI peripherals. Under normal
circumstances this allows transfers up to 24 MHz, and should usually be left at that
setting. But…if you’re using write-only SPI devices (such as TFT or OLED displays), this
option lets you drive them faster (we’ve successfully used 60 MHz with some TFT
screens). The caveat is, if using any read/write devices (such as an SD card), this will
not work at all…SPI reads absolutely max out at the default 24 MHz setting, and
anything else will fail. Write = OK. Read = FAIL. This is true even if your code is using a
lower bitrate setting…just having the different clock source prevents SPI reads.
Max QSPI does similarly for the extra flash storage on M4 “Express” boards. Very few
Arduino sketches access this storage at all, let alone in a bandwidth-constrained
context, so this will benefit next to nobody. Additionally, due to the way clock dividers
are selected, this will only provide some benefit when certain “CPU Speed” settings
are active. Our PyPortal Animated GIF Display (https://adafru.it/EkO) runs marginally
better with it, if using the QSPI flash.
Enabling the Buck Converter on some M4
Boards
If you want to reduce power draw, some of our boards have an inductor so you can
use the 1.8V buck converter instead of the built in linear regulator. If the board does
have an inductor (see the schematic) you can add the line SUPC->VREG.bit.SEL =
1; to your code to switch to it. Note it will make ADC/DAC reads a bit noisier so we
don't use it by default. You'll save ~4mA (https://adafru.it/F0H).
Feather HELP!
Even though this FAQ is labeled for Feather, the questions apply to ItsyBitsy's as
well!
My ItsyBitsy/Feather stopped working when I unplugged
the USB!
A lot of our example sketches have a
while (!Serial);
line in setup(), to keep the board waiting until the USB is opened. This makes it a
lot easier to debug a program because you get to see all the USB data output. If
©Adafruit Industries
Page 43 of 50
you want to run your Feather without USB connectivity, delete or comment out that
line
My Feather never shows up as a COM or Serial port in the
Arduino IDE
A vast number of Itsy/Feather 'failures' are due to charge-only USB cables
We get upwards of 5 complaints a day that turn out to be due to charge-only
cables!
Use only a cable that you know is for data syncing
If you have any charge-only cables, cut them in half throw them out. We are
serious! They tend to be low quality in general, and will only confuse you and
others later, just get a good data+charge USB cable.
A quality USB port is critical. Avoid plugging into USB keyboards and when
possible use a USB-2 HUB to avoid USB3 issues.
Ack! I "did something" and now when I plug in the Itsy/
Feather, it doesn't show up as a device anymore so I cant
upload to it or fix it...
No problem! You can 'repair' a bad code upload easily. Note that this can happen if
you set a watchdog timer or sleep mode that stops USB, or any sketch that
'crashes' your board
1. Turn on verbose upload in the Arduino IDE preferences
2. Plug in Itsy or Feather 32u4/M0, it won't show up as a COM/serial port that's
ok
3. Open up the Blink example (Examples->Basics->Blink)
4. Select the correct board in the Tools menu, e.g. Feather 32u4, Feather M0,
Itsy 32u4 or M0 (physically check your board to make sure you have the right
one selected!)
5. Compile it (make sure that works)
6. Click Upload to attempt to upload the code
7. The IDE will print out a bunch of COM Ports as it tries to upload. During this
time, double-click the reset button, you'll see the red pulsing LED that tells
you its now in bootloading mode
8. The board will show up as the Bootloader COM/Serial port
9. The IDE should see the bootloader COM/Serial port and upload properly
©Adafruit Industries
Page 44 of 50
I can't get the Itsy/Feather USB device to show up - I get
"USB Device Malfunctioning" errors!
This seems to happen when people select the wrong board from the Arduino
Boards menu.
If you have a Feather 32u4 (look on the board to read what it is you have) Make
sure you select Feather 32u4 for ATMega32u4 based boards! Do not use anything
else, do not use the 32u4 breakout board line.
If you have a Feather M0 (look on the board to read what it is you have) Make sure
you select Feather M0 - do not use 32u4 or Arduino Zero
If you have a ItsyBitsy M0 (look on the board to read what it is you have) Make sure
you select ItsyBitsy M0 - do not use 32u4 or Arduino Zero
©Adafruit Industries
Page 45 of 50
I'm having problems with COM ports and my Itsy/Feather
32u4/M0
Theres two COM ports you can have with the 32u4/M0, one is the user port and
one is the bootloader port. They are not the same COM port number!
When you upload a new user program it will come up with a user com port,
particularly if you use Serial in your user program.
If you crash your user program, or have a program that halts or otherwise fails, the
user COM port can disappear.
When the user COM port disappears, Arduino will not be able to automatically start
the bootloader and upload new software.
So you will need to help it by performing the click-during upload procedure to restart the bootloader, and upload something that is known working like "Blink"
I don't understand why the COM port disappears, this
does not happen on my Arduino UNO!
UNO-type Arduinos have a seperate serial port chip (aka "FTDI chip" or "Prolific
PL2303" etc etc) which handles all serial port capability seperately than the main
chip. This way if the main chip fails, you can always use the COM port.
M0 and 32u4-based Arduinos do not have a seperate chip, instead the main
processor performs this task for you. It allows for a lower cost, higher power
setup...but requires a little more effort since you will need to 'kick' into the
bootloader manually once in a while
I'm trying to upload to my 32u4, getting "avrdude:
butterfly_recv(): programmer is not responding" errors
This is likely because the bootloader is not kicking in and you are accidentally
trying to upload to the wrong COM port
The best solution is what is detailed above: manually upload Blink or a similar
working sketch by hand by manually launching the bootloader
©Adafruit Industries
Page 46 of 50
I'm trying to upload to my Feather M0, and I get this error
"Connecting to programmer: .avrdude: butterfly_recv():
programmer is not responding"
You probably don't have Feather M0 selected in the boards drop-down. Make sure
you selected Feather M0.
I'm trying to upload to my Feather and i get this error
"avrdude: ser_recv(): programmer is not responding"
You probably don't have Feather M0 / Feather 32u4 selected in the boards dropdown. Make sure you selected Feather M0 (or Feather 32u4).
I attached some wings to my Feather and now I can't read
the battery voltage!
Make sure your Wing doesn't use pin #9 which is the analog sense for the lipo
battery!
The yellow LED Is flickering on my Feather, but no battery
is plugged in, why is that?
The charge LED is automatically driven by the Lipoly charger circuit. It will try to
detect a battery and is expecting one to be attached. If there isn't one it may flicker
once in a while when you use power because it's trying to charge a (non-existant)
battery.
It's not harmful, and its totally normal!
The Arduino IDE gives me "Device Descriptor Request Failed"
This can require "manual bootloading".
If you ever get in a 'weird' spot with the bootloader, or you have uploaded code that
crashes and doesn't auto-reboot into the bootloader, double-click the RST button to
get back into the bootloader. The red LED will pulse, so you know that its in
bootloader mode. Do the reset button double-press right as the Arduino IDE says its
attempting to upload the sketch, when you see the Yellow Arrow lit and the Uploading
... text in the status bar.
©Adafruit Industries
Page 47 of 50
(h
ttps://adafru.it/UJA)
Don't click the reset button before uploading, unlike other bootloaders you want this
one to run at the time Arduino is trying to upload
Downloads
Datasheets
• ATSAMD21 Datasheet (https://adafru.it/kUf) (the main chip on the Feather M0)
• Fritzing object in the Adafruit Fritzing Library (https://adafru.it/aP3)
• EagleCAD PCB files in GitHub (https://adafru.it/kFh)
• PDF for Feather M0 Basic Proto Board Diagram on GitHub (https://adafru.it/ZDD)
SVG for Feather M0 Basic Proto
Board Diagram
https://adafru.it/ZDE
©Adafruit Industries
Page 48 of 50
Firmware
Feather M0 Bootloader - You'll need to program it in using an ST-Link, JLink or other
SWD-capable programmer. HEX available in the github repo (https://adafru.it/kFh)
Default CircuitPython 2.3.1 test
example code
https://adafru.it/BuO
Schematic
Click to enlarge
Fabrication Print
Dimensions in inches
©Adafruit Industries
Page 49 of 50
©Adafruit Industries
Page 50 of 50