Projet-Voilier-3/driver/Driver_ADC.c
Sanchez Manon c930991ccb Ajout du Driver_IMU, pour la gestion de l'accéléromètre.
Les fichiers Driver_SPI sont des versions personnelles non fonctionelle de la gestion du SPI.
C'est la bibliothèque MySPI qui est utilisée dans le projet.

Ajout de commentaires dans tous les fichiers driver en format doxygen.
2023-04-05 16:39:01 +02:00

70 lines
1.9 KiB
C
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#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 daller 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;
}
/* Fonction de lancement*/
void driver_adc_1_launch_read (void)
{
//Lancement de la conversion
ADC1->CR2 |= ADC_CR2_SWSTART;
}
/*Lecture de la converstion*/
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)();
}