BE_CHTI/Obj_4/Src/principal.c
2020-05-29 13:11:06 +02:00

145 rivejä
3,9 KiB
C

//AFONSO Perrine LARTIGUE Auriane
#include "gassp72.h"
#define SYSTICK_PER 360000 // 72 MHz * 5ms
#include "etat.h"
#define Periode_en_Tck PeriodeSonMicroSec*72
#define Periode_PWM_en_Tck 320
extern void timer_callback(void);
extern int PeriodeSonMicroSec;
extern short Son ;
extern int LongueurSon ;
type_etat etat;
unsigned short dma_buf[64]; // buffer de 64 short ints pour le DMA
int compteur[6]; //compteur d'occurence en fonction de M2(k) et M2TIR
int point[6]; // contient les points des 6 joueurs
int CalculM(int,unsigned short *);
int M2[64];
void sys_callback(){
GPIO_Set(GPIOB, 1); // pour mesurer la durée réelle du traitement DMA+DFT+compteurs.
// Démarrage DMA pour 64 points
Start_DMA1(64);
Wait_On_End_Of_DMA1();
Stop_DMA1;
int M2TIR=0x2A7138 ; //seuil à calculer
for (int k=0; k<64; k++){
M2[k]=CalculM(k,dma_buf);
if (M2[k] > M2TIR){ // incrémenté chaque fois que M2(k) dépasse le seuil fixé M2TIR
switch(k){
case 17:
compteur[0]++; //tir à 85kHz
break;
case 18:
compteur[1]++; //tir à 90kHz
break;
case 19:
compteur[2]++; // tir à 95kHz
break ;
case 20:
compteur[3]++; // tir à 100kHz
break;
case 23:
compteur[4]++; // tir à 115kHz
break;
case 24:
compteur[5]++; // tir à 120kHz
break;
}}
else {
switch(k){ //remise à zéro
case 17:
compteur[0]=0; //tir à 85kHz
break;
case 18:
compteur[1]=0; //tir à 90kHz
break;
case 19:
compteur[2]=0; // tir à 95kHz
break ;
case 20:
compteur[3]=0; // tir à 100kHz
break;
case 23:
compteur[4]=0; // tir à 115kHz
break;
case 24:
compteur[5]=0; // tir à 120kHz
break;
}
}
GPIO_Clear(GPIOB, 1);
}
for (int j = 0 ; j < 6 ; j++){
if(compteur[j]==3){
point[j]++; // on incremente le score du joueur j
etat.position = 0;
}
}
}
int main(){
//initialisation variable etat
etat.periode_ticks = PeriodeSonMicroSec ;
etat.taille = LongueurSon;
etat.son = &Son ;
etat.position = etat.taille;
// activation de la PLL qui multiplie la fréquence du quartz par 9
CLOCK_Configure();
// config port PB1 pour être utilisé en sortie
GPIO_Configure(GPIOB, 0, OUTPUT, ALT_PPULL);
etat.resolution = PWM_Init_ff( TIM3 , 3 , Periode_PWM_en_Tck );
// initialisation du timer 4
// Periode_en_Tck doit fournir la durée entre interruptions,
// exprimée en périodes Tck de l'horloge principale du STM32 (72 MHz)
Timer_1234_Init_ff( TIM4, Periode_en_Tck );
// enregistrement de la fonction de traitement de l'interruption timer
// ici le 2 est la priorité, timer_callback est l'adresse de cette fonction, a créér en asm,
// cette fonction doit être conforme à l'AAPCS
Active_IT_Debordement_Timer( TIM4, 2, timer_callback );
// lancement du timer
Run_Timer( TIM4 );
Run_Timer (TIM3) ;
// activation de la PLL qui multiplie la fréquence du quartz par 9
CLOCK_Configure();
// PA2 (ADC voie 2) = entrée analog
GPIO_Configure(GPIOA, 2, INPUT, ANALOG);
// PB1 = sortie pour profilage à l'oscillo
GPIO_Configure(GPIOB, 1, OUTPUT, OUTPUT_PPULL);
// PB14 = sortie pour LED
GPIO_Configure(GPIOB, 14, OUTPUT, OUTPUT_PPULL);
// activation ADC, sampling time 1us
Init_TimingADC_ActiveADC_ff( ADC1, 0x52 );
Single_Channel_ADC( ADC1, 2 );
// Déclenchement ADC par timer2, periode (72MHz/320kHz)ticks
Init_Conversion_On_Trig_Timer_ff( ADC1, TIM2_CC2, 225 );
// Config DMA pour utilisation du buffer dma_buf (a créér)
Init_ADC1_DMA1( 0, dma_buf );
// Config Timer, période exprimée en périodes horloge CPU (72 MHz)
Systick_Period_ff( SYSTICK_PER );
// enregistrement de la fonction de traitement de l'interruption timer
// ici le 3 est la priorité, sys_callback est l'adresse de cette fonction, a créér en C
Systick_Prio_IT( 3, sys_callback );
SysTick_On;
SysTick_Enable_IT;
while(1){
}
}