Forum: Mikrocontroller und Digitale Elektronik [STM32] Keil SysTick_Config Probleme


von Patrick L. (crashdemon)


Lesenswert?

Hallo,

versuche mit eine Verzögerungsfunktion für den stm32f10x zu bauen die 
den systick benutzen soll um eine Zeitbasis zu schaffen, allerdings 
scheitert das ganze daran das Keil IDE meint die funktion 
SysTick_Config() nicht zu kennen. Im wiki steht "Der Sys-Tick Counter 
ist ebenfalls in der CMSIS enthalten da er Bestandteil des Cortex-M3 
ist." die frage ist nur welche Header Datei es ist, binde ich die 
falsche ein bekomme ich meldungen das Funktionen doppelt deklariert 
sind. Im mom. habe ich folgende Header-Datei eingebunden.
1
#include <stm32f10x_lib.h>

Hier dann noch meine Funktionen:
1
/******** Initialisiert die Zeitbasis ********/
2
void SysTick_init(void)
3
{
4
  SysTick_Config(72000); // HSE 72Mhz / 72k = 1000 -> 1/1000 = 1ms
5
}
6
7
/******** SysTick Interrupt ********/
8
void SysTick_Handler(void)
9
{
10
  systicks++;
11
}
12
13
/******** Verzögert um msec ********/
14
void delay_ms(unsigned int msec)
15
{
16
  systicks = 0;
17
  
18
  while(systicks <= msec);
19
}

von Patrick L. (crashdemon)


Lesenswert?

Keiner eine Idee, welche Header-Datei ich einbinden muss?

von Patrick L. (crashdemon)


Lesenswert?

Oder hat vllt. jemand eine idee wie ich anders einen Delay erzeugen 
kann. Brauche ich für die Ansteuerung eines LCDs.

von Matthias K. (matthiask)


Lesenswert?

Der Systick braucht noch einen Takt, siehe unten.
1
#include <stddef.h>
2
#include "stm32f10x.h"
3
4
//***********************************************************************************************
5
// System-Einstellungen
6
//***********************************************************************************************
7
void SetupSystem (void) {
8
9
  RCC_DeInit ();                        // RCC System Reset(for debug purpose)
10
11
  // Enable HSE (Umschaltung auf externen Quarz)
12
  RCC_HSEConfig (RCC_HSE_ON);
13
14
  // HSE-Umschaltung abwarten
15
  while (RCC_GetFlagStatus(RCC_FLAG_HSERDY) == RESET);
16
17
  // System-Taktung
18
  RCC_HCLKConfig   (RCC_SYSCLK_Div1);   // HCLK   = SYSCLK
19
  RCC_PCLK2Config  (RCC_HCLK_Div1);     // PCLK2 (APB2) = HCLK
20
  RCC_PCLK1Config  (RCC_HCLK_Div2);     // PCLK1 (APB1) = HCLK/2
21
  RCC_ADCCLKConfig (RCC_PCLK2_Div6);    // ADCCLK = PCLK2/6
22
23
  // FLASH-Speicher Zugriff
24
  FLASH_SetLatency(FLASH_Latency_2);                        // Flash - 2 wait states
25
  FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);     // Pipeline freigeben
26
27
  // PLL Konfiguration
28
  // PLLCLK = 8MHz * 9 = 72 MHz
29
  RCC_PLLConfig (RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);     // Externer Quarz, Faktor 9
30
  RCC_PLLCmd (ENABLE);                                      // Enable PLL
31
32
  // PLL-Konfiguration abwarten
33
  while (RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET);
34
35
  // PLL als System-Takt auswählen
36
  RCC_SYSCLKConfig (RCC_SYSCLKSource_PLLCLK);
37
38
  // PLL-Umschaltung abwarten
39
  while (RCC_GetSYSCLKSource() != 0x08);
40
41
  // SysTick aktivieren
42
  SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK);          // SysTick Takt von HCLK (voller Systemtakt)
43
  SysTick_Config(SystemCoreClock / 100);                    // Wiederholrate 10ms, Interrupt-Handle freigeben
44
}

von Patrick L. (crashdemon)


Lesenswert?

Ja, hab ich eingefügt, hab aber das Problem das der Keil die Funktion 
SysTick_Config nicht kennt, meckert immer:
1
function "SysTick_Config" declared implicitly
2
Undefined symbol SysTick_Config

von jan (Gast)


Lesenswert?

Ich hab die Sache mal nur überflogen und arbeite auch nicht mit Keil. 
Aber man muss für die Systick funktion den header misc.h einbinden. 
Versuchs mal
mfg Jan

von Patrick L. (crashdemon)


Lesenswert?

Leider will der Keil auch damit nücht

cannot open source input file "misc.h": No such file or directory

von Marcus H. (mharnisch) Benutzerseite


Lesenswert?

Patrick Langosch schrieb:
> Ja, hab ich eingefügt, hab aber das Problem das der Keil die Funktion
> SysTick_Config nicht kennt, meckert immer:

Schau Dir mal den Namen der Header Datei an.
stm32f10x.h:     CMSIS
stm32f10x_lib.h: FWLib

Du musst also möglicherweise beide einbinden, um CMSIS und FWLib zu 
bekommen.

Gruß
Marcus

von Matthias K. (matthiask)


Lesenswert?

#include "stm32f10x.h" sollte auch bei Keil reichen. stm32f10x_lib oder 
..._conf.h braucht man normalerweise nicht noch extra einzubinden. 
Allerdings muss USE_STDPERIPH_DRIVER definiert sein. Am besten in den 
Target-Options -> C/C++ -> Define. Wenn Du das Template nimmst, passt 
das alles schon automatisch.

Hast Du Dir mal das Template in der FW-Lib für MDK-ARM angesehen?

von Patrick L. (crashdemon)


Lesenswert?

Also wenn ich nur die #include <stm32f10x.h> einbinde dann werden es 
noch mehr Fehlermeldungen, ala:

error:  #20: identifier "ADC_Channel_0" is undefined

und so weiter, das war auch der Grund warum ich immer die 
stm32f10x_lib.h eingebunden hatte.

Ein #define USE_STDPERIPH_DRIVER habe ich auch versucht, hat aber nix 
gebracht. Wo finde ich das von dir beschriebene Template, in der 
Hilfe-Datei der Peripherials?

von Matthias K. (matthiask)


Lesenswert?

Patrick Langosch schrieb:
> Wo finde ich das von dir beschriebene Template, in der
> Hilfe-Datei der Peripherials?

STM32F10x_StdPeriph_Lib_V3.4.0 -> Project -> 
STM32F10x_StdPeriph_Template ->
MDK-ARM

von Patrick L. (crashdemon)


Lesenswert?

Joar gefunden habe ich es jetzt aber so richtig weitergeholfen hat mit 
das nicht. Es muss doch möglich sein das man z.B. wie beim AVR-Studio 
(avr-gcc), schön die Header-Dateien der Peripherie auswählt die man 
benötigt. Aber der Keil meckert ja nur das alles doppelt deklariert 
wäre.

von Matthias K. (matthiask)


Lesenswert?

Patrick Langosch schrieb:
> Es muss doch möglich sein das man z.B. wie beim AVR-Studio
> (avr-gcc), schön die Header-Dateien der Peripherie auswählt die man
> benötigt. Aber der Keil meckert ja nur das alles doppelt deklariert

Da machst Du irgendwo grundsätzlich was falsch. Die Demos funktionieren 
jedenfalls. Die gesamte FW-Lib wird nur über einen Header eingebunden. 
Deine speziellen Projektheader kannst Du, wie im AVR-Studio gewohnt, 
dann dort auch einbinden.

Häng doch mal das ganze Projekt an, dann müssen wir nich so rumrätseln!

von Patrick L. (crashdemon)


Angehängte Dateien:

Lesenswert?

Hier die Source, das gesamte Projekt hab ich mal gezippt und hier 
hochgeladen:
http://defcon-cc.dyndns.org/upload/files/ver0.1.zip

von Matthias K. (matthiask)


Angehängte Dateien:

Lesenswert?

Habe es Dir angepasst. Läuft jetzt zumindest ohne Erros durch.

Systick Aufruf ist in die stm32f10x_it.c verlegt, dort gehören alle 
Interruphandler rein. Auf die Keil-interne FW-Lib würde ich mich nicht 
verlassen, war außerdem alte Version. Projekt hat jetzt die FW-Lib 3.4.0 
integriert. Ordnerstrukturen so lassen.

µC ist STM32F103RE, ein HD-Device. Dafür ist auch der Startupcode drin. 
Falls das nicht stimmt, musst Du das noch ändern.

von Patrick L. (crashdemon)


Lesenswert?

Danke, ja die Fehlermeldungen sind jetzt weg, ganz schön kompliziert so 
ein umstieg von Atmel 8-Bit auf ST 32-Bit, soweit scheint es zu 
funktionieren, einzig die Kompilation dauert nun länger als vorher.

von Matthias K. (matthiask)


Lesenswert?

Cortex M3 ist schon eine andere Kategorie als AVR. Welchen Debugger 
verwendest Du?

von Patrick L. (crashdemon)


Lesenswert?

Im moment benutze ich den Keil eigenen Simulator, will mir aber vllt. 
bei zeiten einen JTAG Debugger zulegen, kannst du da einen empfehlen?

von Matthias K. (matthiask)


Lesenswert?

Patrick Langosch schrieb:
> m moment benutze ich den Keil eigenen Simulator, will mir aber vllt.
> bei zeiten einen JTAG Debugger zulegen, kannst du da einen empfehlen?

Wenn Du nur STM32 benutzen willst, ist der ST-Link eine gute Wahl. 
Billig und zuverlässig, ca. 25 Euro. Dann könntest Du auch das Atollic 
True Studio Lite (kostenlos) nutzen, auf Eclipse + GCC Basis. Hat keine 
Einschränkungen in Code- und Debuggröße.

Sonst div. andere, zB. J-Link von Segger

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.