Hi,
ich habe bisher schon mehrere Sachen mit dem STM32F0's gemacht.
Hauptsächlich Leistungselektronik (BLDC Motor Steuerungen).
Ich bin mit dem auch eigentlich ganz zufrieden. Mir ist allerdings
aufgefallen das die STM32FXXX "gefühlt" viel leichter sterben als z.B.
AVR8 µC's.
Jetzt habe ich hier ein SAMD10 Xplained Board liegen. Da die SAMD Serie
ja preislich und auch von der Ausstattung her vergleichbar ist,
interessieren mich nun die Unterschiede.
Ich habe heute mal eine kleine Testreihe gemacht:)
die Testboards sind einmal das SAMD10 Xplained und das STM32F051
Discovery auf dem ich den 3,3V LDO getauscht und eine Diode gebrückt
habe damit der F051 auch mit 3,3V läuft (orginal 3,0V).
Ich kompiliere den test code mit GCC ARM Embedded
(https://launchpad.net/gcc-arm-embedded) und selbst zusammen gestrickten
make files. Die Einstellungen sind identisch.
Beide µC's laufen mit 48MHz mit den 8MHz vom programmer µC.
Hier meine bisherigen vergleich Tests (Scope Bilder im Anhang)
>Test 1.<
Pin high und low schalten (nicht toggeln damit es später vergleichbar
bleibt)
SAMD10 code:
1 | PORT->Group[0].DIRSET.reg = PORT_PA10;
|
2 | while (1){
|
3 | PORT->Group[0].OUTSET.reg = PORT_PA10;
|
4 | PORT->Group[0].OUTCLR.reg = PORT_PA10;
|
5 | }
|
STM32F0 code:
1 | RCC->AHBENR |= RCC_AHBPeriph_GPIOA;
|
2 | GPIOA->MODER |= (((uint32_t)GPIO_Mode_OUT) << 20);
|
3 | while(1){
|
4 | GPIOA->BSRR = GPIO_Pin_10;
|
5 | GPIOA->BRR = GPIO_Pin_10;
|
6 | }
|
hier kommt bei beiden eine Frequenz von 4.8MHz raus. Allerdings sieht
das beim STM32F0 nicht wirklich gleichmäßig aus (siehe Anhang Test1)
>Test 2.<
Das gleiche nur mit einer den wert wechselnden uint8.
1 | static uint8_t switchInt = 3;
|
2 | if(switchInt == 3){
|
3 | pin -> high
|
4 | switchInt = 5;
|
5 | }else{
|
6 | pin -> low
|
7 | switchInt = 3;
|
8 | }
|
Dabei ist der SAMD10 komischerweise deutlich schneller. Es kommen
2.53MHz beim SAMD und 2.0MHz beim stm32F0 raus.
>Test 3.<
Eine Multiplikation.
1 | static uint8_t switchInt = 0;
|
2 | volatile uint32_t mulTest32 = 0x10001*switchInt;
|
3 | if(mulTest32); // damit es nicht weg optimiert wird
|
4 | if(switchInt == 3){
|
5 | pin -> high
|
6 | switchInt = 5;
|
7 | }else{
|
8 | pin -> low
|
9 | switchInt = 3;
|
10 | }
|
Hier sind beide annähernd gleich schnell. der der F0 braucht 333ns
länger(als in test 2) der SAMD 335ns. beide machen das per HW.
>Test 4.<
Dividieren.
1 | static uint8_t switchInt = 0;
|
2 | volatile uint32_t DIVTest32 = 0xFFFFFFFF/switchInt;
|
3 | if(DIVTest32);
|
4 | if(switchInt == 3){
|
5 | pin -> high
|
6 | switchInt = 5;
|
7 | }else{
|
8 | pin -> low
|
9 | switchInt = 3;
|
10 | }
|
Hier ist der ST schneller. SAMD 12.05µs, STM32F0 10,6µs.
Im 5. Test (siehe Anhang) habe ich den gleichen code laufen wie in 4.
nur an den PIN ein RC glied mit R=200 C=1µF. hier sieht man deutlich das
der widerstand der Ausgangsschaltung des SAMD deutlich hochohmiger ist.
Meine Hoffnung wäre das er damit vielleicht unsensibler gegen
"Störstrom" ist... aber k.A. ob das so ist.
Mich würde interessieren wo ihr vielleicht noch Unterscheide bemerkt
habt oder vermutet. Und meint ihr da können merkbare unterscheide in der
Robustheit sein?