67 lines
1.8 KiB
C
67 lines
1.8 KiB
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)();
|
||
}
|