mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik IAR und TIM6,7 Interruptprobleme beim STM32F107


Autor: Simon (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
Ich bin STudent und will beweißen dass der NVIC wirktlich nestable ist. 
Mein Plan ist 2 irqs mithilfe von TIM6 and 7 zu generieren, dann 
Portpins setzten und das ganze mit dem Oszi nachprüfen...

soweit bin ich:

#include <include.h>



void main(void)
{


    RCC_APB2ENR = (1<<5);                  //enable Clock GPIOD
    RCC_APB1ENR = (U16)((1<<4) | (1<<5));         //enable Clock TIM6, 
TIM7

    SETENA1 = (U32)((1<<22) | (1<<23));

    TIM6_DIER = (1<<0);                    //enable TIM6 Interrupt
    TIM6_PSC=0x07D0;                       //prescaler 2000 => 36kHz
    TIM6_CR1 = (1<<7) | (1<<2) | (1<<0);

    TIM7_DIER = (1<<0);                    //enable TIM7 Interrupt
    TIM7_PSC=0x01F4;                       //prescaler 500 => 144kHz
    TIM7_CR1 = (1<<7) | (1<<2) | (1<<0);





    GPIOD_CRH &= 0x333FFFFF;
    GPIOD_BSRR = 0x0000E000;

    while(1){
    }


    return 0;
}



__irq void TIM6(void) {
    static int cnt=0;
    cnt++;
    }

__irq void TIM7(void);


Jetzt ist das Problem, dass die TIM6 Interrupts generieren (Ich sehs im 
Pending register) aber die TIM Handler werden nie gestartet. Stattdessen 
geht der Prozessor in den Fault Mode.

Danke für eure Hilfe

Simon

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Interrupts müssen beim STM32 meist im Handler explizit zurückgesetzt 
werden. Anders als beispielsweise bei AVRs passiert das nicht 
automatisch mit Aufruf des Handlers.

Es empfiehlt sich übrigens, statt
   RCC_APB1ENR = (U16)((1<<4) | (1<<5));
die im passenden Include-File der CMSIS definierten compilerübergreifend 
vereinheitlichten Registerzugriffstechniken und insbesondere die 
Bitnamen zu verwenden. Das sonst entstehende Zahlengeschwurbel ist ohne 
Handbuch unverifizierbar.

Autor: Simon (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ist klar, dass die Interrupts zurückgestetzt werden müssen. Der 
Interrupt wird kein einziges mal aufgerufen. Noch besser: Laut Linker 
map file wird die Funktion TIM6 nicht mal mitgelinkt!

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Dann hat sie möglicherweise den falschen Namen? Ich bin mit den IAR 
Compiler nicht vertraut. Bei den Cortexen liegt es von der Arbeitsweise 
des NVIC her nahe, dass die Zuordnung der ISRs zu den einzelnen 
Interruptvektoren über den Namen der Funktion erfolgt. Wie das genau 
funktioniert, das verrät dir hoffentlich das Handbuch vom IAR. Oder, 
wenn du Pech hast, etwas Gebuddel in den Startup- und Hilfscodes, die 
dem Programm von der Programmierumgebnug automatisch hinzugegeben 
werden.

Ausserdem sollte man bedenken, dass beim Cortex M3 eine ISR eine ganz 
normale C-Funktion ist, ohne spezielle Prolog/Epilog-Mechanismen wie sie 
bei anderen Prozessoren und älteren ARMs nötig sind. Daher stelle ich 
mal ganz blauäugig das Attribut __irq in Frage - vielleicht wird es beim 
CM3 eben grad nicht benötigt.

Autor: Simon (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also laut Verctor Table ist TIM6 Interrupt auf 0x118 und per define mit 
TIM6 verknüpft. Laut IAR Handbuch werden Interruptfunktionen mit __irq 
begonnen. Hab aber auch schon ohne Probiert... Kein Erfolg.
Beim aufkommen des Interrupts wird das Bit IACCVIOL in CFSR-reg gesetzt.

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn die ISR vom Compiler komplett ignoriert wird, dann benötigst du 
jemanden, der mit dem IAR Compiler besser vertraut ist. IAR? IAR 
Support-Forum? Gibt es Beispielcode speziell für IAR?

Autor: Hannes S. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Yep, das mit der IRQ Definition ist schonmal ein Punkt. Der IRQ Handler 
wird als ganz normale C Funktion gestaltet und muss einen vorgegebenen 
Namen haben, also:

void TIM6_IRQHandler(void)
{
}

Die Interrupttabelle findet sich in einem File Namens 
startup_stm32f10x_yy.s Dieses muss im Projekt mit eingebunden werden. 
Wobei "yy" je nach verwendeter Device z.B. "md" für Medium Density 
Devices ist.

Ansonsten fehlt noch das aktivieren der betreffenden NVIC Interrupts. 
Ich erledige das immer mit den Funktionen der Lib, also 
NVIC_EnableIRQ().

Alles in allem würde ich Dir empfehlen, mal mit den Samples von ST 
anzufangen. Die sind auch für IAR verfügbar und zeigen schonmal die 
wichtigsten vorgehensweisen zur Benutzung der Peripherie.

Autor: Simon (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also ich finde in inc von IAR dieses File: iostm32f107xx.h

Daraus hab ich entnommen:
/***************************************************************************
 **
 **  STM32F107xx Interrupt Lines
 **
 ***************************************************************************/
#define MAIN_STACK             0          /* Main Stack                   */
#define RESETI                 1          /* Reset                        */
#define NMII                   2          /* Non-maskable Interrupt       */
#define HFI                    3          /* Hard Fault                   */
#define MMI                    4          /* Memory Management            */
#define BFI                    5          /* Bus Fault                    */
#define UFI                    6          /* Usage Fault                  */
#define SVCI                  11          /* SVCall                       */
#define DMI                   12          /* Debug Monitor                */
#define PSI                   14          /* PendSV                       */
#define STI                   15          /* SysTick                      */
#define WWDG                  16          /* Window Watchdog interrupt    */
#define NVIC_PVD              17          /* PVD through EXTI Line detection interrupt*/
#define NVIC_TAMPER           18          /* Tamper interrupt             */
#define NVIC_RTC              19          /* RTC global interrupt         */
#define NVIC_FLASH            20          /* Flash global interrupt       */
#define NVIC_RCC              21          /* RCC global interrupt         */
#define NVIC_EXTI0            22          /* EXTI Line0 interrupt         */
#define NVIC_EXTI1            23          /* EXTI Line1 interrupt         */
#define NVIC_EXTI2            24          /* EXTI Line2 interrupt         */
#define NVIC_EXTI3            25          /* EXTI Line3 interrupt         */
#define NVIC_EXTI4            26          /* EXTI Line4 interrupt         */
#define NVIC_DMA_CH1          27          /* DMA Channel1 global interrupt*/
#define NVIC_DMA_CH2          28          /* DMA Channel2 global interrupt*/
#define NVIC_DMA_CH3          29          /* DMA Channel3 global interrupt*/
#define NVIC_DMA_CH4          30          /* DMA Channel4 global interrupt*/
#define NVIC_DMA_CH5          31          /* DMA Channel5 global interrupt*/
#define NVIC_DMA_CH6          32          /* DMA Channel6 global interrupt*/
#define NVIC_DMA_CH7          33          /* DMA Channel7 global interrupt*/
#define NVIC_ADC1_2           34          /* ADC global interrupt         */
#define NVIC_CAN1_TX          35          /* CAN1 TX interrupt */
#define NVIC_CAN1_RX0         36          /* CAN1 RX0 interrupt */
#define NVIC_CAN1_RX1         37          /* CAN1 RX1 interrupt            */
#define NVIC_CAN1_SCE         38          /* CAN1 SCE interrupt            */
#define NVIC_EXTI9_5          39          /* EXTI Line[9:5] interrupts    */
#define NVIC_TIM1_BRK         40          /* TIM1 Break interrupt         */
#define NVIC_TIM1_UP          41          /* TIM1 Update interrupt        */
#define NVIC_TIM1_TRG_COM     42          /* TIM1 Trigger and Commutation interrupts */
#define NVIC_TIM1_CC          43          /* TIM1 Capture Compare interrupt */
#define NVIC_TIM2             44          /* TIM2 global interrupt        */
#define NVIC_TIM3             45          /* TIM3 global interrupt        */
#define NVIC_TIM4             46          /* TIM4 global interrupt        */
#define NVIC_I2C1_EV          47          /* I2C1 event interrupt         */
#define NVIC_I2C1_ER          48          /* I2C1 error interrupt         */
#define NVIC_I2C2_EV          49          /* I2C2 event interrupt         */
#define NVIC_I2C2_ER          50          /* I2C2 error interrupt         */
#define NVIC_SPI1             51          /* SPI1 global interrupt        */
#define NVIC_SPI2             52          /* SPI2 global interrupt        */
#define NVIC_USART1           53          /* USART1 global interrupt      */
#define NVIC_USART2           54          /* USART2 global interrupt      */
#define NVIC_USART3           55          /* USART3 global interrupt      */
#define NVIC_EXTI15_10        56          /* EXTI Line[15:10] interrupts  */
#define NVIC_RTC_ALARM        57          /* RTC alarm through EXTI line interrupt */
#define NVIC_OTG_FS_WKUP      58          /* USB On-The-Go FS Wakeup through EXTI line interrupt */
#define NVIC_TIM5             66          /* TIM5 global interrupt        */
#define NVIC_SPI3             67          /* SPI3 global interrupt        */
#define NVIC_UART4            68          /* UART4 global interrupt       */
#define NVIC_UART5            69          /* UART5 global interrupt       */
#define NVIC_TIM6             70          /* TIM6 global interrupt        */
#define NVIC_TIM7             71          /* TIM7 global interrupt        */
#define NVIC_DMA2_CH1         72          /* DMA2 Channel1 global interrupt*/
#define NVIC_DMA2_CH2         73          /* DMA2 Channel2 global interrupt*/
#define NVIC_DMA2_CH3         74          /* DMA2 Channel3 global interrupt*/
#define NVIC_DMA2_CH4         75          /* DMA2 Channel4 global interrupt*/
#define NVIC_DMA2_CH5         76          /* DMA2 Channel5 global interrupt*/
#define NVIC_ETH              77          /* Ethernet global interrupt     */
#define NVIC_ETH_WKUP         78          /* Ethernet Wakeup through EXTI line interrupt*/
#define NVIC_CAN2_TX          79          /* CAN2 TX interrupt */
#define NVIC_CAN2_RX0         80          /* CAN2 RX0 interrupt */
#define NVIC_CAN2_RX1         81          /* CAN2 RX1 interrupt            */
#define NVIC_CAN2_SCE         82          /* CAN2 SCE interrupt            */
#define NVIC_OTG_FS           83          /* USB On The Go FS global interrupt */

#endif    /* __IOSTM32F107xx_H */

/*###DDF-INTERRUPT-BEGIN###
Interrupt0   = NMI            0x08
Interrupt1   = HardFault      0x0C
Interrupt2   = MemManage      0x10
Interrupt3   = BusFault       0x14
Interrupt4   = UsageFault     0x18
Interrupt5   = SVC            0x2C
Interrupt6   = DebugMon       0x30
Interrupt7   = PendSV         0x38
Interrupt8   = SysTick        0x3C
Interrupt9   = WWDG           0x40
Interrupt10  = PVD            0x44
Interrupt11  = TAMPER         0x48
Interrupt12  = RTC            0x4C
Interrupt13  = FLASH          0x50
Interrupt14  = RCC            0x54
Interrupt15  = EXTI0          0x58
Interrupt16  = EXTI1          0x5C
Interrupt17  = EXTI2          0x60
Interrupt18  = EXTI3          0x64
Interrupt19  = EXTI4          0x68
Interrupt20  = DMA1Ch1        0x6C
Interrupt21  = DMA1Ch2        0x70
Interrupt22  = DMA1Ch3        0x74
Interrupt23  = DMA1Ch4        0x78
Interrupt24  = DMA1Ch5        0x7C
Interrupt25  = DMA1Ch6        0x80
Interrupt26  = DMA1Ch7        0x84
Interrupt27  = ADC1_2         0x88
Interrupt28  = CAN1_TX        0x8C
Interrupt29  = CAN1_RX0       0x90
Interrupt30  = CAN1_RX1       0x94
Interrupt31  = CAN1_SCE       0x98
Interrupt32  = EXTI9_5        0x9C
Interrupt33  = TIM1_BRK       0xA0
Interrupt34  = TIM1_UP        0xA4
Interrupt35  = TIM1_TRG_COM   0xA8
Interrupt36  = TIM1_CC        0xAC
Interrupt37  = TIM2           0xB0
Interrupt38  = TIM3           0xB4
Interrupt39  = TIM4           0xB8
Interrupt40  = I2C1_EV        0xBC
Interrupt41  = I2C1_ER        0xC0
Interrupt42  = I2C2_EV        0xC4
Interrupt43  = I2C2_ER        0xC8
Interrupt44  = SPI1           0xCC
Interrupt45  = SPI2           0xD0
Interrupt46  = USART1         0xD4
Interrupt47  = USART2         0xD8
Interrupt48  = USART3         0xDC
Interrupt49  = EXTI15_10      0xE0
Interrupt50  = RTCAlarm       0xE4
Interrupt51  = OTG_FSWakeup   0xE8
Interrupt52  = TIM5           0x108
Interrupt53  = SPI3           0x10C
Interrupt54  = UART4          0x110
Interrupt55  = UART5          0x114
Interrupt56  = TIM6           0x118
Interrupt57  = TIM7           0x11C
Interrupt58  = DMA2Ch1        0x120
Interrupt59  = DMA2Ch2        0x124
Interrupt60  = DMA2Ch3        0x128
Interrupt61  = DMA2Ch4        0x12C
Interrupt62  = DMA2Ch5        0x130
Interrupt63  = ETH            0x134
Interrupt64  = ETHWakeup      0x138
Interrupt65  = CAN2_TX        0x13C
Interrupt66  = CAN2_RX0       0x140
Interrupt67  = CAN2_RX1       0x144
Interrupt68  = CAN2_SCE       0x148
Interrupt69  = OTG_FS         0x14C
 
###DDF-INTERRUPT-END###*/


Aber so gehts ja nicht!

Hab mir die entsprechenden s files geholt, und mal ausprobiert. War klar 
geht nichts. Nur ein haufen errors. Ich such mal weiter. Danke für den 
Tipp, habs Gefühl dass is der Richtige weg :)

ach ja: 
http://code.google.com/p/stm32f107/source/browse/t...

Link zu den *.s files...

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Simon schrieb:

> Link zu den *.s files...

Und ebendort finde ich in der Vektorleiste beispielsweise Namen wie 
"TIM2_IRQHandler". Und drunter die Defaults mit Hardfault für nicht 
definierte Handler, in denen du offenkundig landest.

Also das was ich sagte: falscher Funktionsname.

Autor: Simon (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Und das was ich gepostet hab, ist das keine korrekte Vektortabelle?

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich sehe darin oben nur einen Haufen #defines der Vektorindizes und 
darunter einen länglichen Kommentar für rechenschwache Zeitgenossen. 
Eine Tabelle sehe ich dort nicht. Die Tabelle sehe ich hingegen in 
http://code.google.com/p/stm32f107/source/browse/t...

Autor: Simon (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Gut das erklärt dann meinen nichterfolg!
Dann werd ich jetzt nachsuchen wie ich eine Vektortabelle bauen kann...

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du solltest erst einmal rauskriegen, wie sich IAR die Entwicklung von 
Programmen für STM32 vorgestellt hat, bevor du nacheinander sämtliche 4 
Räder deines Autos einzeln neu erfindest.

Ist ja nicht so, dass IAR ein völliger Neuling in der Branche wäre.

Autor: Hannes S. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich kann mich da A.K. nur anschließen. Geh einfach mal zu ST und lad Dir 
die STM32F10x_StdPeriph_Lib runter. Dort drinnen gibt es neben den 
Samples auch ein IAR Template Project welches als Ausgangspunkt für 
eigene Entwicklungen dienen sollte. Und selbst wenn Du die Lib dann 
nicht nutzen magst erklärt sich doch vieles, indem man den Code einfach 
durchliest.

Aber auch IAR bringt im Ordner Examples->ST->STM32F103x einige Beispiele 
mit, unter anderem auch für den F107. Der Nachteil ist hier lediglich, 
dass die von IAR mitgelieferte ST-Library meist einige Versionsnummern 
hinterherhinkt (und alte Versionen hatten durchaus den ein oder anderen 
Bug...)

Autor: Simon (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jut. Es Funktioniert. Es reicht die Verktortabelle ins 
Projektverzeichniss zu legen und irgendwo die Funktion sysinit zu 
deklarieren, meinetwegen um z.b. möglichst früh irgendwelche Portpins 
richtig einzustellen...

Danach kann jeder Interrupt korrekt ausgeführt werden!

Vielen dank für eure Hilfe

Autor: Simon (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ach ja und die Interrupts werden automatisch zurückgesetzt! Zumindest 
auf NVIC Seite. Beim Timer muss im Statusregister der Interruptrequest 
per Software zurückgesetzt werden. Genau wie bei AVR...

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.