programma schedino non entra nelle eccezioni

marcus995

Membro
27 Ottobre 2014
7
1
3
sto studiando da mapi for dummies, per ora sto cimentandomi nei programmi proposti dal pdf, ma le interruzioni non funzionano: il comando NVIC->ISER[0] |= 1<<6; non mi porta ad eseguire la EXTI0_IRQHandler()

ho aggiunto al progetto i file necessari, tant'è che il clock adesso è 72Hz quindi funzionano. ne sapete qualcosa?


C++:
#include <stm32f30x.h>
#include <stdio.h>

void abilitazione_periferiche();
void setup_ADC();
void setup_DAC();
void setup_EXTI();
void disabilitazione_periferiche();

//variabili del DAC
int codice_in = 2017;
float tensione_out;

//variabili dell'ADC
float tensione_in;
int codice_out;

void main()
{
  abilitazione_periferiche();

  GPIOA->MODER |= GPIO_MODER_MODER4;           //PA4, analogico
  GPIOA->MODER |= GPIO_MODER_MODER2;           //PA2, analogico
  GPIOA->MODER &= ~GPIO_MODER_MODER0;          //PA0, digitale, in input

  //setup di DAC e ADC e EXTI
  setup_ADC();
  setup_DAC();
  setup_EXTI();

  //risultato (DAC)
  tensione_out= codice_in * (3.0/4095.0);

  printf("DAC\n");
  printf("ingresso: %d\n", codice_in);
  printf("uscita: %f V\n\n", tensione_out);
  printf("_______________\n\n");

  while(1);

}

void abilitazione_periferiche(){

  RCC->AHBENR |= RCC_AHBENR_GPIOAEN;              //abilitazione GPIOA
  RCC->AHBENR |= RCC_AHBENR_ADC12EN;              //abilitazione ADC12
  RCC->APB1ENR |= RCC_APB1ENR_DACEN;              //abilitazione DAC1
  RCC->APB2ENR |= RCC_APB2ENR_SYSCFGEN;           //abilitazione SYSCFG

  /*i registri SYSCFG servono a selezionare il tipo di porta (A,...,F), mentre la
  linea la seleziono con EXTI (0,...,15)*/
}

void setup_ADC(){
  //abilitazione regolatore di tensione
  ADC1->CR &= ~ADC_CR_ADVREGEN_1;                       //ADVREGEN = 10->00
  ADC1->CR |= ADC_CR_ADVREGEN_0;                        //ADVREGEN = 00->01
  for(int i=0; i<1000; i++);                            //attendo 10 uS

  //configurazione clock
  ADC1_2->CCR |= ADC12_CCR_CKMODE_0;                    //CKMODE = 0, clock del bus AHB

  //calibrazione ADC
  ADC1->CR |= ADC_CR_ADCAL;                             //avvio calibrazione, ADCAL = 1
  while((ADC1->CR & ADC_CR_ADCAL) == ADC_CR_ADCAL);     //attendo che abbia completato

  //abilitazione ADC
  ADC1->CR |= ADC_CR_ADEN;                              //ADEN=1, abilito l'ADC
  while((ADC1->ISR & ADC_ISR_ADRD) != ADC_ISR_ADRD);    //attendo finché ADRDY=1

  //configurazione ADC
  ADC1->CFGR &= ~ADC_CFGR_CONT;                         //CONT=0, singola conversione
  ADC1->SQR1 = (3<<6);                                  //canale 3, PA2
  ADC1->SQR1 &= ~ADC_SQR1_L;                            //L=0, 1 conversione
  ADC1->SMPR1 |= ADC_SMPR1_SMP3;                        //SMPR3 = 111, clock a 601
}

void setup_DAC(){
  DAC->CR |= DAC_CR_EN1;        //abilitazione del canale1
  DAC->DHR12R1 = codice_in;     //scrittura codice nel DHR
  for(int i=0;i<1000;i++);      //attendo 10 uS per la generazione di tensione
}

void setup_EXTI(){
  SYSCFG->EXTICR[1] &= ~7;      //EXTI=000, porta A
  EXTI->IMR |= EXTI_IMR_MR0;    //maschera disabilitata per la linea 0
  EXTI->RTSR |= EXTI_RTSR_TR1;  //impostato sul fronte di salita
  NVIC->ISER[0] |= 1<<6;        //NVIC serve EXTI0
}

void EXTI0_IRQHandler(){
  EXTI->PR |= EXTI_PR_PR0;      //cancello la pending request

  //conversione
  ADC1->CR |= ADC_CR_ADSTART;                      //avvio conversione
  while((ADC1->ISR & ADC_ISR_EOC) != ADC_ISR_EOC); //attesa EOC

  //risultato (ADC)
  codice_out = ADC1->DR;        //prendo il codcice dal registro dell'ADC
  tensione_in = codice_out *(3.0/4095.0);

  printf("ADC\n");
  printf("ingresso: %f\n", tensione_in);
  printf("uscita: %d V\n\n", codice_out);
  printf("_______________\n\n");
}
 
Ultima modifica da un moderatore:

Seguici su Facebook