Forum: Compiler & IDEs STM32F10x Probleme


von STM32 Einsteiger (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,

ich habe ein merkwürdiges Problem mit einem STM32F103CB.
Der Controller ist auf einer Adapterplatine aufgelötet und die Schaltung 
ist auf einem Steckboard aufgebaut.
Ursprünglich wollte ich nur den USART1 programmieren und hatte dabei 
Probleme. Um den Fehler zu lokalisieren habe ich ein Programm 
geschrieben siehe Anhang was in einer Schleife einen Ausgang ein- und 
ausschaltet.
Denn Ausgang hab ich dann mit einem Oszi nachgemessen und was mir 
auffiel, das die Ausgangsfrequenz nur ca. 765 kHz beträgt.
Dabei ist der Systemtakt auf 72MHz konfiguriert es wird ein externer 
Quarz 8MHz verwendet, dieser schwingt auch mit der genannten Frequenz.
Als IDE verwende ich COIDE, um auszuschließen das der Fehler von der IDE 
herrührt habe ich das gleiche mit der eingeschränkten Version von IAR, 
leider auch kein erfolg, das gleiche Problem.
Ich hab dann in Coide die Optimierungsstufe auf 1 gesetz und siehe da 
pötzlich beträgt die Frequenz ca. 1,8 MHz was aber immer noch zuwenig 
ist.
Ich habe dann das gleiche Programm auf ein Discoveryboard getestet 
(Prozessor natürlich geändert) und das gleiche Ergebnis, die Frequenz 
ist zu niedrig.
Ich weiß jetzt nicht mehr weiter, könnte sich das bitte jemand mal 
anschauen oder mir einen Tipp geben was ich noch versuchen kann.

Danke

von Martin (Gast)


Lesenswert?

Was versuchst du denn in Zeile 15?
1
GPIO_StructInit(&GPIO_InitStruct);

lösch das mal....

Und nur so als Tipp:
Wenn du in der Datei stm32f10x_conf.h die Kommentare für RCC und GPIO 
entfernst
brauchst du diese in der main.c nicht mehr "includen" genause wie du 
stm32f10x_conf.h nicht extra hinzufügen musst. die main.c sieht dann so 
aus:
1
#include <stm32f10x.h>
2
3
int main(void)
4
{
5
  SystemInit();
6
7
  GPIO_InitTypeDef GPIO_InitStruct;
8
9
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
10
11
  GPIO_InitStruct.GPIO_Pin = GPIO_Pin_9;
12
  GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
13
  GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
14
  GPIO_Init(GPIOA,&GPIO_InitStruct);
15
16
  while(1)
17
  {
18
    GPIO_WriteBit(GPIOA,GPIO_Pin_9,Bit_SET);
19
    GPIO_WriteBit(GPIOA,GPIO_Pin_9,Bit_RESET);
20
21
  }
22
23
  return(0);
24
}

von STM32 Einsteiger (Gast)


Lesenswert?

Guten Morgen,

@Martin
Die Zeile ist mir irgendwie durch das kopieren reingerutscht, ist jetzt 
gelöscht.
1
GPIO_StructInit(&GPIO_InitStruct);
Danke für den Tip mit den Header Dateien, wird gemacht.

Ich habs erneut ausprobiert mit den Änderungen, leider das gleiche 
Problem. Mir kommt es so vor als wäre der Systemtakt irgendwie nicht 
Inordnung. Woran könnte es noch liegen bzw. was kann ich kontrollieren?

von Uwe B. (derexponent)


Lesenswert?

check mal die Quarz Settings in diesen beiden Files :

cmsis_boot/stm32f10x.h
cmsis_boot/system_stm32f10x.c

da muss dein realer Wert vom Quarz auf dem Board
eingetragen sein ... also 8MHz

: Bearbeitet durch User
von STM32 Einsteiger (Gast)


Lesenswert?

Hallo,

also in der cmsis_boot/stm32f10x.h steht folgendes:
1
#if !defined  HSE_VALUE
2
 #ifdef STM32F10X_CL   
3
  #define HSE_VALUE    ((uint32_t)25000000) /*!< Value of the External oscillator in Hz */
4
 #else 
5
  #define HSE_VALUE    ((uint32_t)8000000) /*!< Value of the External oscillator in Hz */
6
 #endif /* STM32F10X_CL */
7
#endif /* HSE_VALUE */
Bei dem Projekt sind die Makros definiert
STM32F103CB
STM32F10X_MD
damit ist HSE korrekt und zwar
1
#define HSE_VALUE    ((uint32_t)8000000) /*!< Value of the External
oder meinst du was anders?

In der cmsis_boot/system_stm32f10x.c steht
1
#if defined (STM32F10X_LD_VL) || (defined STM32F10X_MD_VL) || (defined STM32F10X_HD_VL)
2
/* #define SYSCLK_FREQ_HSE    HSE_VALUE */
3
 #define SYSCLK_FREQ_24MHz  24000000
4
#else
5
/* #define SYSCLK_FREQ_HSE    HSE_VALUE */
6
/* #define SYSCLK_FREQ_24MHz  24000000 */ 
7
/* #define SYSCLK_FREQ_36MHz  36000000 */
8
/* #define SYSCLK_FREQ_48MHz  48000000 */
9
/* #define SYSCLK_FREQ_56MHz  56000000 */
10
#define SYSCLK_FREQ_72MHz  72000000
11
#endif
Der Systemtakt müsste doch 72MHz betragen oder muss ich noch 
irgendwelche Änderungen machen?

von Uwe B. (derexponent)


Lesenswert?

mal ne Gegenfrage ... welche Frq "soll" den rauskommen ?

GPIO_WriteBit hat einen kleinen Overhead

versuch mal das hier :
1
while(1) {
2
  GPIOA->BSRRL=GPIO_Pin_9;
3
  GPIOA->BSRRH=GPIO_Pin_9;
4
}

bzw.
1
while(1) {
2
  GPIOA->ODR ^= GPIO_Pin_9;
3
}


ansonsten benutz die MCO Funktion (oder einen Timer)
um zu prüfen ob deine CPU mit der richtigen Frq läuft.

Gruss Uwe

: Bearbeitet durch User
von STM32 Einsteiger (Gast)


Lesenswert?

Ich erwarte zumindest einen unterschied zwischen einem STM32F100RB 
(Discoveryboard) der einen Systemtakt von 24MHz hat und einem STM32F103 
der mit 72MHz läuft.
Die genaue Frequenz kann ich dir auch nicht nennen aber zumindest ein 
paar MHz sollten schon rauskommen zumindest wenn der Systemtakt 72MHz 
beträgt oder irre ich mich da? In dem Programm wird ja nicht anderes 
gemacht als einen Ausgang ein- und auszuschalten.

Denn Overhead hab ich mir schon angeschaut von GPIO_WriteBit, dieser ist 
aber nicht so enorm das die niedriege Ausgangs Frequenz gerechtfertig 
wäre.

Habe es mit dem Befehl versucht (Optimierung ausgeschaltet)
1
  GPIOA->ODR ^= GPIO_Pin_9;
Ausgangsfrequenz ca. 1,8 MHz

dann mit
1
  GPIOA->BSRR=GPIO_Pin_9;
2
  GPIOA->BRR=GPIO_Pin_9;
Ausgangsfrequenz ca. 2,8 MHz
Schon besser aber nicht zufriedenstellend.

Habe dann die MCO Funktion ausprobiert, danke für den Tipp Uwe.
Nachgemessen
HSE = 8MHz
PLL/2 = 36MHz
SYSCLK = ca. 73 MHz
passt soweit.

Erneut ausprobiert mit Optimierungsstufe 1
1
  GPIOA->BSRR=GPIO_Pin_9;
2
  GPIOA->BRR=GPIO_Pin_9;
Ausgangsfrequenz ca. 8 MHz.
Hätte ich dieses Ergebnis bei meiner ersten Messung erhalten hätte ich 
mich nicht gewundert und wäre zufrieden gewesen.
Also dann ist der Overhead folglich schuld für die geringe Frequenz.

von holger (Gast)


Lesenswert?

>Was versuchst du denn in Zeile 15?
>
>GPIO_StructInit(&GPIO_InitStruct);
>
>lösch das mal....

Falsch, es ist eine sehr gute Idee dies zu tun.
Lokal angelegte Strukturen werden nicht auf 0 initialisiert.
Da kann irgendein Müll drin stehen.

GPIO_StructInit(&GPIO_InitStruct); setzt die Struktur auf
definierte Werte.

Wenn man dann mal in   GPIO_Init(); reinschaut sieht man
das die Werte dort nur verodert werden. Sollte also irgendwo
in der lokalen Struktur ein Bit auf 1 stehen wird es NICHT gelöscht.
Das kann unangenehme Nebeneffekte haben.

Ich kann nur jedem empfehlen diese xxx_StructInit(&xxx_InitStruct);
zu verwenden wenn die Struktur lokal angelegt wird.
Ich hatte da schon böse Erlebnisse mit z.B. CAN.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.