//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){ } }