Code source pour le BE-CHTI de l'année 2020-2021
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

DriverJeuLaser.h 10KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345
  1. /**
  2. * Bibliotheque DriverJeuLaser (ancienne gassp72 adaptée 2021 - TR)
  3. *
  4. * GPIO - ADC - Sequenceur - System Timer - PWM - 72 MHz
  5. * Modifs :
  6. * enlèvement de tout ce qui est inutile dans le .h
  7. * ajout de fonctions GPIO dans le .c pour utilisation en ASM ou en C :
  8. * - GPIOA_Set(char Broche), GPIOB_Set(char Broche), GPIOC_Set(char Broche)
  9. * - GPIOA_Clear(char Broche), GPIOB_Clear(char Broche), GPIOC_Clear(char Broche)
  10. *
  11. * ajout d'une fonction qui impose une valeur de PWM (TIM3_CCR3)
  12. * PWM_Set_Value_On_TIM3_C3( int Val)
  13. * permet en ASM ou en C de fixer la valeur de PWM
  14. * Ajout de commentaires
  15. */
  16. #ifndef DRIVERJEULASER_H__
  17. #define DRIVERJEULASER_H__
  18. #include "stm32f10x.h"
  19. //**********************************************************************************************************
  20. //--------------------- CONFIGURATION CLOCK DU STM32 --------------------------------------
  21. //**********************************************************************************************************
  22. /**
  23. * @brief Configure l'ensemble des horloges du uC
  24. * @note horloge systeme (config statique a 72 MHz pour le STM32F103)
  25. * @param None
  26. * @retval None
  27. */
  28. void CLOCK_Configure(void);
  29. //**********************************************************************************************************
  30. //--------------------- LES TIMERS GENERAL PURPOSE TIM1 à TIM 4 ------------------------------
  31. //**********************************************************************************************************
  32. /**
  33. * @brief Configure un Timer TIM1 à TIM4 avec une périodicité donnée
  34. * @note L' horloge des 4 timers a une fréquence de 72MHz
  35. * @param *Timer = TIM1 ou TIM2 ou TIM3 ou TIM4
  36. * @param Durée_ticks : nombre de pas (tick) comptés à 72 MHz pour faire déborder le timer
  37. * La période de débordement du Timer est donc T = Durée_ticks * Tck, avec Tck = 1/72 000 000
  38. * @retval None
  39. */
  40. void Timer_1234_Init_ff( TIM_TypeDef *Timer, u32 Duree_ticks );
  41. /**
  42. * Macros de base pour utiliser les timers
  43. */
  44. // bloque le timer
  45. #define Bloque_Timer(Timer) Timer->CR1=(Timer->CR1)&~(1<<0)
  46. // Lance timer
  47. #define Run_Timer(Timer) Timer->CR1=(Timer->CR1)|(1<<0)
  48. /**
  49. * @brief Associe une fonction d'interruption (callback) lors du débordement d'un timer
  50. * @note
  51. * @param *Timer = TIM1 ou TIM2 ou TIM3 ou TIM4
  52. * @param Prio : niveau de priorité de l'interruption (0 -> priorité max, 15 -> priorité min)
  53. * @param IT_function : le nom de la fonction Callback à appeler lors de l'interruption
  54. * @retval None
  55. */
  56. void Active_IT_Debordement_Timer( TIM_TypeDef *Timer, char Prio, void (*IT_function)(void) );
  57. //*********************************************************************************************************
  58. //--------------------- PWM TIM1 to TIM 4 ------------------------------
  59. //*********************************************************************************************************
  60. /**
  61. * @brief Configure un timer en PWM
  62. * @note
  63. * @param *Timer = TIM1 ou TIM2 ou TIM3 ou TIM4
  64. * @param voie : un des 4 canaux possibles 1 à 4.
  65. * @param Periode_ticks : nombre de pas (tick) comptés à 72 MHz pour faire déborder le timer
  66. * La période de débordement du Timer est donc T = Durée_ticks * Tck, avec Tck = 1/72 000 000
  67. * @retval Retourne la période en tick (normalement la même que le param d'entrée sauf si PSC utilisé
  68. */
  69. unsigned short int PWM_Init_ff( TIM_TypeDef *Timer, char Voie, u32 Periode_ticks );
  70. /**
  71. * @brief Fixe une valeur de PWM, Val, en tick horloge. La rapport cyclique effectif
  72. * est donc : rcy = Thaut_ticks / Periode_ticks
  73. * @note spécifique Jeu Laser, PWM liée exclusivement au TIM3, chan3
  74. * @param Thaut_ticks : durée de l'état haut d'une impulsion en Ticks
  75. * @retval None
  76. */
  77. void PWM_Set_Value_TIM3_Ch3( unsigned short int Thaut_ticks);
  78. //**********************************************************************************************************
  79. //--------------------- LE SYSTICK TIMER, Part of Cortex M3 ------------------------------
  80. //**********************************************************************************************************
  81. /**
  82. * @brief Configure le timer Systick avec une périodicité donnée
  83. * @note Ce timer ne peut servir qu'à créer des temporisations ou générer des interruption
  84. * ce n'est pas à proprement parler un périphérique, il fait partie du Cortex M3
  85. * Ce timer est un 24 bits
  86. * @param Periode_ticks : nombre de pas (tick) comptés à 72 MHz pour établir la périodicité
  87. * La période de débordement du Timer est donc T = Durée_ticks * Tck, avec Tck = 1/72 000 000
  88. * @retval None
  89. */
  90. void Systick_Period_ff( unsigned int Periode_ticks );
  91. /**
  92. * @brief Associe une fonction d'interruption (callback) lors du débordement du Systick
  93. * @note
  94. * @param Prio : niveau de priorité de l'interruption (0 -> priorité max, 15 -> priorité min)
  95. * @param IT_function : le nom de la fonction Callback à appeler lors de l'interruption
  96. * @retval None
  97. */
  98. void Systick_Prio_IT( char Prio, void (*Systick_function)(void) );
  99. /**
  100. * Macros de base pour utiliser le Systick
  101. */
  102. #define SysTick_On ((SysTick->CTRL)=(SysTick->CTRL)|1<<0)
  103. #define SysTick_Off ((SysTick->CTRL)=(SysTick->CTRL)& ~(1<<0))
  104. #define SysTick_Enable_IT ((SysTick->CTRL)=(SysTick->CTRL)|1<<1)
  105. #define SysTick_Disable_IT ((SysTick->CTRL)=(SysTick->CTRL)& ~(1<<1))
  106. //**********************************************************************************************************
  107. //--------------------- LE SYSTICK TIMER, Part of Cortex M3 ------------------------------
  108. //**********************************************************************************************************
  109. /**
  110. * @brief Active l'ADC du STM32, configure la durée de prélèvement de l'échantillon (temps
  111. * de fermeture du switch d'acquisition
  112. * @note
  113. * @param ADC : précise de quel ADC il s'agit, ADC1 ou ADC2
  114. * @param Duree_Ech_ticks : dirée de fermeture du switch d'échantillonnage en Tick d'horloge CPU
  115. * exemple pour 1µs on choisira 72.
  116. * @retval Nombre de Tick réellement pris en compte
  117. */
  118. unsigned int Init_TimingADC_ActiveADC_ff( ADC_TypeDef * ADC, u32 Duree_Ech_ticks );
  119. /**
  120. * @brief Sélectionne la voie à convertir
  121. * @note Attention, la voie va de 0 à 15 et n'est pas directement lié au n°de GPIO
  122. * @param ADC : précise de quel ADC il s'agit, ADC1 ou ADC2
  123. * @param Voie_ADC : 1 à 15
  124. * @retval None
  125. */
  126. void Single_Channel_ADC( ADC_TypeDef * ADC, char Voie_ADC );
  127. /**
  128. * @brief Permet lier le déclenchement au débordement d'un timer, spécifie également
  129. * la période de débordement du timer
  130. * @note pas besoin de régler le timer avec une autre fonction dédiée timer
  131. * @param ADC : précise de quel ADC il s'agit, ADC1 ou ADC2
  132. * @param Source : indique le timer qui déclenche l'ADC choix dans les define ci-dessous
  133. * @param Periode_ticks : nombre de pas (tick) comptés à 72 MHz pour faire déborder le timer
  134. * La période de débordement du Timer est donc T = Durée_ticks * Tck, avec Tck = 1/72 000 000
  135. * @retval None
  136. */
  137. // param pour Source :
  138. #define TIM1_CC1 0
  139. #define TIM1_CC2 1
  140. #define TIM1_CC3 2
  141. #define TIM2_CC2 3
  142. #define TIM4_CC4 5
  143. void Init_Conversion_On_Trig_Timer_ff( ADC_TypeDef * ADC, char Source, u32 Periode_ticks );
  144. //**********************************************************************************************************
  145. //--------------------- ANALOG INPUT ADC & DMA ------------------------------
  146. //**********************************************************************************************************
  147. /**
  148. * @brief Permer de lier l'ADC à un tableau en RAM pour une DMA
  149. * @note
  150. * @param Circ : circular. Si '0', en fin de DMA le ptr d'@ reste inchangé
  151. * si '1' le ptr d'@ se recale à celle du début.
  152. * @param Ptr_Table_DMA : contient l'@ de début de zone RAM à écrire
  153. * @retval None
  154. */
  155. void Init_ADC1_DMA1(char Circ, short int *Ptr_Table_DMA);
  156. /**
  157. * @brief Lance une DMA sur le nombre de points spécifie. Les resultats seront stockes
  158. * dans la zone de RAM écrite est indiquée lors de l'appel de la fonction Init_ADC1_DMA1
  159. * @note
  160. * @param NbEchDMA est le nombre d'échantillons à stocker.
  161. * @retval None
  162. */
  163. void Start_DMA1( u16 NbEchDMA );
  164. // arret DMA
  165. #define Stop_DMA1 DMA1_Channel1->CCR =(DMA1_Channel1->CCR) &~0x1;
  166. /**
  167. * @brief Attend la fin d'un cycle de DMA. la duree depend de la periode d'acquisition
  168. * et du nombre d'echantillons
  169. * @note fonction d'attente (bloquante)
  170. * @param None
  171. * @retval None
  172. */
  173. void Wait_On_End_Of_DMA1(void);
  174. //**********************************************************************************************************
  175. //--------------------- GPIO ------------------------------
  176. //**********************************************************************************************************
  177. /**
  178. * @brief Initialisation d'un GPIO (A à C), pin x.
  179. * peut être configuré :
  180. * -> Input ou output
  181. * -> architecture technologique (push-pull, open drain...)
  182. * @note
  183. * @param Port : GPIOA, GPIOB, GPIOC
  184. * @param Broche : 0 à 15
  185. * @param Sens : INPUT ou OUTPUT
  186. * @param Techno : voir define ci dessous
  187. * @retval 1 erreur, 0 si OK
  188. */
  189. // Sens
  190. #define INPUT 'i'
  191. #define OUTPUT 'o'
  192. // Techno pour pin en entrée (INPUT)
  193. #define ANALOG 0
  194. #define INPUT_FLOATING 1
  195. #define INPUT_PULL_DOWN_UP 2
  196. // Techno pour pin en sortie (OUTPUT)
  197. #define OUTPUT_PPULL 0
  198. #define OUTPUT_OPDRAIN 1
  199. #define ALT_PPULL 2
  200. #define ALT_OPDRAIN 3
  201. // Exemple :
  202. // Port_IO_Init(GPIOB, 8, OUTPUT, OUTPUT_PPULL);
  203. // Place le bit 8 du port B en sortie Push-pull
  204. char GPIO_Configure(GPIO_TypeDef * Port, int Broche, int Sens, int Techno);
  205. /**
  206. * @brief Mise à 1 d'une broche GPIO
  207. * @note Une fonction par GPIO
  208. * @param Broche : 0 à 15
  209. * @retval None
  210. */
  211. void GPIOA_Set(char Broche);
  212. void GPIOB_Set(char Broche);
  213. void GPIOC_Set(char Broche);
  214. /**
  215. * @brief Mise à 0 d'une broche GPIO
  216. * @note Une fonction par GPIO
  217. * @param Broche : 0 à 15
  218. * @retval None
  219. */
  220. void GPIOA_Clear(char Broche);
  221. void GPIOB_Clear(char Broche);
  222. void GPIOC_Clear(char Broche);
  223. #endif