Projet_voilier2/Drivers/Src/ADC.c
2023-03-27 20:17:23 +02:00

191 lines
No EOL
4.1 KiB
C
Raw Blame History

#include "ADC.h"
void (*adc1_ptr_func)(void);
void (*adc2_ptr_func)(void);
void MyADC_init(MyADC_Struct_TypeDef* myADC)
{
MyGPIO_Struct_TypeDef Port_ADC;
switch (myADC->channel)
{
case 0:
Port_ADC.GPIO=GPIOA;
Port_ADC.GPIO_Conf=In_Analog;
Port_ADC.GPIO_Pin=0;
MyGPIO_Init(&Port_ADC);
break;
case 1:
Port_ADC.GPIO=GPIOA;
Port_ADC.GPIO_Conf=In_Analog;
Port_ADC.GPIO_Pin=1;
MyGPIO_Init(&Port_ADC);
break;
case 2:
Port_ADC.GPIO=GPIOA;
Port_ADC.GPIO_Conf=In_Analog;
Port_ADC.GPIO_Pin=2;
MyGPIO_Init(&Port_ADC);
break;
case 3:
Port_ADC.GPIO=GPIOA;
Port_ADC.GPIO_Conf=In_Analog;
Port_ADC.GPIO_Pin=3;
MyGPIO_Init(&Port_ADC);
break;
case 4:
Port_ADC.GPIO=GPIOA;
Port_ADC.GPIO_Conf=In_Analog;
Port_ADC.GPIO_Pin=4;
MyGPIO_Init(&Port_ADC);
break;
case 5:
Port_ADC.GPIO=GPIOA;
Port_ADC.GPIO_Conf=In_Analog;
Port_ADC.GPIO_Pin=5;
MyGPIO_Init(&Port_ADC);
break;
case 6:
Port_ADC.GPIO=GPIOA;
Port_ADC.GPIO_Conf=In_Analog;
Port_ADC.GPIO_Pin=6;
MyGPIO_Init(&Port_ADC);
break;
case 7:
Port_ADC.GPIO=GPIOA;
Port_ADC.GPIO_Conf=In_Analog;
Port_ADC.GPIO_Pin=7;
MyGPIO_Init(&Port_ADC);
break;
case 8:
Port_ADC.GPIO=GPIOB;
Port_ADC.GPIO_Conf=In_Analog;
Port_ADC.GPIO_Pin=0;
MyGPIO_Init(&Port_ADC);
break;
case 9:
Port_ADC.GPIO=GPIOB;
Port_ADC.GPIO_Conf=In_Analog;
Port_ADC.GPIO_Pin=1;
MyGPIO_Init(&Port_ADC);
break;
case 10:
Port_ADC.GPIO=GPIOC;
Port_ADC.GPIO_Conf=In_Analog;
Port_ADC.GPIO_Pin=0;
MyGPIO_Init(&Port_ADC);
break;
case 11:
Port_ADC.GPIO=GPIOC;
Port_ADC.GPIO_Conf=In_Analog;
Port_ADC.GPIO_Pin=1;
MyGPIO_Init(&Port_ADC);
break;
case 12:
Port_ADC.GPIO=GPIOC;
Port_ADC.GPIO_Conf=In_Analog;
Port_ADC.GPIO_Pin=2;
MyGPIO_Init(&Port_ADC);
break;
case 13:
Port_ADC.GPIO=GPIOC;
Port_ADC.GPIO_Conf=In_Analog;
Port_ADC.GPIO_Pin=3;
MyGPIO_Init(&Port_ADC);
break;
case 14:
Port_ADC.GPIO=GPIOC;
Port_ADC.GPIO_Conf=In_Analog;
Port_ADC.GPIO_Pin=4;
MyGPIO_Init(&Port_ADC);
break;
case 15:
Port_ADC.GPIO=GPIOC;
Port_ADC.GPIO_Conf=In_Analog;
Port_ADC.GPIO_Pin=5;
MyGPIO_Init(&Port_ADC);
break;
}
if(myADC->ADC==ADC1)
{
RCC->APB2ENR |= RCC_APB2ENR_ADC1EN; // validation horloge ADC1
RCC->CFGR |= RCC_CFGR_ADCPRE_DIV6; // passage de l'horloge ADC1 <20> 12MHz
ADC1->CR2|= ADC_CR2_ADON; // d<>marrage ADC1
ADC1->SQR1&= ADC_SQR1_L; // fixe le nombre de conversion <20> 1
ADC1->SQR3|= myADC->channel; // indique la voie <20> convertir
ADC1->CR2 |= ADC_CR2_CAL; // d<>but de la calibration
while ((ADC1->CR2 & ADC_CR2_CAL)); // attente de la fin de la calibration
}
else if(myADC->ADC==ADC2)
{
RCC->APB2ENR |= RCC_APB2ENR_ADC1EN; // validation horloge ADC1
RCC->CFGR |= RCC_CFGR_ADCPRE_DIV6; // passage de l'horloge ADC1 <20> 12MHz
ADC2->CR2|= ADC_CR2_ADON; // d<>marrage ADC1
ADC2->SQR1&= ADC_SQR1_L; // fixe le nombre de conversion <20> 1
ADC2->SQR3|= myADC->channel; // indique la voie <20> convertir
ADC2->CR2 |= ADC_CR2_CAL; // d<>but de la calibration
while ((ADC2->CR2 & ADC_CR2_CAL)); // attente de la fin de la calibration
}
}
void MyADC_start_conversion(ADC_TypeDef* ADC)
{
if(ADC==ADC1)
{
ADC1->CR2 |= ADC_CR2_ADON; // lancement de la conversion
}
else if(ADC==ADC2)
{
ADC2->CR2 |= ADC_CR2_ADON; // lancement de la conversion
}
}
void ADC1_2_IRQHandler(void)
{
if(ADC1->SR & ~ADC_SR_EOC)
{
ADC1->SR &= ~ADC_SR_EOC ;
if(adc1_ptr_func!=0)
{
(*adc1_ptr_func)();
}
}
else if(ADC2->SR & ~ADC_SR_EOC)
{
ADC2->SR &= ~ADC_SR_EOC ;
if(adc2_ptr_func!=0)
{
(*adc2_ptr_func)();
}
}
}
void MyADC_ActiveIT (ADC_TypeDef * ADC, char Prio, void (*IT_function)(void))
{
ADC->CR1 |= ADC_CR1_EOCIE;
if(ADC==ADC1)
{
adc1_ptr_func=IT_function;
}
else if(ADC==ADC2)
{
adc2_ptr_func=IT_function;
}
NVIC->ISER[0] |= 0x01<<ADC1_2_IRQn;
NVIC->IP[ADC1_2_IRQn] |= Prio << 4;
}
int MyADC_result(ADC_TypeDef* ADC)
{
if (ADC==ADC1)
{
return ADC1->DR & ~((0x0F) << 12); // retour de la conversion
}
else if(ADC==ADC2)
{
return ADC2->DR & ~((0x0F) << 12); // retour de la conversion
}
return 0;
}