#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) // On initialise et configure le port correspondant au channel choisi { 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 à 12MHz ADC1->CR2|= ADC_CR2_ADON; // démarrage ADC1 ADC1->SQR1&= ADC_SQR1_L; // fixe le nombre de conversion à 1 ADC1->SQR3|= myADC->channel; // indique la voie à 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_ADC2EN; // validation horloge ADC2 RCC->CFGR |= RCC_CFGR_ADCPRE_DIV6; // passage de l'horloge ADC1 à 12MHz ADC2->CR2|= ADC_CR2_ADON; // démarrage ADC2 ADC2->SQR1&= ADC_SQR1_L; // fixe le nombre de conversion à 1 ADC2->SQR3|= myADC->channel; // indique la voie à 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) // On vérifie si le flag levé est celui de l'ADC1 { ADC1->SR &= ~ADC_SR_EOC ; // On remet à 0 le drapeau if(adc1_ptr_func!=0) { (*adc1_ptr_func)(); } } else if(ADC2->SR & ~ADC_SR_EOC) // On vérifie si le flag levé est celui de l'ADC2 { ADC2->SR &= ~ADC_SR_EOC ; // On remet à 0 le drapeau 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; // On autorise l'interruption sur les ADC// On précise quelle interruption on souhaite activé// On précise la priorité qu'on souhaite lui donner if(ADC==ADC1) { adc1_ptr_func=IT_function; } else if(ADC==ADC2) { adc2_ptr_func=IT_function; } NVIC->ISER[0] |= 0x01<IP[ADC1_2_IRQn] |= Prio << 4; // On précise la priorité qu'on souhaite lui donner } 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; }