Howdie, ich programmiere mit einem STM32F407 Mikrocontroller und möchte gerne wissen ob mir jemand sagen kann wie ich für kurze Zeit einen Interupt disablen und anschließen wieder enablen kann? Kann mir jemand einen Befehl dazu nennen? Vielen dank schonmal!!
es müsste so funktionieren: NVIC_InitStructure.NVIC_IRQChannelCmd = DISABLE; allerdings musst du dazu deine initstruktur wieder aufrufen. Mein Tipp wäre du suchst das passende Bit im Register und löschst es selbst ohne die Struktur.
Fragender schrieb: > Howdie, > > ich programmiere mit einem STM32F407 Mikrocontroller und möchte gerne > wissen ob mir jemand sagen kann wie ich für kurze Zeit einen Interupt > disablen und anschließen wieder enablen kann? > Kann mir jemand einen Befehl dazu nennen? > Vielen dank schonmal!! Was genau möchtest du denn machen? Oft ist es nicht erforderlich und/oder empfehlenswert in das laufende Interruptsystem einzugreifen.
ich messe Frequenzen mit dem Input Capture Mode dazu wird ein Interrupt aufgerufen, mein Problem: Die Frequenzen werden gemessen, alles Supi: ABER für eine kurze zeit bricht ab und zu die gemessene Frequenz ein und ich dachte dass liegt vllt daran, dass ein andere Interrupt die frequenzmessung stört?!
Fragender schrieb: > Die Frequenzen werden gemessen, alles Supi: > ABER für eine kurze zeit bricht ab und zu die gemessene Frequenz ein und > ich dachte dass liegt vllt daran, dass ein andere Interrupt die > frequenzmessung stört?! Oder der Timer läuft über?
Fragender schrieb: > ich messe Frequenzen mit dem Input Capture Mode > dazu wird ein Interrupt aufgerufen, mein Problem: > > Die Frequenzen werden gemessen, alles Supi: > ABER für eine kurze zeit bricht ab und zu die gemessene Frequenz ein und > ich dachte dass liegt vllt daran, dass ein andere Interrupt die > frequenzmessung stört?! Wie ich mir dachte. Grundsätzlich ist der Interrupt-Controller des Cortex-M sehr clever und bestens fuer diesen Fall gerüstet. Ideallerweise hat dein Capture-Interrupt die höchste Priorität im NVIC. http://www.keil.com/pack/doc/cmsis/core/html/group___n_v_i_c__gr.html#ga5bb7f43ad92937c039dee3d36c3c2798 Damit ist sichergestellt dass er nach der höchsten Latenz (16 cycles) bedient wird und alle möglichen aktiven Interrupts verdrängt. Je nach Frequenz ist es wichtig dass dieser Interrupt zwischen 2 Interrupt-triggerenden Flanken fertig wird. Im Zweifel musst du dafür unwichtige Dinge aus der ISR auslagern. Andere Interrupts zu deaktivieren führt hingegen bestenfalls zu verpassten Interrupts auf die du im Zweifel gerne reagiert hättest (nur eben später).
@ Matthias, danke schonmal, also genau ich messe 2 Frequenzen und während dessen empfange und sende ich Daten via USART, wenn ich USART ausschalte klappt das mit der Frequenzmessung wunderbar, sobald ich USART aber einschalte kommt diese Schwankung. Jetzt muss ich ja irgendwie für die IRQ des Input-Capture versuchen die USART-Kommunikation auszuschalten, oder wie versteh ich das????
Nein, du musst die Priorität des Input-Capture IRQs höher als die des USART IRQs setzen, den Rest regelt der IRQ Controller. LG Jan
Du musst/solltest im NVIC deinem Timer eine höhere Priorität geben, als deinem USART. Du brauchst den Interrupt nicht zu deaktivieren. Ist dein Programm dann in der USART_ISR, kann diese unterbrochen werden um deine TIMER_ISR auszuführen. Ist die TIMER_ISR fertig, wird wieder in der USART_ISR weiter gearbeitet.
0 ist die höchste Priorität! also in entwa so? InputCapture: NVIC_InitTypeDef NVIC_InitStructure; // NVIC init NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); USART: NVIC_InitTypeDef NVIC_InitStructure; USART_InitTypeDef USART_InitStruct; // NVIC init NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority =1; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure);
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.