Getting started with mchck
Note
This describes my work with an older revision (r2) of the MC HCK design. Many things have changed in the last year; the current revision (r5) is built upon a different MCU, the pinout has changed, and the software environment has greatly matured. I’ll try to write about my experiences with this new revision soon. Until then, many of the ideas below still hold true.
The mchck is a small microcontroller development board based around the ARM Cortex M3 intended to be a low-cost (~$5) alternative to the ubiquitous Arduino.
While the design is currently under development, things are quickly stabilizing. Here I describe my experiences sourcing, building, and developing for the mchck.
Parts
I used Seeed Studio’s [Fusion PCB] service to produce the boards. This works quite well as the mchck is nearly exactly half of the area of the smallest board service (5cm x 5cm). Because Seeed allows boards to be panelized, I tiled two boards in my Gerbers, almost perfectly filling the allotted area. While the mchck has contacts intended for use as a USB connector, having the board trimmed to this size would have precluded the use of Seeed and so I instead decided to use a mini-USB B connector.
I’ve found that Future Electronics has very competitive prices but often do not offer many parts (namely passive components). For this reason, I sourced parts from both suppliers. Below is the bill-of-materials. While the cost is certainly above the $5 target, this is to be expected from such a low-volume run.
Price | Qty | Description | Vendor | Part No |
---|---|---|---|---|
$0.26 | 1 | 3.3V LDO regulator | FE | MIC5205-3.3YM5 TR |
$0.42 | 1 | 20V Schottky diode | DK | 641-1285-1-ND |
$2.20 | 1 | STM32L151 microcontroller (LQFP48) | FE | STM32L151C8T6 |
$1.12 | 1 | 8MB serial FLASH | FE | SST25VF080B-50-4I-S2AF |
$0.27 | 1 | 8MHz resonator | FE | CSTCE8M00G55-R0 |
$0.13 | 1 | 10uH inductor (0603) | DK | 445-3166-1-ND |
$0.01 | 6 | 100nF ceramic capacitor (0603) | DK | 490-1532-1-ND |
$0.28 | 1 | 2.2uF ceramic capacitor (0603) | DK | 587-1263-1-ND |
$0.31 | 1 | 470pF ceramic capacitor (0603) | DK | 445-1307-1-ND |
$0.33 | 1 | Green LED (0603) | DK | 160-1446-1-ND |
$1.51 | 1 | Mini USB B connector | DK | A31727CT-ND |
$0.25 | 1 | SPST SMT tactile switch | FE | KMR221GLFS |
$1.10 | 1 | PCB (1.5in^2, bought in groups of 10) | ||
Pin headers (very cheap on eBay) | ||||
$8.24 | Total / board |
Construction
Because the microcontroller is the most expensive component on the board, I soldered it last.
Cut the trace on the back of the board and short other two pads to boot from FLASH.
Toolchain
One of the great things about the ARM architecture is ready availability of compiler toolchains. Being on Linux, I use the summon-arm-toolchain script which makes building a up-to-date ARM toolchain trivial. Namely,
$ git clone https://github.com/esden/summon-arm-toolchain.git
$ cd summon-arm-toolchain
$ ./summon-arm-toolchain
After the script finishes you’ll find that you have binutils, gcc, and OpenOCD available in ~/sat
. You can add these to your environment by,
$ PATH=~/sat/bin:$PATH
$ export LD_LIBRARY_PATH=~/sat/lib:$LD_LIBRARY_PATH
Hello World
The examples/blink
program is a good starting point to verify the board. First, build the example,
$ cd mkchk/examples/blink
$ make
Now you have a blink.bin
image ready to be uploaded to the mkchk. This can be done through one of the device’s two debug ports: the five-pin JTAG interface or the two-pin Serial Wire Debug (SWD) interface. The appropriate wiring configurations are shown in the tables below.
To interface with the device I used a Bus Pirate in conjunction with a variant of Will Donnelley’s pirate-swd
. While Will’s description is helpful, details on the hardware configuration are pretty sparse.
Signal | Bus Pirate | mchck | |
---|---|---|---|
TCK | PA14 | CLK | P4-4 |
TMS | PA13 | CS | P4-3 |
TDI | PA15 | MOSI | P3-1 |
TDO | PB3 | MISO | P3-2 |
NJTRSR | PB4 | MISO | P3-3 |
GND | GND | P4-2 |
JTAG interface pins
Since I use SWD (due to its lower pin count) I will detail my experiences with this below.
Using the flashSTM32
program available in my pirate-swd
Github repository, upload the new image,
$ python pirate-swd/flashSTM32.py mchck/examples/blink/blink.bin
If all goes well, you should see a variety of status messages, followed by a message informing you that the script has reset the device. Hopefully now you will see the LED on the device blinking.
Signal | STM32 Pin | Bus Pirate | mchck |
---|---|---|---|
SWCLK | PA14 | CLK | P4-4 |
SWDIO | PA13 | MOSI | P4-3 |
GND | GND | P4-2 |
SWD Debug interface pins
If the script dies of a protocol error, don’t worry, there are many possible issues, few of which are serious. First double-check the wiring and ensure that the device has power. If this is the correct, next look at the three bits listed in the script’s error message. These are the acknowledgement bits of the frame during which it lost synchronization with the device.
If the acknowledgement bits aren’t all the same value, then you probably have noise on your clock line. This can be tested by placing your finger on the mchck’s SWD header pins. If the bus becomes more stable, this is evidence that your connection configuration is picking up RF noise from your surroundings, leading to false cycles. When using my Bus Pirate’s grabber cable, I found it necessary to place a capacitor between CLK and GND to provide better noise rejection. Without this the bus was extremely unstable.
Finally, if the acknowledgement bits are all either 0 or 1, things aren’t good; it seems the chip isn’t making any attempt at communicating. Double check your soldering, the orientation of the chip, and if all else fails try replacing it.