191 lines
No EOL
4.1 KiB
C
191 lines
No EOL
4.1 KiB
C
#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;
|
||
} |