Projet-Voilier-3/driver/Driver_ADC.c

67 lignes
1,8 Kio
C

#include "stm32f10x.h"
#include "stdio.h"
#include "Driver_ADC.h"
void erreur (void)
{
while(1);
}
void (*ADC1_2_fx) (void) = &erreur;
/**
*************************************************************************************************
* @brief Activation et configuration de l'ADC1.
* @param -> Priorité de l'intérruption.
* @Note -> Fonction à lancer systématiquement avant d’aller plus en détail dans les conf plus fines (PWM, codeur inc...)
*************************************************************************************************
*/
void driver_adc_1_init (char Prio, void (*IT_function)(void))
{
//On règle la fréquence à 12Mhz
RCC->CFGR |= RCC_CFGR_ADCPRE_DIV6;
//Validation de l'horloge ACD1
RCC->APB2ENR |= RCC_APB2ENR_ADC1EN;
//Activation de l'external trig
ADC1->CR2 |= ADC_CR2_EXTTRIG;
//Activation SWSTART
ADC1->CR2 |= ADC_CR2_EXTSEL;
//Validation de l'horloge ACD1
RCC->APB2ENR |= RCC_APB2ENR_ADC1EN;
//Activation de l'ADC1
ADC1->CR2 |= ADC_CR2_ADON;
//Fixe le nb de conversion, ici 1
ADC1->SQR1 &= ADC_SQR1_L;
//Numéro de voie à convertir
ADC1->SQR3 |= 1;
//Lancement de la calibration
ADC1->CR2 |= ADC_CR2_CAL;
//Attente de la fin de la calibration
while((ADC1->CR2 & ADC_CR2_CAL));
//Activation de l'intéruption sur le flag EOC
ADC1->CR1 |= ADC_CR1_EOCIE;
//Activation de l'intéruption et configuration du niveau de priorité
NVIC_EnableIRQ(ADC1_2_IRQn);
NVIC_SetPriority(ADC1_2_IRQn, Prio);
//Fonction à appeler à l'intéruption
ADC1_2_fx = IT_function;
}
void driver_adc_1_launch_read (void)
{
//Lancement de la conversion
ADC1->CR2 |= ADC_CR2_SWSTART;
}
uint16_t driver_adc_1_read (void)
{
//Retour de la conversion
return ADC1->DR &~ ((0x0F) << 12);
}
void ADC1_2_IRQHandler(void)
{
//On abaisse le flag pour la prochaine lecture
ADC1->SR &= ~ADC_SR_EOC;
//On lance la fonction de l'utilisateur
(*ADC1_2_fx)();
}