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
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 | }
|
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?
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
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?
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
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.
>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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.