[Schiano] Traccia esame 09/03/15

sustekk

Membro
26 Novembre 2014
8
0
1
Salve ragazzi, qualche anima pia ha per caso la traccia di laboratorio di MAPI per la modalità scheda STMF4? Grazie mille anticipatamente a chi risponderà
 

poel

Administrator
Staff Forum
Utente Premium
29 Maggio 2013
493
1
87
28
Scusa per il ritardo, comunque questa dovrebbe essere la traccia del 9 marzo, svolta nel gruppo facebook.


PHP:
 Configurare il convertitore AD per misurare ogni secondo (gestito con Timer2) la temperatura mediante il sensore interno.
Configurare il DMA in maniera tale da trasferire automaticamente i campioni dall'ADC a un blocco di memoria di 10 elementi gestiti in modalità buffer circolare.
Configurare il tasto USER come sorgente di interrupt. Alla prima pressione si avvia il processo di misura. Alla seconda pressione si interrompe e
si visualizzano il valore medio e l'incertezza di categoria A della temperatura. */

#include <stm32f4xx.h>
#include "math.h"

#define N 10
short int dest[N]={0};
void EXTI0_IRQHandler(void);
int flag=1;
int media=0;
float incertezzaA=0;
int i=0;

int main (void){
RCC->AHB1ENR |=1; //ABILITO PORTE A
RCC->APB2ENR |= (1<<14); //ABILITO SYSCFG
RCC->AHB1ENR |= (1<<22); //ABILITO DMA2 (da tab 28 del dma vedo che adc1 si trova in dma2 stream0)
RCC->APB2ENR |=(1<<8); //ABILITO ADC1
RCC->APB1ENR |=1; //ATTIVO TIMER2

//CONFIGURAZIONE DMA2
DMA2_Stream0->CR |= (1<<13); //MSIZE 16BIT
DMA2_Stream0->CR |= (1<<11); //PSIZE 16BIT
DMA2_Stream0->CR |= (1<<10); //MINC
//DMA2_Stream0->CR |= (1<<5); //Controllo alla periferica( non uso PINC altrimenti andrei a leggere registri al di fuori del DR dell' ADC)
DMA2_Stream0->CR |=(1<<8); //BUFFER CIRCOLARE
DMA2_Stream0->NDTR=N; //TRASFERIMENTI DA COMPIERE
DMA2_Stream0->PAR=(uint32_t)(&(ADC1->DR)); //& PER L'INDIRIZZO
DMA2_Stream0->M0AR=(uint32_t)dest;
DMA2_Stream0->CR |=1; //Abilitazione EN
//Per ora non succede nulla perchè DR è ancora vuoto

//CONFIGURAZIONE TIMER2
TIM2->CR1 |=(1<<2); //NOSWUPD
TIM2->CR2 |= (1<<5); //TRGOEN : 010: Update - The update event is selected as trigger output (TRGO).
// For instance a master timer can then be used as a prescaler for a slave timer.
TIM2->PSC=1;
TIM2->ARR =36000000;

//CONFIGURAZIONE ADC1

ADC1->SQR3 |= (1<<4); //To use the sensor: Select ADC1_IN16 or ADC1_IN18 input channel.
ADC1->SMPR2 |= (0x7)<<3; //Select a sampling time greater than the minimum sampling time specified in the datasheet.
ADC->CCR |= (1<<23); //Set the TSVREFE bit in the ADC_CCR register to wake up the temperature sensor from power down mode

ADC1->CR2 |=(1<<9); //DDS
ADC1->CR2 |=(1<<8); //DMA

ADC1->CR2 |=(1<<28); //IL TRIGGER SI DEVE ATTIVARE SOLO SUL FRONTE DI SALITA.
ADC1->CR2 |=0x6000000; //VOGLIAMO DIRE QUANDO INIZIARE LA CONVERSIONE PER IL GRUPPO DI CANALI REGOLARI.
//NEL NOSTRO CASO STIAMO USANDO TIMER2
//QUINDI VOGLIAMO TIMER2 TRGO EVENT (0110)

//CONFIGURAZIONE EXTI0
//PA0 E' IN INPUT QUINDI NON DEVO IMPOSTARE NULLA.
EXTI->IMR |= 1; //NON MASCHERO PA0
EXTI->RTSR |= 1; //TRIGGER SALITA PA0
SYSCFG->EXTICR[0] &= ~0xF; //seleziono pa0 nel multiplexer (predefinito)
NVIC->ISER[0] |= 1<<6; //ABILITO INTERRUPT SU EXT0

while(1);
}

void EXTI0_IRQHandler(void) {
if(flag) {
EXTI->PR |=1;
ADC1->CR2 |=1; //ADON
TIM2->CR1 |=1; //EN TIMER2
ADC1->CR2 |=(1<<30); //SWSTART
flag=0; }
else{
ADC1->CR2 &=~ 1; //SPENGO ADC
//media
for(i=0; i<N; i++) {
media=media+dest[i];
media=media/N;
//incertezzaA
for (i=0; i<N; i++){
incertezzaA=incertezzaA+pow(dest[i]-media,2);
incertezzaA=pow(incertezzaA/N, 0.5); }
}
flag=1; }
}
 

Seguici su Facebook