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
8 comments:
Nice work! It is time we left the 8-bit controllers behind. Most of the suppliers have a 32-bit chip for a few dollars more.
Great idea! I was getting my dad interested in controllers again, and I want to give him an arduino for simplicity. But then I saw some of the cheap ST32 demo boards (like the primer1 and primer2) and I told him to forget the arduino.
But this would be the best of both worlds.
An arduino shield adapter could even be plugged into the expansion on the STM3210E-PRIMER so normal shields could be used. It would be great if the header layout could match the standard Arduino shield layout.
The pin mapping issue has been a problem for some time, even with various atmel chips. I wonder how complicated it would be to map the pins to "standard" pins among the different platforms.
Is that USB to RS-232 adapter the one from sparkfun: http://www.sparkfun.com/commerce/product_info.php?products_id=8580
I tried this one: http://www.dealextreme.com/details.dx/sku.24512
And it does not work very well. I have to set upload speed at 9600 and it only successfully uploads 1/10th of the time. Both those adapters contain the PL2303 chip though.
Please contact me by mail. I have a question about your blog
numnim2209@gmail.com
Thank you very much!
Is this development died? Im very interested to do the same with STM32 stamp module.
I have been away from microcomputer development for some time, but now I have started to go through and update some old projects. For this work I have looked at the Maple IDE and the Teensyduino. I dont want to create, and support, yet another Arduino IDE for Cortex chips.
You may be interested in the work that we are doing to use the latest Arduino IDE 1.6.x and STM32F103 devices
See my repo wiki
https://github.com/rogerclarkmelbourne/Arduino_STM32/wiki
https://github.com/rogerclarkmelbourne/Arduino_STM32/wiki
There is support for both Maple and generic stm32F103 boards
There is also some experimental work on F3 and F4 boards, but this is in its infancy at the moment
@Seventh Synergy
Yes that great, the never Arduino seems to have wastly improved possibilities to configure the build proces and the build tools to different processor families and toolchains without having to hack the core Arduino Java code. Still I find it a bit messy, the board/platform configuration.
Post a Comment