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.
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.
:
Bearbeitet durch User
Hallo, *stdperiph_lib_um.chm wo finde ich denn diese Datei? Im Firmware-Ordner leider nicht. MfG.
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.
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.
Wirf einen Blick in die jeweilige *_tim.h stm32f0xx_tim.h stm32f10x_tim.h usw.
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
Weiterraten? OK. stm32f4xx_hal_tim.h __HAL_TIM_GET_IT_SOURCE()
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
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.
@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.
Bei HAL ist das etwas abstrakter, da solltest Du dir die Callback-Funktionen ganauer ansehen.
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.
Rudii schrieb: > Hallo, ich wusste bisher nicht das es eine alte und neue Firmware gibt. Und einiges dazwischen. Der STM32 umfasst auch die Palette von STM32F0xx bis STM32F7xx mit mehr oder weniger Unterschieden. (Und noch viele mehr.) Daher wäre es mittlerweile mal gut dein genutztes Derivat zu benennen.
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...
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 | }
|
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.