115 lines
4.2 KiB
C
115 lines
4.2 KiB
C
/**
|
||
* Bibliotheque GASSP 2013-02-15
|
||
*
|
||
* GPIO - ADC - Sequenceur - System Timer - PWM - 72 MHz
|
||
*
|
||
*/
|
||
|
||
// STM32F10X_CL : pour le STM32F107 "Communication Line"
|
||
// STM32F10X_MD : pour le STM32F103 "Medium Density"
|
||
|
||
//#define STM32F10X_MD // 2019 fix for Keil 5.23
|
||
|
||
#include "stm32f10x.h"
|
||
|
||
// horloge systeme (config statique a 72 MHz pour le STM32F103) ------------
|
||
void CLOCK_Configure(void);
|
||
|
||
// Timers 1, 2, 3, 4 -------------------------------------------------------
|
||
// la duree entre deux debordements successifs doit etre donnnee en periodes
|
||
// d'horloge CPU (typiquement 72 MHz)
|
||
void Timer_1234_Init_ff( TIM_TypeDef *Timer, u32 Duree_ticks );
|
||
|
||
// activation d'une fonction de traitement de l'interruption timer (callback)
|
||
void Active_IT_Debordement_Timer( TIM_TypeDef *Timer, char Prio, void (*IT_function)(void) );
|
||
|
||
// bloque le timer
|
||
#define Bloque_Timer(Timer) Timer->CR1=(Timer->CR1)&~(1<<0)
|
||
|
||
// Lance timer
|
||
#define Run_Timer(Timer) Timer->CR1=(Timer->CR1)|(1<<0)
|
||
|
||
// PWM (basee sur un des Timers 1, 2, 3, 4 ---------------------------------
|
||
// la periode doit etre donnee en periodes d'horloge CPU (typiquement 72 MHz)
|
||
// la fonction rend la pleine echelle ou resolution, c'est a dire la plage
|
||
// de valeurs acceptees pour moduler la largeur d'impulsion
|
||
vu16 PWM_Init_ff( TIM_TypeDef *Timer, char Voie, u32 Periode_ticks );
|
||
|
||
// Timer systeme "SysTick" -------------------------------------------------
|
||
|
||
// la periode doit etre donnee en periodes d'horloge CPU (typiquement 72 MHz)
|
||
void Systick_Period_ff( unsigned int Periode_ticks );
|
||
|
||
// activation d'une fonction de traitement de l'interruption timer (callback)
|
||
void Systick_Prio_IT( char Prio, void (*Systick_function)(void) );
|
||
|
||
#define SysTick_On ((SysTick->CTRL)=(SysTick->CTRL)|1<<0)
|
||
#define SysTick_Off ((SysTick->CTRL)=(SysTick->CTRL)& ~(1<<0))
|
||
#define SysTick_Enable_IT ((SysTick->CTRL)=(SysTick->CTRL)|1<<1)
|
||
#define SysTick_Disable_IT ((SysTick->CTRL)=(SysTick->CTRL)& ~(1<<1))
|
||
|
||
// ADC - DMA ---------------------------------------------------------------
|
||
// Analog-to-Digital Conversion, Direct Memory Access
|
||
|
||
// la duree d'echantillonnage doit etre donnee en periodes d'horloge CPU (typiquement 72 MHz)
|
||
// la fonction rend la duree totale de conversion (meme unites)
|
||
u32 Init_TimingADC_ActiveADC_ff( ADC_TypeDef * ADC, u32 Duree_Ech_ticks );
|
||
|
||
// choix d'un canal ADC unique
|
||
void Single_Channel_ADC( ADC_TypeDef * ADC, char Voie_ADC );
|
||
|
||
// la periode de repetition des acquisitions doit etre donnee en periodes d'horloge CPU
|
||
// Les sources de d<>clenchement possibles :
|
||
#define TIM1_CC1 0
|
||
#define TIM1_CC2 1
|
||
#define TIM1_CC3 2
|
||
#define TIM2_CC2 3
|
||
#define TIM4_CC4 5
|
||
void Init_Conversion_On_Trig_Timer_ff( ADC_TypeDef * ADC, char Source, u32 Periode_ticks );
|
||
|
||
// initialisation d'acquisition en mode DMA
|
||
// Ptr_Table_DMA doit pointer sur un espace memoire suffisant pour le nombre d'ech. demande
|
||
void Init_ADC1_DMA1( char Circ, vu16 *Ptr_Table_DMA );
|
||
|
||
|
||
// Lance une DMA sur le nombre de points sp<73>cifie. Les resultats seront stockes
|
||
// dans la zone de RAM <20>crite est indiqu<71>e lors de l'appel de la fonction Init_ADC1_DMA1
|
||
void Start_DMA1( u16 NbEchDMA );
|
||
|
||
// arret DMA
|
||
#define Stop_DMA1 DMA1_Channel1->CCR =(DMA1_Channel1->CCR) &~0x1;
|
||
|
||
// fonction d'attente (bloquante)
|
||
// la duree depend de la periode d'acquisition et du nombre d'echantillons
|
||
void Wait_On_End_Of_DMA1(void);
|
||
|
||
|
||
// GPIO --------------------------------------------------------------------
|
||
|
||
// Sens
|
||
#define INPUT 'i'
|
||
#define OUTPUT 'o'
|
||
|
||
// Techno pour pin en entr<74>e (INPUT)
|
||
#define ANALOG 0
|
||
#define INPUT_FLOATING 1
|
||
#define INPUT_PULL_DOWN_UP 2
|
||
|
||
// Techno pour pin en sortie (OUTPUT)
|
||
#define OUTPUT_PPULL 0
|
||
#define OUTPUT_OPDRAIN 1
|
||
#define ALT_PPULL 2
|
||
#define ALT_OPDRAIN 3
|
||
|
||
// La fonction initialise n'importe quelle broche de port (entr<74>e, sortie, techno....)
|
||
// Exemple :
|
||
// Port_IO_Init(GPIOB, 8, OUTPUT, OUTPUT_PPULL);
|
||
// Place le bit 8 du port B en sortie Push-pull
|
||
// Renvoie 0 si tout est OK, et 1 s'il y a un probl<62>me (plage d'entr<74>e non respect<63>e)
|
||
char GPIO_Configure(GPIO_TypeDef * Port, int Broche, int Sens, int Techno);
|
||
|
||
// Sp<53>cifier le num<75>ro de broche (0 <20> 15)
|
||
// exemple : Port_IO_Set(GPIOB,8);
|
||
#define GPIO_Set(GPIO,Broche) GPIO->BSRR=(0x01<<Broche)
|
||
|
||
#define GPIO_Clear(GPIO,Broche) GPIO->BRR=(0x01<<Broche)
|