Ersteinmal die Facts:
Customboard mit STM32G07KB programmiert mit PlatformIO und geflasht mit
STLINK v2. Das Board tut aber eigentlich auch nichts zur Sache, wenn ich
das Programm für den "bluepill_f103c6" compiliere bekomme ich die
gleiche Fehlermeldung.
Ich habe schon eine Weile im Internet gesucht aber keine passende Lösung
gefunden. Es geht nur um eine Demo in der ein Interruppt-Routine
aufgerufen wird die von Timer TIM2 ausgelöst wird. Mit anderen MCUs habe
ich schon einiges gemacht aber bei den STM32 bin ich Anfänger.
Ich bin zum Beispiel nach folgendem Tutorial vorgegangen:
https://hackmd.io/@0xff07/Sy8U-l7Ec
Hier mein Code-Ausschnitt
1 | #include <stm32g071xx.h>
|
2 | #include <stm32g0xx_hal.h>
|
3 | #include <stm32g0xx_hal_rcc.h>
|
4 | #include <stm32g0xx_hal_usart.h>
|
5 | #include <stm32g0xx_hal_tim.h>
|
6 | #include <stm32g0xx_hal_tim_ex.h>
|
7 |
|
8 | static TIM_HandleTypeDef my_tim2;
|
9 |
|
10 | void timerInit()
|
11 | {
|
12 | __TIM2_CLK_ENABLE();
|
13 | my_tim2.Instance = TIM2; // siehe oben
|
14 | my_tim2.Init.CounterMode = TIM_COUNTERMODE_DOWN;
|
15 | my_tim2.Init.Prescaler = 64000;
|
16 | my_tim2.Init.Period = 50000;
|
17 | my_tim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
|
18 | my_tim2.Init.RepetitionCounter = TIM_AUTORELOAD_PRELOAD_DISABLE; // for PWM mode
|
19 | my_tim2.Channel = HAL_TIM_ACTIVE_CHANNEL_1;
|
20 | HAL_TIM_Base_Init(&my_tim2);
|
21 | HAL_TIM_Base_Start(&my_tim2);
|
22 | }
|
Bis dahin funktioniert auch alles. In der main.cpp lese ich den
Zählerwert periodisch aus und gebe ihn aus. Um jetzt den Interrupt
hinzuzufügen ändere ich
1 | HAL_TIM_Base_Start(&my_tim2);
|
zu
1 | HAL_TIM_Base_Start_IT(&my_tim2);
|
Dann hält das Programm an wenn der Timer bei 0 angekommen ist.
Wahrscheinlich ganz klar weil ich noch keine Interrupt Routine
gwschrieben habe. Also noch
1 | void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
|
2 | {
|
3 | if (htim == &my_tim2) {
|
4 | i++;
|
5 | }
|
6 | }
|
hinzugefügt. Aber da bekomme ich die Compiler/Linker Fehlermeldung:
"main.cpp:(.text.HAL_TIM_PeriodElapsedCallback+0x0): multiple definition
of `HAL_TIM_PeriodElapsedCallback'; ...
SrcWrapper/src/HardwareTimer.cpp.o:HardwareTimer.cpp:
.text.HAL_TIM_PeriodElapsedCallback+0x0): first defined here"
Ich verstehe das eigentlich so, im HAL-Driver ist diese Funktion als
"weak" gekennzeichnet und es sollte meine Funktion verwendet werden.
Was mache ich falsch?