STM32 Befehl: TIM_GetITStatus gibts nicht?

Gast #4329338
Lesenswert?

Hallo,
ich würde gerne mit Interrupts arbeiten.

Dazu muss ich im IRQ ja abfragen welches Interrupt ausgelöst wurde.

Dazu findet man mit Google immer den Befehl TIM_GetITStatus.

Aber 1. zeigt mir meine IDE einen Fehler an.(SW4STM32)
und 2. Gibt's den Befehl in keiner schimpfwort PDF?!

Hoffe auf Hilfe.
MfG.
#4329354
Lesenswert?

Rudii schrieb:
> Aber 1. zeigt mir meine IDE einen Fehler an.(SW4STM32)
> 2. Gibt's den Befehl in keiner schimpfwort PDF?!

Was deine IDE angeht: keine Ahnung. Ich schätze, dass entweder ein Pfad 
verbogen ist, oder die Datei nicht includiert wird.

Dann mach die stm32f10x_stdperiph_lib_um.chm (ersetze den ersten Teil 
entsprechend deiner SPL) auf und such dort danach. Oder besser noch: 
nutze ein Tool, das den Inhalt von Dateien durchsuchen kann (bspw. 
Notepad++) und lass das deinen SPL-Ordner durchsuchen. Dann hast du 
gleich den Pfad für die IDE.
Gast #4329371
Lesenswert?

Mich regt das irgendwie auf. Es gibt tausende Anleitungen zu diesem 
Thema. Aber irgendwie bin ich einfach zu dumm. Warum steht das denn in 
keiner der PDFs. Hab gehofft da sind alle Befehle dokumentiert. Ich 
stehe auf dem Schlauch.

MfG.
#4329382
Lesenswert?

Da du sehr wenig Infos lieferst, sagen wir mal so:

Wenn du die aktuellen HAL Treiber nutzt, helfen dir die Infos zur 
Standard Peripherie Library nur bedingt weiter.

Und wenn du weder die alte Standard Peripherie Library oder die HAL 
Treiber nutzt, solltest du das Prozessor Manual zu Rate ziehen und die 
jeweiligen Register auslesen.
Gast #4329443
Lesenswert?

Aus der Datei core_cm7.h:

/** \brief  Get Pending Interrupt

    The function reads the pending register in the NVIC and returns the 
pending bit
    for the specified interrupt.

    \param [in]      IRQn  Interrupt number.

    \return             0  Interrupt status is not pending.
    \return             1  Interrupt status is pending.
 */
__STATIC_INLINE uint32_t NVIC_GetPendingIRQ(IRQn_Type IRQn)
{
  return((uint32_t)(((NVIC->ISPR[(((uint32_t)(int32_t)IRQn) >> 5UL)] & 
(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL));
}

sucht Rudii sowas?

m.f.G.
Dieter
Gast #4329472
Lesenswert?

Hallo, ich wusste bisher nicht das es eine alte und neue Firmware gibt.

Ich benutze die neue HAL Firmware.

Ich möchte mit einem Timer ein Update Interrupt auslösen. Dazu wäre ich 
gern in der Lage mir das dazu benötigte Wissen aus den offiziellen 
Dokumenten von ST anzueignen. Leider habe ich das nicht geschafft, da 
ich nichts passendes finde(in den PDFs).

Dann habe ich gegoogelt und bin auf z.B. den Befehl

TIM_GetITStatus();

gestoßen. Doch leider funktioniert der bei mir nicht. Vll. weil er aus 
der alten Firmware stammt?

Wie mache ich das denn mit dem neuen Befehlen und wo finde ich diese? 
Hätte jemand ein Beispiel? Oder kann mir sagen wo die offizielle Doku 
davon ist?

Vielen Dank.
MfG
Gast #4329494
Lesenswert?

Mach es doch wie die meisten anderen auch.
Sieh dir die Beispiele zu deinem Controller an.
Für den Timer dann z.B. in:

Examples/TIM

Wenn Du dann auf einen dir unklaren Befehl triffst, gehe zu dessen 
Deklaration. Markieren und F3.
Gast #4329513
Lesenswert?

@hp-freund

Gemacht aber in den Samples ist auch nur ein leerer IRQHandler. Keine 
Befehle usw. Hab übrigens auch welche von anderen Boards etc. 
angeschaut.

Und CubeMX nutze ich so oder so. Aber auch hier: Leerer IRQHandler und 
keine Hinweise wie ich im IRQHandler frage ob z.B. Update ausgelöst 
wurde.

MfG.
Gast #4329567
Lesenswert?

Bin jzt durch weiteres stöbern auf folgenden Code gekommen, den ich in 
meinen IRQHandler packen würde:
1
if(__HAL_TIM_GET_IT_SOURCE(&htim2,TIM_IT_UPDATE) != RESET)
2
{
3
  //Mein Code der nach Überlauf des Timers startet
4
  __HAL_TIM_CLEAR_IT(htim2, TIM_IT_UPDATE);
5
}

Macht man das so?

Wie würde das mit Callbacks aussehen?
MfG.
Gast #4329598
Lesenswert?

Die callback Funktionen sind als Platzhalter (weak) schon vorhanden.
Du kannst in deiner main.c also einfach z.B. die Funktion schreiben:
1
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
2
{
3
    if(htim->Instance = TIM2)
4
    {
5
        // dann z.B.
6
        HAL_GPIO_WritePin(GPIOG,GPIO_PIN_2,GPIO_PIN_RESET);
7
    }
8

9
}

Und das wars schon...
Gast #4329625
Lesenswert?

Jep.
TIM2 ist Timer 2. Du kannst in der gleichen Funktion dann auch noch 
andere Timer cb Abfragen.
1
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
2
{
3
    if(htim->Instance = TIM2)
4
    {
5
        // war Timer 2 der Auslöser dann:
6
    }
7

8
    if(htim->Instance = TIM6)
9
    {
10
        // war Timer 6 der Auslöser dann:
11
    }
12
}

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren