#include "etat.h" #include "gassp72.h" #define Periode_PWM_en_Tck 360 //Correspond à une fréquence de 20kHz //on se retrouve sur l'oscillo à une fréquence d'environ 36Hz int module(int k, unsigned short *); unsigned short dma_buf[64]; int occurences[6]; int score[6]; int SYSTICK_PER=360000; extern short Son; extern int LongueurSon; extern int PeriodeSonMicroSec; type_etat etat; void timer(void); #define M2TIR 0x2AFCFF //3C268D int mod[64]; void sys_callback(){ GPIO_Set(GPIOB, 1); // Démarrage DMA pour 64 points Start_DMA1(64); Wait_On_End_Of_DMA1(); Stop_DMA1; for (int k=0; k<64; k++){ mod[k]=module(k,dma_buf); if (mod[k] > M2TIR){ // incrémenté chaque fois que M2(k) dépasse le seuil fixé M2TIR switch(k){ case 17: occurences[0]++; //tir à 85kHz break; case 18: occurences[1]++; //tir à 90kHz break; case 19: occurences[2]++; // tir à 95kHz break ; case 20: occurences[3]++; // tir à 100kHz break; case 23: occurences[4]++; // tir à 115kHz break; case 24: occurences[5]++; // tir à 120kHz break; }} else { switch(k){ //remise à zéro case 17: occurences[0]=0; //tir à 85kHz break; case 18: occurences[1]=0; //tir à 90kHz break; case 19: occurences[2]=0; // tir à 95kHz break ; case 20: occurences[3]=0; // tir à 100kHz break; case 23: occurences[4]=0; // tir à 115kHz break; case 24: occurences[5]=0; // tir à 120kHz break; } } GPIO_Clear(GPIOB, 1); } for(int i=0;i<6;i++) { if(occurences[i]==3) { score[i]++; etat.position=0; } } } int main(void) { etat.son=&Son; etat.taille=LongueurSon; int Periode_en_Tck; Periode_en_Tck=PeriodeSonMicroSec*72; etat.periode_ticks=Periode_en_Tck; etat.position=etat.taille; // activation de la PLL qui multiplie la fréquence du quartz par 9 CLOCK_Configure(); // config port PB0 pour être utilisé par TIM3-CH3 GPIO_Configure(GPIOB, 0, OUTPUT, ALT_PPULL); // config TIM3-CH3 en mode PWM 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 ); // lancement du timer Run_Timer( TIM4 ); Run_Timer( TIM3); // 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) { } }