#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)(); }