146 lines
3.6 KiB
C
146 lines
3.6 KiB
C
#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)
|
|
{
|
|
}
|
|
}
|