Hi,
Kämpfe jetzt schon eine Weile mit einem Timer Interrupt auf einem
STM32F103CBT6 dev-board (Maple Mini Nachbau aus Fernost) herum und bitte
euch mal kurz den Code anzuschauen:
Da ich schon unzählige Beispielcodes durchforstet habe, denke ich dass
mein Code passen sollte. Oder kanns an der Initialisierung (startup
code) liegen, obwohl das ein- bzw. ausschalten der LED funktioniert.
Danke für durchsehen,
Max
Das wird im "startup_stm32f10x_md.s" (Hab die TrueSTUDIO Version aus der
CMSIS genommen) erledigt. Und grundsätzlich dürfte dann ja auch
Ansteuern der LED nicht funktionieren ... denke ich mir mal
OK, ich habs eingebaut aber keine Besserung.
Dennoch denke ich dass die SystemInit() noch vor dem Sprung in die
main() via startup aufgerufen wir.
Hier ein Auszug aus der startup_stm32f10x_md.s:
1
LoopFillZerobss:
2
ldr r3, = _ebss
3
cmp r2, r3
4
bcc FillZerobss
5
6
/* Call the clock system intitialization function.*/
Guten Morgen.
@Markus C.: Danke für deinen Beispielcode aber das Verhalten ändert sich
nicht.
Ich hab jetzt aber mal die Interruptfunktion rausgenommen und nur den
Timer laufen lassen. In der while schleife den Timer Counter abgefragt
und dementsprechend das LED ein oder aus geschaltet:
1
while(1){
2
unsignedlongcount=TIM_GetCounter(TIM2);
3
4
if(count>7100){
5
GPIO_SetBits(LED_PORT,LED_PIN);
6
7
}else{
8
GPIO_ResetBits(LED_PORT,LED_PIN);
9
}
10
}
Und siehe da, das LED blinkt. Also so wies aussieht scheint der Timer zu
feuern und es dürfte nur der Aufrufer der Interruptfunktion nicht
funktionieren ... stellt sich nur die Frage weshalb nicht!
Hallo,
Normalerweise ist es notwendig, nach dem Start des Timers das
Interruptflag zu löschen, weil es zu diesem Zeitpunkt gesetzt ist. Hatte
ein ähnliches Problem am STM32F411. Mir ist nur nicht klar, ob das ein
Bug oder ein Feature ist. ;)
Gruß Herby
Herbert P. schrieb:> Normalerweise ist es notwendig, nach dem Start des Timers das> Interruptflag zu löschen, weil es zu diesem Zeitpunkt gesetzt ist.
Jo, da war mal was. In einem älteren Motorkontroller, den ich mal mit
dem VL Discovery gemacht habe, findet sich folgender Kommentar:
1
voidTIM1_UP_TIM16_IRQHandler(void){
2
// mikrocontroller.net : Clear the IT pending bit before doing any GPIO stuff
Markus M. schrieb:> Ein TIM_ClearITPendingBit(TIM2, TIM_IT_Update) direkt nach dem> TIM_Cmd(TIM2, ENABLE) bringt auch nicht
Kannst du gerne machen - wichtig ist aber, das du es in der ISR direkt
am Anfang auch ausführst, ehe du an den GPIO rumfummelst.
Markus M. schrieb:> Ein TIM_ClearITPendingBit(TIM2, TIM_IT_Update) direkt nach dem> TIM_Cmd(TIM2, ENABLE) bringt auch nicht ... oder hab ich das falsch> verstanden?
Hamm, ja, so war es gemeint. Überprüfe mal in der Main den Zustand des
IT-Pending-Bits nach dem Starten des Timers. Das sollte in dem Fall
Klarheit schaffen.
Herby
Markus M. schrieb:> Ja, das hatte ich schon drinnen ... siehe meine ersten Post
Oh, sorry, das hatte ich übersehen. Ich hab allerdings in meiner Timer
Init Routine noch was gefunden, was evtl. interessant ist:
Die letzten beiden Zeilen. Warum und wieso darfst du mich im Moment
allerdings nicht fragen, das ist etwas länger her. Es kann sein, das das
nur dewegen nötig war, weil ich in der ISR die OC Register update.
Hi,
mir ist noch was aufgefallen an deinem Code. Bist du dir sicher, dass du
die Priority und die Subpriority beide auf 0x0f setzen willst. Ich bin
leider grade im Garten und habe die Manuals nicht dabei, aber ich
gluabe, das passt nicht zusammen. Wenn es dein Projekt zulässt, setze
beide mal probehalber auf 0.
Herby
@Herbert: Hatte auch schon andere Priorität, bringt aber auch nix.
Aber ich habe folgendes festgestellt. Setzte ich in meiner Main das LED
auf high (wird in der IntializeLEDs() auf low gesetzt), dann
funktioniert das nur wenn ich die InitializeTimer() nicht aufrufe!
1
intmain(void)
2
{
3
SystemInit();
4
5
IntializeLEDs();
6
InitializeTimer();
7
8
// Funktioniert nur wenn InitializeTimer() auskommentiert
Ich habe jetzt ein zweites Board [1] verwendet und siehe da ... der
Timer Interrupt funktioniert (mit selben Code)
Jetzt stellt sich mir natürlich die Frage wieso!
Beim andern Board (bei dems nicht läuft) hab ich mehr Flash, und dort
ist ein DFU Bootloader installiert, mit dem ich via USB flashe. Deshalb
hab ich das Linker Script angepasst - hier ein Auszug: