Exploring ways to enhance Arduino while still keeping the ease and experience.
This is work in progress, more details, updates and pictures coming soon. But the basic stuff works as described today.Using Arduino boards and the Arduino GUI is a simple and fast way to develop embedded applications. There are predefined functions for input and output, serial communications and timing, many example sketches and the user does not have to worry about low level initialisation, interrupt vectors and timer configurations. On the other hand, ATMega 168 chips have limited resources, it is an 8 bit chip and not very fast.
Modern Cortex-M3 chips like the STM32 are fast, have much more RAM and flash and they have powerful and well documented debugging subsystems using JTAG tools, but starting to program these chips can be a huge step.
So here is my project to use a slightly modified, but from the users point standard Arduino IDE, standard Arduino sketches and run them on a powerful 32 bit Cortex-M3 (STM32) chip. The process of writing sketches, uploading them and then running them is exactly the same as for ordinary Arduino development. It is just that the processor board we use is not an Arduino. And you can use it all for your old Arduino boards also.
More complicated sketches that uses lowlevel access to the ATMega chip must be rewritten for this new platform.
The components we need:
- Hardware.
- Modified Arduino IDE.
- Library code for this chip and board configuration.
- Toolchain to compile and build code for a Cortex-M3 processor
- An uplader that is used to program the chip.
Hardware
The board I use is an ET-STAMP-STM32, a chip carrier module that brings out all chip i/o lines but not much more. I bought it for $24.90 from Futurlec (ET STM32 Stamp). It is mounted on a breadboard together with a 3.3V power supply, a serial USB adapter, a LED and some extra stuff for experimentation lika a potentiometer connected to an analog input and a push button.The FTDI USB is only used to supply 5V to the small 3.3V regulator board. It can also be connected to UART2 or UART3.
The board is at the moment running a sketch that read the analog voltage from the potentiometer and adjusts the LED blink frequency:
So you can see that the sketch is a totally standard Arduino sketch.volatile unsigned int count=-1; int ledPin = 44; // STM32_P103 Board - PC12 int dly; int analogChn = 10; // Analog channel 10 is PC0 = pin 32 void setup() { pinMode(ledPin, OUTPUT); // sets the digital pin as output } Serial.begin(115200); // opens serial port, 31250bps (MIDI speed) Serial.write("\n\n *** Hello from Arduino 32 ***\n"); } void loop() { int k; count++; dly = analogRead(10)/2+20; digitalWrite(ledPin, HIGH); // sets the LED off delay(dly); // waits for a second digitalWrite(ledPin, LOW); // sets the LED on dly = analogRead(10)/2+20; delay(dly); // waits for a second if (count%100 ==0) { Serial.print(count); Serial.write("\n"); } }
Modified Arduino IDE.
The Arduino IDE is modified in order to be able to build code with the ARM toolchain. The modified files and some new files that are added can be found at http://github.com/mlu/arduino-stm32/tree/master . These files must be placed in the source tree for Arduino 0017, and then the IDE must be rebuilt.Library code for this chip and board configuration.
The special code for this chip and board are found under hardware/stm32 and to use this you just have to select the board "STM32 Arduino32" in the Tools menu in the IDE.Toolchain to compile and build code for a Cortex-M3 processor
I use the Codesourcery G++ Lite Edition for ARM, EABI version, that can be downloaded from the Codesourcery website (Codesourcery G++ Lite ).Install this and make sure that the top bin directory containing "arm-none-eabi-gcc" and the rest of the cross compilation binaries are in the path.
Uploader
I have written a small uploader, using similar command line arguments as avrdude, that uploads the compiled and linked sketches to the processor.The code and also a compiled binary that runs under Fedora 10 are included in the files at github.com/mlu/arduino-stm32.
Almost ready to rock
The first thing to notice is that the pin numberings are differentArduino sketch BoardPins 9 and 10 (PA9 and PA10) are used by USART1 and are connected to the RS232 level shifter for the serial port and should not be used.
digital pin number 0..15 pin PA0 .. PA15
analog pin number 0..7 pin PA0 .. PA7
analog pin number 8,9 pin PB0,PB1
analog pin number 10..15 pin PC0 .. PC5
We must also manually switch the board between bootloader mode and normal run mode with the blue switch, and also do all resets manually with the reset switch.
Testing Blink
Blink uses the LED on pin number 13, This corresponds to pin PA13 so we add a LED and a 220 ohm serial resistor to PA13. Connect a serial adapter to the board and select the corresponding serial port in the Arduino IDE.Load the Example/Digital/Blink sketch and select board type "STM32 Arduino 32". Set the board in bootloader mode by depressing the blue button, the green bootloader LED lights up, and reset the board. Now it should be possible to simply upload the sketch :), go back to normal run mode with the blue button and reboot with the reset button.
Now this is new and quite untested code so many things could go wrong when trying to do this on a computer with a different setup.
More to follow, especially with reader feedback