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?
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: