#include "gassp72.h" #include "stdlib.h" // ********************** // * GESTION DU SON * // ********************** typedef struct { int position; // index courant dans le tableau d'echantillons int taille; // nombre d'echantillons de l'enregistrement short int *son; // adresse de base du tableau d'echantillons en ROM int resolution; // pleine echelle du modulateur PWM int Tech_en_Tck; // periode d'ech. audio en periodes d'horloge CPU } type_etat; // Variables définies en asm extern short Son; extern int LongueurSon; extern int PeriodeSonMicroSec; type_etat etat; int Periode_PWM_en_Tck = 1638; int Periode_ech_en_Tck = 6552; void timer_callback(void); // ************************ // * GESTION DU SCORE * // ************************ // Constantes #define NB_JOUEURS 6 #define TYPE_SIGNAL 0x33 const int SYSTICK_PER = 5*72000; const int N = 64; const int M2TIR = 985661; // Fe = 320 kHz donc pasFreq = 5 kHz // F1 = 85 kHz -> k = 17 // F2 = 90 kHz -> k = 18 // F3 = 95 kHz -> k = 19 // F4 = 100 kHz -> k = 20 // F5 = 115 kHz -> k = 23 // F6 = 120 kHz -> k = 24 const int kFreq[NB_JOUEURS] = {17, 18, 19, 20, 23, 24}; int dft(unsigned short *sig, int k); unsigned short *bufferDMA; int counters[NB_JOUEURS]; int debug_result[NB_JOUEURS]; int scores[NB_JOUEURS]; int time = 0; void incrementScore(int playerID) { // incrémentation du score ++scores[playerID]; // reset de la position pour jouer le son depuis le début etat.position = 0; } void callbackTimer(void) { // Démarrage DMA pour 64 points Start_DMA1(64); Wait_On_End_Of_DMA1(); Stop_DMA1; for (int i = 0; i < NB_JOUEURS; ++i) { int k = kFreq[i]; debug_result[i] = dft(bufferDMA, k); if (debug_result[i] > M2TIR) { ++counters[i]; if (counters[i] == 3) { incrementScore(i); } } else { counters[i] = 0; } } time += 5; } int main(void) { bufferDMA = malloc(N * sizeof(short)); for (int i = 0; i < NB_JOUEURS; ++i) { counters[i] = 0; scores[i] = 0; } // 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); // GESTION DU SON // 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); etat.taille = LongueurSon; etat.son = &Son; etat.position = LongueurSon; // 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_ech_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 pour jouer le son Run_Timer(TIM4); // activation ADC, sampling time 1us Init_TimingADC_ActiveADC_ff(ADC1, TYPE_SIGNAL); 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, bufferDMA); // 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é, callbackTimer est l'adresse de cette fonction, a créér en C Systick_Prio_IT(3, callbackTimer); SysTick_On; SysTick_Enable_IT; while(1) {} }