Gestione delle interrupt con stm32f401xC

apagano

Membro
4 Gennaio 2014
5
1
3
Ragazzi ho difficoltà con i programmi che utilizzano le interrupt. In pratica li faccio compilare ma noto che non riesce a saltare nella routine di interrupt. Qualcuno sa dirmi cosa devo fare per fare funzionare correttamente il progetto? (N.B. i codici sono quelli inseriti su questo sito)
 

poel

Administrator
Staff Forum
Utente Premium
29 Maggio 2013
493
1
87
28
Ragazzi ho difficoltà con i programmi che utilizzano le interrupt. In pratica li faccio compilare ma noto che non riesce a saltare nella routine di interrupt. Qualcuno sa dirmi cosa devo fare per fare funzionare correttamente il progetto? (N.B. i codici sono quelli inseriti su questo sito)
Se ti riferisci a questo codice
PHP:
#include "stm32f4xx.h"

//devo definire cosa fa questa routine,
//il cui prototipo è contenuto nel file di startup
void EXTI0_IRQHandler();

int main (void){
  RCC->AHB1ENR |= 0x9; //abilito il clock per portd e il pulsante 1001
  RCC->APB2ENR |= (1<<14);// abilito syscfg (per le interrupt)

  GPIOD->MODER |= (0x55<<24); //configuro i pin 12 13 14 15 in GPIO
  EXTI->IMR |= 1; //maschero il primo bit (per il pulsante)
  SYSCFG->EXTICR[0]&=!(0xF);
  EXTI->RTSR |= 1; //scelgo il fronte di salita (per il pin 0)
  NVIC->ISER[0] |= (1<<6); //devo servire la routine in posizione [0]6 dell'NVIC
  while(1);
}

void EXTI0_IRQHandler(){
    EXTI->PR |= 1; //disabilito il pending request
    GPIOD->ODR |= (0xF<<12); //1111 sul bit 12 13 14 15
}
L'ho appena testato e funziona, sei sicuro di aver premuto il pulsante giusto (blu)?
 

apagano

Membro
4 Gennaio 2014
5
1
3
Se ti riferisci a questo codice
PHP:
#include "stm32f4xx.h"

//devo definire cosa fa questa routine,
//il cui prototipo è contenuto nel file di startup
void EXTI0_IRQHandler();

int main (void){
  RCC->AHB1ENR |= 0x9; //abilito il clock per portd e il pulsante 1001
  RCC->APB2ENR |= (1<<14);// abilito syscfg (per le interrupt)

  GPIOD->MODER |= (0x55<<24); //configuro i pin 12 13 14 15 in GPIO
  EXTI->IMR |= 1; //maschero il primo bit (per il pulsante)
  SYSCFG->EXTICR[0]&=!(0xF);
  EXTI->RTSR |= 1; //scelgo il fronte di salita (per il pin 0)
  NVIC->ISER[0] |= (1<<6); //devo servire la routine in posizione [0]6 dell'NVIC
  while(1);
}

void EXTI0_IRQHandler(){
    EXTI->PR |= 1; //disabilito il pending request
    GPIOD->ODR |= (0xF<<12); //1111 sul bit 12 13 14 15
}
L'ho appena testato e funziona, sei sicuro di aver premuto il pulsante giusto (blu)?

Ma il file di startup quale sarebbe?
 

poel

Administrator
Staff Forum
Utente Premium
29 Maggio 2013
493
1
87
28
Nella cartella "template" (fornita dal prof) dovresti avere tre file : main, startup e system
nel file startup trovi la dichiarazione della routine per la linea 0 (Quella del pulsante) che devi definire nel tuo codice (devi dirgli "cadda fa" quando si genera l'interrupt sulla linea 0)
 

Allegati

  • Schermata 2015-04-16 alle 18.20.03.png
    Schermata 2015-04-16 alle 18.20.03.png
    57.7 KB · Visualizzazioni: 16

Seguici su Facebook