From 97a2ec082e96b5c83dc101b50eb937d63029ea97 Mon Sep 17 00:00:00 2001 From: Jules-Ian Barnavon Date: Thu, 16 Mar 2023 12:12:51 +0100 Subject: [PATCH] fin tP1 --- PjtKEIL_StepDeb_1.zip | Bin 0 -> 27864 bytes PjtKEIL_StepDeb_1/BacASable.uvprojx | 1347 ++++++++++++++++++ PjtKEIL_StepDeb_1/Driver/DriverJeuLaser.h | 345 +++++ PjtKEIL_StepDeb_1/Driver/DriverJeuLaser.inc | 56 + PjtKEIL_StepDeb_1/Src/Delay.s | 62 + PjtKEIL_StepDeb_1/Src/principal.c | 32 + PjtKEIL_StepDeb_1/Src/startup-rvds.s | 335 +++++ PjtKEIL_StepDeb_2.zip | Bin 0 -> 27663 bytes PjtKEIL_StepDeb_2/BacASable.uvprojx | 1352 +++++++++++++++++++ PjtKEIL_StepDeb_2/Driver/DriverJeuLaser.h | 345 +++++ PjtKEIL_StepDeb_2/Driver/DriverJeuLaser.inc | 56 + PjtKEIL_StepDeb_2/Src/Cligno.s | 30 + PjtKEIL_StepDeb_2/Src/principal.c | 61 + PjtKEIL_StepDeb_2/Src/startup-rvds.s | 335 +++++ 14 files changed, 4356 insertions(+) create mode 100644 PjtKEIL_StepDeb_1.zip create mode 100644 PjtKEIL_StepDeb_1/BacASable.uvprojx create mode 100644 PjtKEIL_StepDeb_1/Driver/DriverJeuLaser.h create mode 100644 PjtKEIL_StepDeb_1/Driver/DriverJeuLaser.inc create mode 100644 PjtKEIL_StepDeb_1/Src/Delay.s create mode 100644 PjtKEIL_StepDeb_1/Src/principal.c create mode 100644 PjtKEIL_StepDeb_1/Src/startup-rvds.s create mode 100644 PjtKEIL_StepDeb_2.zip create mode 100644 PjtKEIL_StepDeb_2/BacASable.uvprojx create mode 100644 PjtKEIL_StepDeb_2/Driver/DriverJeuLaser.h create mode 100644 PjtKEIL_StepDeb_2/Driver/DriverJeuLaser.inc create mode 100644 PjtKEIL_StepDeb_2/Src/Cligno.s create mode 100644 PjtKEIL_StepDeb_2/Src/principal.c create mode 100644 PjtKEIL_StepDeb_2/Src/startup-rvds.s diff --git a/PjtKEIL_StepDeb_1.zip b/PjtKEIL_StepDeb_1.zip new file mode 100644 index 0000000000000000000000000000000000000000..a45cd29e9f5ace1321cd22c6816dfe85cfe0c682 GIT binary patch literal 27864 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 gt@`6T + + + 2.1 + +
### uVision Project, (C) Keil Software
+ + + + Simu + 0x4 + ARM-ADS + 5060960::V5.06 update 7 (build 960)::.\ARMCC + 0 + + + STM32F103RB + STMicroelectronics + Keil.STM32F1xx_DFP.2.3.0 + http://www.keil.com/pack/ + IRAM(0x20000000-0x20004FFF) IROM(0x8000000-0x801FFFF) CLOCK(8000000) CPUTYPE("Cortex-M3") + + + + + + + + + + + + + + + $$Device:STM32F103RB$SVD\STM32F103xx.svd + 0 + 0 + + + + + + + 0 + 0 + 0 + 0 + 1 + + .\Obj\ + BacASable + 1 + 0 + 1 + 1 + 1 + + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 0 + 0 + + + 0 + 0 + 0 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 0 + + + SARMCM3.DLL + -REMAP + DARMSTM.DLL + -pSTM32F103RB + SARMCM3.DLL + + TCM.DLL + -pCM3 + + + + 1 + 0 + 0 + 0 + 16 + + + + + 1 + 0 + 0 + 1 + 1 + 4100 + + 1 + STLink\ST-LINKIII-KEIL_SWO.dll + "" () + + + + + 0 + + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 1 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + "Cortex-M3" + + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 8 + 1 + 0 + 0 + 0 + 3 + 3 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x5000 + + + 1 + 0x8000000 + 0x20000 + + + 0 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x8000000 + 0x20000 + + + 1 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x5000 + + + 0 + 0x0 + 0x0 + + + + + + 1 + 1 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 2 + 0 + 0 + 0 + 0 + 0 + 1 + 1 + 1 + 1 + 0 + 0 + 0 + + --C99 + STM32F103xB,USE_FULL_LL_DRIVER + + .\Driver + + + + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 4 + + + + + + + + + 1 + 0 + 0 + 0 + 1 + 0 + 0x08000000 + 0x20000000 + + + + + + + + + + + + + Sources + + + principal.c + 1 + .\Src\principal.c + + + Delay.s + 2 + .\Src\Delay.s + + + + + Sys + + + startup-rvds.s + 2 + .\Src\startup-rvds.s + + + + + Driver + + + DriverJeuLaser.lib + 4 + .\Driver\DriverJeuLaser.lib + + + + + ::CMSIS + + + + + CibleSondeKEIL + 0x4 + ARM-ADS + 5060960::V5.06 update 7 (build 960)::.\ARMCC + 0 + + + STM32F103RB + STMicroelectronics + Keil.STM32F1xx_DFP.2.3.0 + http://www.keil.com/pack/ + IRAM(0x20000000-0x20004FFF) IROM(0x8000000-0x801FFFF) CLOCK(8000000) CPUTYPE("Cortex-M3") + + + + + + + + + + + + + + + $$Device:STM32F103RB$SVD\STM32F103xx.svd + 0 + 0 + + + + + + + 0 + 0 + 0 + 0 + 1 + + .\Obj\ + BacASable + 1 + 0 + 1 + 1 + 1 + + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 0 + 0 + + + 0 + 0 + 0 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 0 + + + SARMCM3.DLL + -REMAP + DARMSTM.DLL + -pSTM32F103RB + SARMCM3.DLL + + TCM.DLL + -pCM3 + + + + 1 + 0 + 0 + 0 + 16 + + + + + 1 + 0 + 0 + 1 + 1 + 4100 + + 1 + STLink\ST-LINKIII-KEIL_SWO.dll + "" () + + + + + 0 + + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 1 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + "Cortex-M3" + + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 8 + 1 + 0 + 0 + 0 + 3 + 3 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x5000 + + + 1 + 0x8000000 + 0x20000 + + + 0 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x8000000 + 0x20000 + + + 1 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x5000 + + + 0 + 0x0 + 0x0 + + + + + + 1 + 1 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 2 + 0 + 0 + 0 + 0 + 0 + 1 + 1 + 1 + 1 + 0 + 0 + 0 + + --C99 + STM32F103xB,USE_FULL_LL_DRIVER + + .\Driver + + + + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 4 + + + + + + + + + 1 + 0 + 0 + 0 + 1 + 0 + 0x08000000 + 0x20000000 + + + + + + + + + + + + + Sources + + + principal.c + 1 + .\Src\principal.c + + + Delay.s + 2 + .\Src\Delay.s + + + + + Sys + + + startup-rvds.s + 2 + .\Src\startup-rvds.s + + + + + Driver + + + DriverJeuLaser.lib + 4 + .\Driver\DriverJeuLaser.lib + + + + + ::CMSIS + + + 0 + 0 + 0 + 0 + 0 + 1 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + + + + + + + + + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + + + + + + + + + + + + + + CibleSondeST + 0x4 + ARM-ADS + 5060960::V5.06 update 7 (build 960)::.\ARMCC + 0 + + + STM32F103RB + STMicroelectronics + Keil.STM32F1xx_DFP.2.3.0 + http://www.keil.com/pack/ + IRAM(0x20000000-0x20004FFF) IROM(0x8000000-0x801FFFF) CLOCK(8000000) CPUTYPE("Cortex-M3") + + + + + + + + + + + + + + + $$Device:STM32F103RB$SVD\STM32F103xx.svd + 0 + 0 + + + + + + + 0 + 0 + 0 + 0 + 1 + + .\Obj\ + BacASable + 1 + 0 + 1 + 1 + 1 + + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 0 + 0 + + + 0 + 0 + 0 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 0 + + + SARMCM3.DLL + -REMAP + DARMSTM.DLL + -pSTM32F103RB + SARMCM3.DLL + + TCM.DLL + -pCM3 + + + + 1 + 0 + 0 + 0 + 16 + + + + + 1 + 0 + 0 + 1 + 1 + 4100 + + 1 + STLink\ST-LINKIII-KEIL_SWO.dll + "" () + + + + + 0 + + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 1 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + "Cortex-M3" + + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 8 + 1 + 0 + 0 + 0 + 3 + 3 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x5000 + + + 1 + 0x8000000 + 0x20000 + + + 0 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x8000000 + 0x20000 + + + 1 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x5000 + + + 0 + 0x0 + 0x0 + + + + + + 1 + 1 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 2 + 0 + 0 + 0 + 0 + 0 + 1 + 1 + 1 + 1 + 0 + 0 + 0 + + --C99 + STM32F103xB,USE_FULL_LL_DRIVER + + .\Driver + + + + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 4 + + + + + + + + + 1 + 0 + 0 + 0 + 1 + 0 + 0x08000000 + 0x20000000 + + + + + + + + + + + + + Sources + + + principal.c + 1 + .\Src\principal.c + + + Delay.s + 2 + .\Src\Delay.s + + + + + Sys + + + startup-rvds.s + 2 + .\Src\startup-rvds.s + + + + + Driver + + + DriverJeuLaser.lib + 4 + .\Driver\DriverJeuLaser.lib + + + + + ::CMSIS + + + + + + + + + + + + + + + + + + + + + + + + <Project Info> + 0 + 1 + + + + +
diff --git a/PjtKEIL_StepDeb_1/Driver/DriverJeuLaser.h b/PjtKEIL_StepDeb_1/Driver/DriverJeuLaser.h new file mode 100644 index 0000000..bc9b3bd --- /dev/null +++ b/PjtKEIL_StepDeb_1/Driver/DriverJeuLaser.h @@ -0,0 +1,345 @@ +/** + * Bibliotheque DriverJeuLaser (ancienne gassp72 adaptée 2021 - TR) + * + * GPIO - ADC - Sequenceur - System Timer - PWM - 72 MHz + * Modifs : + * enlèvement de tout ce qui est inutile dans le .h + * ajout de fonctions GPIO dans le .c pour utilisation en ASM ou en C : + * - GPIOA_Set(char Broche), GPIOB_Set(char Broche), GPIOC_Set(char Broche) + * - GPIOA_Clear(char Broche), GPIOB_Clear(char Broche), GPIOC_Clear(char Broche) + * + * ajout d'une fonction qui impose une valeur de PWM (TIM3_CCR3) + * PWM_Set_Value_On_TIM3_C3( int Val) + * permet en ASM ou en C de fixer la valeur de PWM + + * Ajout de commentaires + + */ +#ifndef DRIVERJEULASER_H__ +#define DRIVERJEULASER_H__ + +#include "stm32f10x.h" + +//********************************************************************************************************** +//--------------------- CONFIGURATION CLOCK DU STM32 -------------------------------------- +//********************************************************************************************************** + +/** + * @brief Configure l'ensemble des horloges du uC + * @note horloge systeme (config statique a 72 MHz pour le STM32F103) + * @param None + * @retval None + */ +void CLOCK_Configure(void); + + + + + + + + + + +//********************************************************************************************************** +//--------------------- LES TIMERS GENERAL PURPOSE TIM1 à TIM 4 ------------------------------ +//********************************************************************************************************** + +/** + * @brief Configure un Timer TIM1 à TIM4 avec une périodicité donnée + * @note L' horloge des 4 timers a une fréquence de 72MHz + * @param *Timer = TIM1 ou TIM2 ou TIM3 ou TIM4 + * @param Durée_ticks : nombre de pas (tick) comptés à 72 MHz pour faire déborder le timer + * La période de débordement du Timer est donc T = Durée_ticks * Tck, avec Tck = 1/72 000 000 + * @retval None + */ +void Timer_1234_Init_ff( TIM_TypeDef *Timer, u32 Duree_ticks ); + +/** + * Macros de base pour utiliser les timers + */ + // 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) + + + +/** + * @brief Associe une fonction d'interruption (callback) lors du débordement d'un timer + * @note + * @param *Timer = TIM1 ou TIM2 ou TIM3 ou TIM4 + * @param Prio : niveau de priorité de l'interruption (0 -> priorité max, 15 -> priorité min) + * @param IT_function : le nom de la fonction Callback à appeler lors de l'interruption + * @retval None + */ +void Active_IT_Debordement_Timer( TIM_TypeDef *Timer, char Prio, void (*IT_function)(void) ); + + + + + + + + + + + +//********************************************************************************************************* +//--------------------- PWM TIM1 to TIM 4 ------------------------------ +//********************************************************************************************************* + +/** + * @brief Configure un timer en PWM + * @note + * @param *Timer = TIM1 ou TIM2 ou TIM3 ou TIM4 + * @param voie : un des 4 canaux possibles 1 à 4. + * @param Periode_ticks : nombre de pas (tick) comptés à 72 MHz pour faire déborder le timer + * La période de débordement du Timer est donc T = Durée_ticks * Tck, avec Tck = 1/72 000 000 + * @retval Retourne la période en tick (normalement la même que le param d'entrée sauf si PSC utilisé + */ +unsigned short int PWM_Init_ff( TIM_TypeDef *Timer, char Voie, u32 Periode_ticks ); + + + +/** + * @brief Fixe une valeur de PWM, Val, en tick horloge. La rapport cyclique effectif + * est donc : rcy = Thaut_ticks / Periode_ticks + * @note spécifique Jeu Laser, PWM liée exclusivement au TIM3, chan3 + * @param Thaut_ticks : durée de l'état haut d'une impulsion en Ticks + * @retval None + */ +void PWM_Set_Value_TIM3_Ch3( unsigned short int Thaut_ticks); + + + + + + + + + +//********************************************************************************************************** +//--------------------- LE SYSTICK TIMER, Part of Cortex M3 ------------------------------ +//********************************************************************************************************** + +/** + * @brief Configure le timer Systick avec une périodicité donnée + * @note Ce timer ne peut servir qu'à créer des temporisations ou générer des interruption + * ce n'est pas à proprement parler un périphérique, il fait partie du Cortex M3 + * Ce timer est un 24 bits + * @param Periode_ticks : nombre de pas (tick) comptés à 72 MHz pour établir la périodicité + * La période de débordement du Timer est donc T = Durée_ticks * Tck, avec Tck = 1/72 000 000 + * @retval None + */ +void Systick_Period_ff( unsigned int Periode_ticks ); + + + +/** + * @brief Associe une fonction d'interruption (callback) lors du débordement du Systick + * @note + * @param Prio : niveau de priorité de l'interruption (0 -> priorité max, 15 -> priorité min) + * @param IT_function : le nom de la fonction Callback à appeler lors de l'interruption + * @retval None + */ +void Systick_Prio_IT( char Prio, void (*Systick_function)(void) ); + + +/** + * Macros de base pour utiliser le Systick + */ +#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)) + + + + + + + + + + + + + + +//********************************************************************************************************** +//--------------------- LE SYSTICK TIMER, Part of Cortex M3 ------------------------------ +//********************************************************************************************************** + +/** + * @brief Active l'ADC du STM32, configure la durée de prélèvement de l'échantillon (temps + * de fermeture du switch d'acquisition + * @note + * @param ADC : précise de quel ADC il s'agit, ADC1 ou ADC2 + * @param Duree_Ech_ticks : dirée de fermeture du switch d'échantillonnage en Tick d'horloge CPU + * exemple pour 1µs on choisira 72. + * @retval Nombre de Tick réellement pris en compte + */ +unsigned int Init_TimingADC_ActiveADC_ff( ADC_TypeDef * ADC, u32 Duree_Ech_ticks ); + + +/** + * @brief Sélectionne la voie à convertir + * @note Attention, la voie va de 0 à 15 et n'est pas directement lié au n°de GPIO + * @param ADC : précise de quel ADC il s'agit, ADC1 ou ADC2 + * @param Voie_ADC : 1 à 15 + * @retval None + */ +void Single_Channel_ADC( ADC_TypeDef * ADC, char Voie_ADC ); + + + + + +/** + * @brief Permet lier le déclenchement au débordement d'un timer, spécifie également + * la période de débordement du timer + * @note pas besoin de régler le timer avec une autre fonction dédiée timer + * @param ADC : précise de quel ADC il s'agit, ADC1 ou ADC2 + * @param Source : indique le timer qui déclenche l'ADC choix dans les define ci-dessous + * @param Periode_ticks : nombre de pas (tick) comptés à 72 MHz pour faire déborder le timer + * La période de débordement du Timer est donc T = Durée_ticks * Tck, avec Tck = 1/72 000 000 + * @retval None + */ + +// param pour Source : +#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 ); + + + + + + + + + + + + + + + +//********************************************************************************************************** +//--------------------- ANALOG INPUT ADC & DMA ------------------------------ +//********************************************************************************************************** + +/** + * @brief Permer de lier l'ADC à un tableau en RAM pour une DMA + * @note + * @param Circ : circular. Si '0', en fin de DMA le ptr d'@ reste inchangé + * si '1' le ptr d'@ se recale à celle du début. + * @param Ptr_Table_DMA : contient l'@ de début de zone RAM à écrire + * @retval None + */ +void Init_ADC1_DMA1(char Circ, short int *Ptr_Table_DMA); + + + + + +/** + * @brief Lance une DMA sur le nombre de points spécifie. Les resultats seront stockes + * dans la zone de RAM écrite est indiquée lors de l'appel de la fonction Init_ADC1_DMA1 + * @note + * @param NbEchDMA est le nombre d'échantillons à stocker. + * @retval None + */ +void Start_DMA1( u16 NbEchDMA ); + +// arret DMA +#define Stop_DMA1 DMA1_Channel1->CCR =(DMA1_Channel1->CCR) &~0x1; + + +/** + * @brief Attend la fin d'un cycle de DMA. la duree depend de la periode d'acquisition + * et du nombre d'echantillons + * @note fonction d'attente (bloquante) + * @param None + * @retval None + */ +void Wait_On_End_Of_DMA1(void); + + + + + + + + +//********************************************************************************************************** +//--------------------- GPIO ------------------------------ +//********************************************************************************************************** + +/** + * @brief Initialisation d'un GPIO (A à C), pin x. + * peut être configuré : + * -> Input ou output + * -> architecture technologique (push-pull, open drain...) + + * @note + * @param Port : GPIOA, GPIOB, GPIOC + * @param Broche : 0 à 15 + * @param Sens : INPUT ou OUTPUT + * @param Techno : voir define ci dessous + * @retval 1 erreur, 0 si OK + */ + +// Sens +#define INPUT 'i' +#define OUTPUT 'o' + +// Techno pour pin en entré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 + +// Exemple : +// Port_IO_Init(GPIOB, 8, OUTPUT, OUTPUT_PPULL); +// Place le bit 8 du port B en sortie Push-pull +char GPIO_Configure(GPIO_TypeDef * Port, int Broche, int Sens, int Techno); + + +/** + * @brief Mise à 1 d'une broche GPIO + * @note Une fonction par GPIO + * @param Broche : 0 à 15 + * @retval None + */ + +void GPIOA_Set(char Broche); +void GPIOB_Set(char Broche); +void GPIOC_Set(char Broche); + + + +/** + * @brief Mise à 0 d'une broche GPIO + * @note Une fonction par GPIO + * @param Broche : 0 à 15 + * @retval None + */ + +void GPIOA_Clear(char Broche); +void GPIOB_Clear(char Broche); +void GPIOC_Clear(char Broche); + + +#endif + + diff --git a/PjtKEIL_StepDeb_1/Driver/DriverJeuLaser.inc b/PjtKEIL_StepDeb_1/Driver/DriverJeuLaser.inc new file mode 100644 index 0000000..48d5e50 --- /dev/null +++ b/PjtKEIL_StepDeb_1/Driver/DriverJeuLaser.inc @@ -0,0 +1,56 @@ + +; Bibliotheque DriverJeuLaser (ancienne gassp72 adaptée 2021 - TR) +; Accès en aux fonctions suivantes : +; GPIO : +; GPIOA_Set(char Broche), GPIOB_Set(char Broche), GPIOC_Set(char Broche) +; GPIOA_Clear(char Broche), GPIOB_Clear(char Broche), GPIOC_Clear(char Broche) + +; PWM : +;/** +; * @brief Fixe une valeur de PWM, Val, en tick horloge. La rapport cyclique effectif +; * est donc : rcy = Thaut_ticks / Periode_ticks +; * @note spécifique Jeu Laser, PWM liée exclusivement au TIM3, chan3 +; * @param Thaut_ticks : durée de l'état haut d'une impulsion en Ticks +; * @retval None +; */ + +;void PWM_Set_Value_TIM3_Ch3( unsigned short int Thaut_ticks); + import PWM_Set_Value_TIM3_Ch3 + + + +;/** +; * @brief Mise à 1 d'une broche GPIO +; * @note Une fonction par GPIO +; * @param Broche : 0 à 15 +; * @retval None +; */ + +;void GPIOA_Set(char Broche); + import GPIOA_Set + +;void GPIOB_Set(char Broche); + import GPIOB_Set + +;void GPIOC_Set(char Broche); + import GPIOC_Set + + + +;/** +; * @brief Mise à 0 d'une broche GPIO +; * @note Une fonction par GPIO +; * @param Broche : 0 à 15 +; * @retval None +; */ + +;void GPIOA_Clear(char Broche); + import GPIOA_Clear + +;void GPIOB_Clear(char Broche); + import GPIOB_Clear + +;void GPIOC_Clear(char Broche); + import GPIOC_Clear + + end diff --git a/PjtKEIL_StepDeb_1/Src/Delay.s b/PjtKEIL_StepDeb_1/Src/Delay.s new file mode 100644 index 0000000..d30168d --- /dev/null +++ b/PjtKEIL_StepDeb_1/Src/Delay.s @@ -0,0 +1,62 @@ + PRESERVE8 + THUMB + + +; ====================== zone de réservation de données, ====================================== +;Section RAM (read only) : + area mesdata,data,readonly + + +;Section RAM (read write): + area maram,data,readwrite + +VarTime dcd 0 + + EXPORT VarTime + + +; =============================================================================================== + +;constantes (équivalent du #define en C) +TimeValue equ 900000 + + + EXPORT Delay_100ms ; la fonction Delay_100ms est rendue publique donc utilisable par d'autres modules. + + +;Section ROM code (read only) : + area moncode,code,readonly + + + +; REMARQUE IMPORTANTE +; Cette manière de créer une temporisation n'est clairement pas la bonne manière de procéder : +; - elle est peu précise +; - la fonction prend tout le temps CPU pour... ne rien faire... +; +; Pour autant, la fonction montre : +; - les boucles en ASM +; - l'accés écr/lec de variable en RAM +; - le mécanisme d'appel / retour sous programme +; +; et donc possède un intérêt pour débuter en ASM pur + +Delay_100ms proc + + ldr r0,=VarTime + + ldr r1,=TimeValue + str r1,[r0] ; addresse VarTime <- TimeValue Ces trois lignes stockent dans l'adresse r0=VarTime, la valeur de TimeValue + +BoucleTempo ; Cette fonction est équivalente a for(int i=*VarTime; i!=0; i--) + ldr r1,[r0] ; i= *VarTime + + subs r1,#1; i-- + str r1,[r0] ; *VarTime = i + bne BoucleTempo ; if (i!=0) BoucleTempo(); + + bx lr ; lr contient l'adresse de retour, cette instruction revient à la fonction appelante (le main) + endp + + + END \ No newline at end of file diff --git a/PjtKEIL_StepDeb_1/Src/principal.c b/PjtKEIL_StepDeb_1/Src/principal.c new file mode 100644 index 0000000..f4e8d72 --- /dev/null +++ b/PjtKEIL_StepDeb_1/Src/principal.c @@ -0,0 +1,32 @@ +#include "DriverJeuLaser.h" + +extern void Delay_100ms(void); + + +int main(void) +{ + +// =========================================================================== +// ============= INIT PERIPH (faite qu'une seule fois) ===================== +// =========================================================================== + +// Après exécution : le coeur CPU est clocké à 72MHz ainsi que tous les timers +CLOCK_Configure(); + +// configuration de PortB.1 (PB1) en sortie push-pull +GPIO_Configure(GPIOB, 1, OUTPUT, OUTPUT_PPULL); + + + + +//============================================================================ + + +while (1) + { + Delay_100ms(); + GPIOB_Set(1); + Delay_100ms(); + GPIOB_Clear(1); + } +} diff --git a/PjtKEIL_StepDeb_1/Src/startup-rvds.s b/PjtKEIL_StepDeb_1/Src/startup-rvds.s new file mode 100644 index 0000000..a7b631a --- /dev/null +++ b/PjtKEIL_StepDeb_1/Src/startup-rvds.s @@ -0,0 +1,335 @@ +;******************** (C) COPYRIGHT 2011 STMicroelectronics ******************** +;* File Name : startup_stm32f10x_md.s +;* Author : MCD Application Team +;* Version : V3.5.0 +;* Date : 11-March-2011 +;* Description : STM32F10x Medium Density Devices vector table for MDK-ARM +;* toolchain. +;* This module performs: +;* - Set the initial SP +;* - Set the initial PC == Reset_Handler +;* - Set the vector table entries with the exceptions ISR address +;* - Configure the clock system +;* - Branches to __main in the C library (which eventually +;* calls main()). +;* After Reset the CortexM3 processor is in Thread mode, +;* priority is Privileged, and the Stack is set to Main. +;* <<< Use Configuration Wizard in Context Menu >>> +;******************************************************************************* +; THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS +; WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE TIME. +; AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY DIRECT, +; INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING FROM THE +; CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE CODING +; INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. +;******************************************************************************* + +; Amount of memory (in bytes) allocated for Stack +; Tailor this value to your application needs +; Stack Configuration +; Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> +; + +Stack_Size EQU 0x00000400 + + AREA STACK, NOINIT, READWRITE, ALIGN=3 +Stack_Mem SPACE Stack_Size +__initial_sp + + +; Heap Configuration +; Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> +; + +Heap_Size EQU 0x00000200 + + AREA HEAP, NOINIT, READWRITE, ALIGN=3 +__heap_base +Heap_Mem SPACE Heap_Size +__heap_limit + + PRESERVE8 + THUMB + + +; Vector Table Mapped to Address 0 at Reset + AREA RESET, DATA, READONLY + EXPORT __Vectors + EXPORT __Vectors_End + EXPORT __Vectors_Size + +__Vectors DCD __initial_sp ; Top of Stack + DCD Reset_Handler ; Reset Handler + DCD NMI_Handler ; NMI Handler + DCD HardFault_Handler ; Hard Fault Handler + DCD MemManage_Handler ; MPU Fault Handler + DCD BusFault_Handler ; Bus Fault Handler + DCD UsageFault_Handler ; Usage Fault Handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD SVC_Handler ; SVCall Handler + DCD DebugMon_Handler ; Debug Monitor Handler + DCD 0 ; Reserved + DCD PendSV_Handler ; PendSV Handler + DCD SysTick_Handler ; SysTick Handler + + ; External Interrupts + DCD WWDG_IRQHandler ; Window Watchdog + DCD PVD_IRQHandler ; PVD through EXTI Line detect + DCD TAMPER_IRQHandler ; Tamper + DCD RTC_IRQHandler ; RTC + DCD FLASH_IRQHandler ; Flash + DCD RCC_IRQHandler ; RCC + DCD EXTI0_IRQHandler ; EXTI Line 0 + DCD EXTI1_IRQHandler ; EXTI Line 1 + DCD EXTI2_IRQHandler ; EXTI Line 2 + DCD EXTI3_IRQHandler ; EXTI Line 3 + DCD EXTI4_IRQHandler ; EXTI Line 4 + DCD DMA1_Channel1_IRQHandler ; DMA1 Channel 1 + DCD DMA1_Channel2_IRQHandler ; DMA1 Channel 2 + DCD DMA1_Channel3_IRQHandler ; DMA1 Channel 3 + DCD DMA1_Channel4_IRQHandler ; DMA1 Channel 4 + DCD DMA1_Channel5_IRQHandler ; DMA1 Channel 5 + DCD DMA1_Channel6_IRQHandler ; DMA1 Channel 6 + DCD DMA1_Channel7_IRQHandler ; DMA1 Channel 7 + DCD ADC1_2_IRQHandler ; ADC1_2 + DCD USB_HP_CAN1_TX_IRQHandler ; USB High Priority or CAN1 TX + DCD USB_LP_CAN1_RX0_IRQHandler ; USB Low Priority or CAN1 RX0 + DCD CAN1_RX1_IRQHandler ; CAN1 RX1 + DCD CAN1_SCE_IRQHandler ; CAN1 SCE + DCD EXTI9_5_IRQHandler ; EXTI Line 9..5 + DCD TIM1_BRK_IRQHandler ; TIM1 Break + DCD TIM1_UP_IRQHandler ; TIM1 Update + DCD TIM1_TRG_COM_IRQHandler ; TIM1 Trigger and Commutation + DCD TIM1_CC_IRQHandler ; TIM1 Capture Compare + DCD TIM2_IRQHandler ; TIM2 + DCD TIM3_IRQHandler ; TIM3 + DCD TIM4_IRQHandler ; TIM4 + DCD I2C1_EV_IRQHandler ; I2C1 Event + DCD I2C1_ER_IRQHandler ; I2C1 Error + DCD I2C2_EV_IRQHandler ; I2C2 Event + DCD I2C2_ER_IRQHandler ; I2C2 Error + DCD SPI1_IRQHandler ; SPI1 + DCD SPI2_IRQHandler ; SPI2 + DCD USART1_IRQHandler ; USART1 + DCD USART2_IRQHandler ; USART2 + DCD USART3_IRQHandler ; USART3 + DCD EXTI15_10_IRQHandler ; EXTI Line 15..10 + DCD RTCAlarm_IRQHandler ; RTC Alarm through EXTI Line + DCD USBWakeUp_IRQHandler ; USB Wakeup from suspend +__Vectors_End + +__Vectors_Size EQU __Vectors_End - __Vectors + + AREA |.text|, CODE, READONLY + +; Reset handler +Reset_Handler PROC + EXPORT Reset_Handler [WEAK] + IMPORT __main + + LDR R0, =SystemInit + BLX R0 + +; +; Enable UsageFault, MemFault and Busfault interrupts +; +_SHCSR EQU 0xE000ED24 ; SHCSR is located at address 0xE000ED24 + LDR.W R0, =_SHCSR + LDR R1, [R0] ; Read CPACR + ORR R1, R1, #(0x7 << 16) ; Set bits 16,17,18 to enable usagefault, busfault, memfault interrupts + STR R1, [R0] ; Write back the modified value to the CPACR + DSB ; Wait for store to complete + +; +; Set priority grouping (PRIGROUP) in AIRCR to 3 (16 levels for group priority and 0 for subpriority) +; +_AIRCR EQU 0xE000ED0C +_AIRCR_VAL EQU 0x05FA0300 + LDR.W R0, =_AIRCR + LDR.W R1, =_AIRCR_VAL + STR R1,[R0] + +; +; Finaly, jump to main function (void main (void)) +; + LDR R0, =__main + BX R0 + ENDP + +SystemInit PROC + EXPORT SystemInit [WEAK] + BX LR + ENDP + +; Dummy Exception Handlers (infinite loops which can be modified) + +NMI_Handler PROC + EXPORT NMI_Handler [WEAK] + B . + ENDP +HardFault_Handler\ + PROC + EXPORT HardFault_Handler [WEAK] + B . + ENDP +MemManage_Handler\ + PROC + EXPORT MemManage_Handler [WEAK] + B . + ENDP +BusFault_Handler\ + PROC + EXPORT BusFault_Handler [WEAK] + B . + ENDP +UsageFault_Handler\ + PROC + EXPORT UsageFault_Handler [WEAK] + B . + ENDP +SVC_Handler PROC + EXPORT SVC_Handler [WEAK] + B . + ENDP +DebugMon_Handler\ + PROC + EXPORT DebugMon_Handler [WEAK] + B . + ENDP +PendSV_Handler PROC + EXPORT PendSV_Handler [WEAK] + B . + ENDP +SysTick_Handler PROC + EXPORT SysTick_Handler [WEAK] + B . + ENDP + +Default_Handler PROC + + EXPORT WWDG_IRQHandler [WEAK] + EXPORT PVD_IRQHandler [WEAK] + EXPORT TAMPER_IRQHandler [WEAK] + EXPORT RTC_IRQHandler [WEAK] + EXPORT FLASH_IRQHandler [WEAK] + EXPORT RCC_IRQHandler [WEAK] + EXPORT EXTI0_IRQHandler [WEAK] + EXPORT EXTI1_IRQHandler [WEAK] + EXPORT EXTI2_IRQHandler [WEAK] + EXPORT EXTI3_IRQHandler [WEAK] + EXPORT EXTI4_IRQHandler [WEAK] + EXPORT DMA1_Channel1_IRQHandler [WEAK] + EXPORT DMA1_Channel2_IRQHandler [WEAK] + EXPORT DMA1_Channel3_IRQHandler [WEAK] + EXPORT DMA1_Channel4_IRQHandler [WEAK] + EXPORT DMA1_Channel5_IRQHandler [WEAK] + EXPORT DMA1_Channel6_IRQHandler [WEAK] + EXPORT DMA1_Channel7_IRQHandler [WEAK] + EXPORT ADC1_2_IRQHandler [WEAK] + EXPORT USB_HP_CAN1_TX_IRQHandler [WEAK] + EXPORT USB_LP_CAN1_RX0_IRQHandler [WEAK] + EXPORT CAN1_RX1_IRQHandler [WEAK] + EXPORT CAN1_SCE_IRQHandler [WEAK] + EXPORT EXTI9_5_IRQHandler [WEAK] + EXPORT TIM1_BRK_IRQHandler [WEAK] + EXPORT TIM1_UP_IRQHandler [WEAK] + EXPORT TIM1_TRG_COM_IRQHandler [WEAK] + EXPORT TIM1_CC_IRQHandler [WEAK] + EXPORT TIM2_IRQHandler [WEAK] + EXPORT TIM3_IRQHandler [WEAK] + EXPORT TIM4_IRQHandler [WEAK] + EXPORT I2C1_EV_IRQHandler [WEAK] + EXPORT I2C1_ER_IRQHandler [WEAK] + EXPORT I2C2_EV_IRQHandler [WEAK] + EXPORT I2C2_ER_IRQHandler [WEAK] + EXPORT SPI1_IRQHandler [WEAK] + EXPORT SPI2_IRQHandler [WEAK] + EXPORT USART1_IRQHandler [WEAK] + EXPORT USART2_IRQHandler [WEAK] + EXPORT USART3_IRQHandler [WEAK] + EXPORT EXTI15_10_IRQHandler [WEAK] + EXPORT RTCAlarm_IRQHandler [WEAK] + EXPORT USBWakeUp_IRQHandler [WEAK] + +WWDG_IRQHandler +PVD_IRQHandler +TAMPER_IRQHandler +RTC_IRQHandler +FLASH_IRQHandler +RCC_IRQHandler +EXTI0_IRQHandler +EXTI1_IRQHandler +EXTI2_IRQHandler +EXTI3_IRQHandler +EXTI4_IRQHandler +DMA1_Channel1_IRQHandler +DMA1_Channel2_IRQHandler +DMA1_Channel3_IRQHandler +DMA1_Channel4_IRQHandler +DMA1_Channel5_IRQHandler +DMA1_Channel6_IRQHandler +DMA1_Channel7_IRQHandler +ADC1_2_IRQHandler +USB_HP_CAN1_TX_IRQHandler +USB_LP_CAN1_RX0_IRQHandler +CAN1_RX1_IRQHandler +CAN1_SCE_IRQHandler +EXTI9_5_IRQHandler +TIM1_BRK_IRQHandler +TIM1_UP_IRQHandler +TIM1_TRG_COM_IRQHandler +TIM1_CC_IRQHandler +TIM2_IRQHandler +TIM3_IRQHandler +TIM4_IRQHandler +I2C1_EV_IRQHandler +I2C1_ER_IRQHandler +I2C2_EV_IRQHandler +I2C2_ER_IRQHandler +SPI1_IRQHandler +SPI2_IRQHandler +USART1_IRQHandler +USART2_IRQHandler +USART3_IRQHandler +EXTI15_10_IRQHandler +RTCAlarm_IRQHandler +USBWakeUp_IRQHandler + + B . + + ENDP + + ALIGN + +;******************************************************************************* +; User Stack and Heap initialization +;******************************************************************************* + IF :DEF:__MICROLIB + + EXPORT __initial_sp + EXPORT __heap_base + EXPORT __heap_limit + + ELSE + + IMPORT __use_two_region_memory + EXPORT __user_initial_stackheap + +__user_initial_stackheap + + LDR R0, = Heap_Mem + LDR R1, =(Stack_Mem + Stack_Size) + LDR R2, = (Heap_Mem + Heap_Size) + LDR R3, = Stack_Mem + BX LR + + ALIGN + + ENDIF + + END + +;******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE***** diff --git a/PjtKEIL_StepDeb_2.zip b/PjtKEIL_StepDeb_2.zip new file mode 100644 index 0000000000000000000000000000000000000000..0a71113ada0b6db77cab16d9cf71dfdcd0881eb2 GIT binary patch literal 27663 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

NzpUM5?FQyrHx;t=J^r!!`yQ&;6LEqwS_5;pNn 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 literal 0 HcmV?d00001 diff --git a/PjtKEIL_StepDeb_2/BacASable.uvprojx b/PjtKEIL_StepDeb_2/BacASable.uvprojx new file mode 100644 index 0000000..d99d0f0 --- /dev/null +++ b/PjtKEIL_StepDeb_2/BacASable.uvprojx @@ -0,0 +1,1352 @@ + + + + 2.1 + +

### uVision Project, (C) Keil Software
+ + + + Simu + 0x4 + ARM-ADS + 5060750::V5.06 update 6 (build 750)::.\ARMCC + 0 + + + STM32F103RB + STMicroelectronics + Keil.STM32F1xx_DFP.2.3.0 + http://www.keil.com/pack/ + IRAM(0x20000000-0x20004FFF) IROM(0x8000000-0x801FFFF) CLOCK(8000000) CPUTYPE("Cortex-M3") + + + + + + + + + + + + + + + $$Device:STM32F103RB$SVD\STM32F103xx.svd + 0 + 0 + + + + + + + 0 + 0 + 0 + 0 + 1 + + .\Obj\ + BacASable + 1 + 0 + 1 + 1 + 1 + + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 0 + 0 + + + 0 + 0 + 0 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 0 + + + SARMCM3.DLL + -REMAP + DARMSTM.DLL + -pSTM32F103RB + SARMCM3.DLL + + TCM.DLL + -pCM3 + + + + 1 + 0 + 0 + 0 + 16 + + + + + 1 + 0 + 0 + 1 + 1 + 4100 + + 1 + STLink\ST-LINKIII-KEIL_SWO.dll + "" () + + + + + 0 + + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 1 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + "Cortex-M3" + + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 8 + 1 + 0 + 0 + 0 + 3 + 3 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x5000 + + + 1 + 0x8000000 + 0x20000 + + + 0 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x8000000 + 0x20000 + + + 1 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x5000 + + + 0 + 0x0 + 0x0 + + + + + + 1 + 1 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 2 + 0 + 0 + 0 + 0 + 0 + 1 + 1 + 1 + 1 + 0 + 0 + 0 + + --C99 + STM32F103xB,USE_FULL_LL_DRIVER + + .\Driver + + + + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 4 + + + + + + + + + 1 + 0 + 0 + 0 + 1 + 0 + 0x08000000 + 0x20000000 + + + + + + + + + + + + + Sources + + + principal.c + 1 + .\Src\principal.c + + + Cligno.s + 2 + .\Src\Cligno.s + + + + + Sys + + + startup-rvds.s + 2 + .\Src\startup-rvds.s + + + + + Driver + + + DriverJeuLaser.lib + 4 + .\Driver\DriverJeuLaser.lib + + + + + ::CMSIS + + + + + CibleSondeKEIL + 0x4 + ARM-ADS + 5060750::V5.06 update 6 (build 750)::.\ARMCC + 0 + + + STM32F103RB + STMicroelectronics + Keil.STM32F1xx_DFP.2.3.0 + http://www.keil.com/pack/ + IRAM(0x20000000-0x20004FFF) IROM(0x8000000-0x801FFFF) CLOCK(8000000) CPUTYPE("Cortex-M3") + + + + + + + + + + + + + + + $$Device:STM32F103RB$SVD\STM32F103xx.svd + 0 + 0 + + + + + + + 0 + 0 + 0 + 0 + 1 + + .\Obj\ + BacASable + 1 + 0 + 1 + 1 + 1 + + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 0 + 0 + + + 0 + 0 + 0 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 0 + + + SARMCM3.DLL + -REMAP + DARMSTM.DLL + -pSTM32F103RB + SARMCM3.DLL + + TCM.DLL + -pCM3 + + + + 1 + 0 + 0 + 0 + 16 + + + + + 1 + 0 + 0 + 1 + 1 + 4100 + + 1 + STLink\ST-LINKIII-KEIL_SWO.dll + "" () + + + + + 0 + + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 1 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + "Cortex-M3" + + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 8 + 1 + 0 + 0 + 0 + 3 + 3 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x5000 + + + 1 + 0x8000000 + 0x20000 + + + 0 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x8000000 + 0x20000 + + + 1 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x5000 + + + 0 + 0x0 + 0x0 + + + + + + 1 + 1 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 2 + 0 + 0 + 0 + 0 + 0 + 1 + 1 + 1 + 1 + 0 + 0 + 0 + + --C99 + STM32F103xB,USE_FULL_LL_DRIVER + + .\Driver + + + + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 4 + + + + + + + + + 1 + 0 + 0 + 0 + 1 + 0 + 0x08000000 + 0x20000000 + + + + + + + + + + + + + Sources + + + principal.c + 1 + .\Src\principal.c + + + Cligno.s + 2 + .\Src\Cligno.s + + + + + Sys + + + startup-rvds.s + 2 + .\Src\startup-rvds.s + + + + + Driver + + + DriverJeuLaser.lib + 4 + .\Driver\DriverJeuLaser.lib + + + + + ::CMSIS + + + 0 + 0 + 0 + 0 + 0 + 1 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + + + + + + + + + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + + + + + + + + + + + + + + CibleSondeST + 0x4 + ARM-ADS + 5060750::V5.06 update 6 (build 750)::.\ARMCC + 0 + + + STM32F103RB + STMicroelectronics + Keil.STM32F1xx_DFP.2.3.0 + http://www.keil.com/pack/ + IRAM(0x20000000-0x20004FFF) IROM(0x8000000-0x801FFFF) CLOCK(8000000) CPUTYPE("Cortex-M3") + + + + + + + + + + + + + + + $$Device:STM32F103RB$SVD\STM32F103xx.svd + 0 + 0 + + + + + + + 0 + 0 + 0 + 0 + 1 + + .\Obj\ + BacASable + 1 + 0 + 1 + 1 + 1 + + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 0 + 0 + + + 0 + 0 + 0 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 0 + + + SARMCM3.DLL + -REMAP + DARMSTM.DLL + -pSTM32F103RB + SARMCM3.DLL + + TCM.DLL + -pCM3 + + + + 1 + 0 + 0 + 0 + 16 + + + + + 1 + 0 + 0 + 1 + 1 + 4100 + + 1 + STLink\ST-LINKIII-KEIL_SWO.dll + "" () + + + + + 0 + + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 1 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + "Cortex-M3" + + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 8 + 1 + 0 + 0 + 0 + 3 + 3 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x5000 + + + 1 + 0x8000000 + 0x20000 + + + 0 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x8000000 + 0x20000 + + + 1 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x5000 + + + 0 + 0x0 + 0x0 + + + + + + 1 + 1 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 2 + 0 + 0 + 0 + 0 + 0 + 1 + 1 + 1 + 1 + 0 + 0 + 0 + + --C99 + STM32F103xB,USE_FULL_LL_DRIVER + + .\Driver + + + + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 4 + + + + + + + + + 1 + 0 + 0 + 0 + 1 + 0 + 0x08000000 + 0x20000000 + + + + + + + + + + + + + Sources + + + principal.c + 1 + .\Src\principal.c + + + Cligno.s + 2 + .\Src\Cligno.s + + + + + Sys + + + startup-rvds.s + 2 + .\Src\startup-rvds.s + + + + + Driver + + + DriverJeuLaser.lib + 4 + .\Driver\DriverJeuLaser.lib + + + + + ::CMSIS + + + + + + + + + + + + + + + + + + + + + + + + <Project Info> + + + + + + 0 + 1 + + + + + diff --git a/PjtKEIL_StepDeb_2/Driver/DriverJeuLaser.h b/PjtKEIL_StepDeb_2/Driver/DriverJeuLaser.h new file mode 100644 index 0000000..bc9b3bd --- /dev/null +++ b/PjtKEIL_StepDeb_2/Driver/DriverJeuLaser.h @@ -0,0 +1,345 @@ +/** + * Bibliotheque DriverJeuLaser (ancienne gassp72 adaptée 2021 - TR) + * + * GPIO - ADC - Sequenceur - System Timer - PWM - 72 MHz + * Modifs : + * enlèvement de tout ce qui est inutile dans le .h + * ajout de fonctions GPIO dans le .c pour utilisation en ASM ou en C : + * - GPIOA_Set(char Broche), GPIOB_Set(char Broche), GPIOC_Set(char Broche) + * - GPIOA_Clear(char Broche), GPIOB_Clear(char Broche), GPIOC_Clear(char Broche) + * + * ajout d'une fonction qui impose une valeur de PWM (TIM3_CCR3) + * PWM_Set_Value_On_TIM3_C3( int Val) + * permet en ASM ou en C de fixer la valeur de PWM + + * Ajout de commentaires + + */ +#ifndef DRIVERJEULASER_H__ +#define DRIVERJEULASER_H__ + +#include "stm32f10x.h" + +//********************************************************************************************************** +//--------------------- CONFIGURATION CLOCK DU STM32 -------------------------------------- +//********************************************************************************************************** + +/** + * @brief Configure l'ensemble des horloges du uC + * @note horloge systeme (config statique a 72 MHz pour le STM32F103) + * @param None + * @retval None + */ +void CLOCK_Configure(void); + + + + + + + + + + +//********************************************************************************************************** +//--------------------- LES TIMERS GENERAL PURPOSE TIM1 à TIM 4 ------------------------------ +//********************************************************************************************************** + +/** + * @brief Configure un Timer TIM1 à TIM4 avec une périodicité donnée + * @note L' horloge des 4 timers a une fréquence de 72MHz + * @param *Timer = TIM1 ou TIM2 ou TIM3 ou TIM4 + * @param Durée_ticks : nombre de pas (tick) comptés à 72 MHz pour faire déborder le timer + * La période de débordement du Timer est donc T = Durée_ticks * Tck, avec Tck = 1/72 000 000 + * @retval None + */ +void Timer_1234_Init_ff( TIM_TypeDef *Timer, u32 Duree_ticks ); + +/** + * Macros de base pour utiliser les timers + */ + // 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) + + + +/** + * @brief Associe une fonction d'interruption (callback) lors du débordement d'un timer + * @note + * @param *Timer = TIM1 ou TIM2 ou TIM3 ou TIM4 + * @param Prio : niveau de priorité de l'interruption (0 -> priorité max, 15 -> priorité min) + * @param IT_function : le nom de la fonction Callback à appeler lors de l'interruption + * @retval None + */ +void Active_IT_Debordement_Timer( TIM_TypeDef *Timer, char Prio, void (*IT_function)(void) ); + + + + + + + + + + + +//********************************************************************************************************* +//--------------------- PWM TIM1 to TIM 4 ------------------------------ +//********************************************************************************************************* + +/** + * @brief Configure un timer en PWM + * @note + * @param *Timer = TIM1 ou TIM2 ou TIM3 ou TIM4 + * @param voie : un des 4 canaux possibles 1 à 4. + * @param Periode_ticks : nombre de pas (tick) comptés à 72 MHz pour faire déborder le timer + * La période de débordement du Timer est donc T = Durée_ticks * Tck, avec Tck = 1/72 000 000 + * @retval Retourne la période en tick (normalement la même que le param d'entrée sauf si PSC utilisé + */ +unsigned short int PWM_Init_ff( TIM_TypeDef *Timer, char Voie, u32 Periode_ticks ); + + + +/** + * @brief Fixe une valeur de PWM, Val, en tick horloge. La rapport cyclique effectif + * est donc : rcy = Thaut_ticks / Periode_ticks + * @note spécifique Jeu Laser, PWM liée exclusivement au TIM3, chan3 + * @param Thaut_ticks : durée de l'état haut d'une impulsion en Ticks + * @retval None + */ +void PWM_Set_Value_TIM3_Ch3( unsigned short int Thaut_ticks); + + + + + + + + + +//********************************************************************************************************** +//--------------------- LE SYSTICK TIMER, Part of Cortex M3 ------------------------------ +//********************************************************************************************************** + +/** + * @brief Configure le timer Systick avec une périodicité donnée + * @note Ce timer ne peut servir qu'à créer des temporisations ou générer des interruption + * ce n'est pas à proprement parler un périphérique, il fait partie du Cortex M3 + * Ce timer est un 24 bits + * @param Periode_ticks : nombre de pas (tick) comptés à 72 MHz pour établir la périodicité + * La période de débordement du Timer est donc T = Durée_ticks * Tck, avec Tck = 1/72 000 000 + * @retval None + */ +void Systick_Period_ff( unsigned int Periode_ticks ); + + + +/** + * @brief Associe une fonction d'interruption (callback) lors du débordement du Systick + * @note + * @param Prio : niveau de priorité de l'interruption (0 -> priorité max, 15 -> priorité min) + * @param IT_function : le nom de la fonction Callback à appeler lors de l'interruption + * @retval None + */ +void Systick_Prio_IT( char Prio, void (*Systick_function)(void) ); + + +/** + * Macros de base pour utiliser le Systick + */ +#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)) + + + + + + + + + + + + + + +//********************************************************************************************************** +//--------------------- LE SYSTICK TIMER, Part of Cortex M3 ------------------------------ +//********************************************************************************************************** + +/** + * @brief Active l'ADC du STM32, configure la durée de prélèvement de l'échantillon (temps + * de fermeture du switch d'acquisition + * @note + * @param ADC : précise de quel ADC il s'agit, ADC1 ou ADC2 + * @param Duree_Ech_ticks : dirée de fermeture du switch d'échantillonnage en Tick d'horloge CPU + * exemple pour 1µs on choisira 72. + * @retval Nombre de Tick réellement pris en compte + */ +unsigned int Init_TimingADC_ActiveADC_ff( ADC_TypeDef * ADC, u32 Duree_Ech_ticks ); + + +/** + * @brief Sélectionne la voie à convertir + * @note Attention, la voie va de 0 à 15 et n'est pas directement lié au n°de GPIO + * @param ADC : précise de quel ADC il s'agit, ADC1 ou ADC2 + * @param Voie_ADC : 1 à 15 + * @retval None + */ +void Single_Channel_ADC( ADC_TypeDef * ADC, char Voie_ADC ); + + + + + +/** + * @brief Permet lier le déclenchement au débordement d'un timer, spécifie également + * la période de débordement du timer + * @note pas besoin de régler le timer avec une autre fonction dédiée timer + * @param ADC : précise de quel ADC il s'agit, ADC1 ou ADC2 + * @param Source : indique le timer qui déclenche l'ADC choix dans les define ci-dessous + * @param Periode_ticks : nombre de pas (tick) comptés à 72 MHz pour faire déborder le timer + * La période de débordement du Timer est donc T = Durée_ticks * Tck, avec Tck = 1/72 000 000 + * @retval None + */ + +// param pour Source : +#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 ); + + + + + + + + + + + + + + + +//********************************************************************************************************** +//--------------------- ANALOG INPUT ADC & DMA ------------------------------ +//********************************************************************************************************** + +/** + * @brief Permer de lier l'ADC à un tableau en RAM pour une DMA + * @note + * @param Circ : circular. Si '0', en fin de DMA le ptr d'@ reste inchangé + * si '1' le ptr d'@ se recale à celle du début. + * @param Ptr_Table_DMA : contient l'@ de début de zone RAM à écrire + * @retval None + */ +void Init_ADC1_DMA1(char Circ, short int *Ptr_Table_DMA); + + + + + +/** + * @brief Lance une DMA sur le nombre de points spécifie. Les resultats seront stockes + * dans la zone de RAM écrite est indiquée lors de l'appel de la fonction Init_ADC1_DMA1 + * @note + * @param NbEchDMA est le nombre d'échantillons à stocker. + * @retval None + */ +void Start_DMA1( u16 NbEchDMA ); + +// arret DMA +#define Stop_DMA1 DMA1_Channel1->CCR =(DMA1_Channel1->CCR) &~0x1; + + +/** + * @brief Attend la fin d'un cycle de DMA. la duree depend de la periode d'acquisition + * et du nombre d'echantillons + * @note fonction d'attente (bloquante) + * @param None + * @retval None + */ +void Wait_On_End_Of_DMA1(void); + + + + + + + + +//********************************************************************************************************** +//--------------------- GPIO ------------------------------ +//********************************************************************************************************** + +/** + * @brief Initialisation d'un GPIO (A à C), pin x. + * peut être configuré : + * -> Input ou output + * -> architecture technologique (push-pull, open drain...) + + * @note + * @param Port : GPIOA, GPIOB, GPIOC + * @param Broche : 0 à 15 + * @param Sens : INPUT ou OUTPUT + * @param Techno : voir define ci dessous + * @retval 1 erreur, 0 si OK + */ + +// Sens +#define INPUT 'i' +#define OUTPUT 'o' + +// Techno pour pin en entré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 + +// Exemple : +// Port_IO_Init(GPIOB, 8, OUTPUT, OUTPUT_PPULL); +// Place le bit 8 du port B en sortie Push-pull +char GPIO_Configure(GPIO_TypeDef * Port, int Broche, int Sens, int Techno); + + +/** + * @brief Mise à 1 d'une broche GPIO + * @note Une fonction par GPIO + * @param Broche : 0 à 15 + * @retval None + */ + +void GPIOA_Set(char Broche); +void GPIOB_Set(char Broche); +void GPIOC_Set(char Broche); + + + +/** + * @brief Mise à 0 d'une broche GPIO + * @note Une fonction par GPIO + * @param Broche : 0 à 15 + * @retval None + */ + +void GPIOA_Clear(char Broche); +void GPIOB_Clear(char Broche); +void GPIOC_Clear(char Broche); + + +#endif + + diff --git a/PjtKEIL_StepDeb_2/Driver/DriverJeuLaser.inc b/PjtKEIL_StepDeb_2/Driver/DriverJeuLaser.inc new file mode 100644 index 0000000..48d5e50 --- /dev/null +++ b/PjtKEIL_StepDeb_2/Driver/DriverJeuLaser.inc @@ -0,0 +1,56 @@ + +; Bibliotheque DriverJeuLaser (ancienne gassp72 adaptée 2021 - TR) +; Accès en aux fonctions suivantes : +; GPIO : +; GPIOA_Set(char Broche), GPIOB_Set(char Broche), GPIOC_Set(char Broche) +; GPIOA_Clear(char Broche), GPIOB_Clear(char Broche), GPIOC_Clear(char Broche) + +; PWM : +;/** +; * @brief Fixe une valeur de PWM, Val, en tick horloge. La rapport cyclique effectif +; * est donc : rcy = Thaut_ticks / Periode_ticks +; * @note spécifique Jeu Laser, PWM liée exclusivement au TIM3, chan3 +; * @param Thaut_ticks : durée de l'état haut d'une impulsion en Ticks +; * @retval None +; */ + +;void PWM_Set_Value_TIM3_Ch3( unsigned short int Thaut_ticks); + import PWM_Set_Value_TIM3_Ch3 + + + +;/** +; * @brief Mise à 1 d'une broche GPIO +; * @note Une fonction par GPIO +; * @param Broche : 0 à 15 +; * @retval None +; */ + +;void GPIOA_Set(char Broche); + import GPIOA_Set + +;void GPIOB_Set(char Broche); + import GPIOB_Set + +;void GPIOC_Set(char Broche); + import GPIOC_Set + + + +;/** +; * @brief Mise à 0 d'une broche GPIO +; * @note Une fonction par GPIO +; * @param Broche : 0 à 15 +; * @retval None +; */ + +;void GPIOA_Clear(char Broche); + import GPIOA_Clear + +;void GPIOB_Clear(char Broche); + import GPIOB_Clear + +;void GPIOC_Clear(char Broche); + import GPIOC_Clear + + end diff --git a/PjtKEIL_StepDeb_2/Src/Cligno.s b/PjtKEIL_StepDeb_2/Src/Cligno.s new file mode 100644 index 0000000..8a75b7a --- /dev/null +++ b/PjtKEIL_StepDeb_2/Src/Cligno.s @@ -0,0 +1,30 @@ + PRESERVE8 + THUMB + + +; ====================== zone de réservation de données, ====================================== +;Section RAM (read only) : + area mesdata,data,readonly + + +;Section RAM (read write): + area maram,data,readwrite + + + +; =============================================================================================== + + + + +;Section ROM code (read only) : + area moncode,code,readonly +; écrire le code ici + + + + + + + + END \ No newline at end of file diff --git a/PjtKEIL_StepDeb_2/Src/principal.c b/PjtKEIL_StepDeb_2/Src/principal.c new file mode 100644 index 0000000..4d726a1 --- /dev/null +++ b/PjtKEIL_StepDeb_2/Src/principal.c @@ -0,0 +1,61 @@ + + +#include "DriverJeuLaser.h" + +void timer_callback(void); + +int main(void) +{ + +// =========================================================================== +// ============= INIT PERIPH (faites qu'une seule fois) ===================== +// =========================================================================== + +// Après exécution : le coeur CPU est clocké à 72MHz ainsi que tous les timers +CLOCK_Configure(); + +// configuration du Timer 4 en débordement 100ms + +//** Placez votre code là ** // + + + +// Activation des interruptions issues du Timer 4 +// Association de la fonction à exécuter lors de l'interruption : timer_callback +// cette fonction (si écrite en ASM) doit être conforme à l'AAPCS + +//** Placez votre code là ** // + + + +// configuration de PortB.1 (PB1) en sortie push-pull +GPIO_Configure(GPIOB, 1, OUTPUT, OUTPUT_PPULL); + + + + +//============================================================================ + + +while (1) + { + } +} + +char FlagCligno; + +void timer_callback(void) +{ + if (FlagCligno==1) + { + FlagCligno=0; + GPIOB_Set(1); + } + else + { + FlagCligno=1; + GPIOB_Clear(1); + } + +} + diff --git a/PjtKEIL_StepDeb_2/Src/startup-rvds.s b/PjtKEIL_StepDeb_2/Src/startup-rvds.s new file mode 100644 index 0000000..a7b631a --- /dev/null +++ b/PjtKEIL_StepDeb_2/Src/startup-rvds.s @@ -0,0 +1,335 @@ +;******************** (C) COPYRIGHT 2011 STMicroelectronics ******************** +;* File Name : startup_stm32f10x_md.s +;* Author : MCD Application Team +;* Version : V3.5.0 +;* Date : 11-March-2011 +;* Description : STM32F10x Medium Density Devices vector table for MDK-ARM +;* toolchain. +;* This module performs: +;* - Set the initial SP +;* - Set the initial PC == Reset_Handler +;* - Set the vector table entries with the exceptions ISR address +;* - Configure the clock system +;* - Branches to __main in the C library (which eventually +;* calls main()). +;* After Reset the CortexM3 processor is in Thread mode, +;* priority is Privileged, and the Stack is set to Main. +;* <<< Use Configuration Wizard in Context Menu >>> +;******************************************************************************* +; THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS +; WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE TIME. +; AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY DIRECT, +; INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING FROM THE +; CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE CODING +; INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. +;******************************************************************************* + +; Amount of memory (in bytes) allocated for Stack +; Tailor this value to your application needs +; Stack Configuration +; Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> +; + +Stack_Size EQU 0x00000400 + + AREA STACK, NOINIT, READWRITE, ALIGN=3 +Stack_Mem SPACE Stack_Size +__initial_sp + + +; Heap Configuration +; Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> +; + +Heap_Size EQU 0x00000200 + + AREA HEAP, NOINIT, READWRITE, ALIGN=3 +__heap_base +Heap_Mem SPACE Heap_Size +__heap_limit + + PRESERVE8 + THUMB + + +; Vector Table Mapped to Address 0 at Reset + AREA RESET, DATA, READONLY + EXPORT __Vectors + EXPORT __Vectors_End + EXPORT __Vectors_Size + +__Vectors DCD __initial_sp ; Top of Stack + DCD Reset_Handler ; Reset Handler + DCD NMI_Handler ; NMI Handler + DCD HardFault_Handler ; Hard Fault Handler + DCD MemManage_Handler ; MPU Fault Handler + DCD BusFault_Handler ; Bus Fault Handler + DCD UsageFault_Handler ; Usage Fault Handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD SVC_Handler ; SVCall Handler + DCD DebugMon_Handler ; Debug Monitor Handler + DCD 0 ; Reserved + DCD PendSV_Handler ; PendSV Handler + DCD SysTick_Handler ; SysTick Handler + + ; External Interrupts + DCD WWDG_IRQHandler ; Window Watchdog + DCD PVD_IRQHandler ; PVD through EXTI Line detect + DCD TAMPER_IRQHandler ; Tamper + DCD RTC_IRQHandler ; RTC + DCD FLASH_IRQHandler ; Flash + DCD RCC_IRQHandler ; RCC + DCD EXTI0_IRQHandler ; EXTI Line 0 + DCD EXTI1_IRQHandler ; EXTI Line 1 + DCD EXTI2_IRQHandler ; EXTI Line 2 + DCD EXTI3_IRQHandler ; EXTI Line 3 + DCD EXTI4_IRQHandler ; EXTI Line 4 + DCD DMA1_Channel1_IRQHandler ; DMA1 Channel 1 + DCD DMA1_Channel2_IRQHandler ; DMA1 Channel 2 + DCD DMA1_Channel3_IRQHandler ; DMA1 Channel 3 + DCD DMA1_Channel4_IRQHandler ; DMA1 Channel 4 + DCD DMA1_Channel5_IRQHandler ; DMA1 Channel 5 + DCD DMA1_Channel6_IRQHandler ; DMA1 Channel 6 + DCD DMA1_Channel7_IRQHandler ; DMA1 Channel 7 + DCD ADC1_2_IRQHandler ; ADC1_2 + DCD USB_HP_CAN1_TX_IRQHandler ; USB High Priority or CAN1 TX + DCD USB_LP_CAN1_RX0_IRQHandler ; USB Low Priority or CAN1 RX0 + DCD CAN1_RX1_IRQHandler ; CAN1 RX1 + DCD CAN1_SCE_IRQHandler ; CAN1 SCE + DCD EXTI9_5_IRQHandler ; EXTI Line 9..5 + DCD TIM1_BRK_IRQHandler ; TIM1 Break + DCD TIM1_UP_IRQHandler ; TIM1 Update + DCD TIM1_TRG_COM_IRQHandler ; TIM1 Trigger and Commutation + DCD TIM1_CC_IRQHandler ; TIM1 Capture Compare + DCD TIM2_IRQHandler ; TIM2 + DCD TIM3_IRQHandler ; TIM3 + DCD TIM4_IRQHandler ; TIM4 + DCD I2C1_EV_IRQHandler ; I2C1 Event + DCD I2C1_ER_IRQHandler ; I2C1 Error + DCD I2C2_EV_IRQHandler ; I2C2 Event + DCD I2C2_ER_IRQHandler ; I2C2 Error + DCD SPI1_IRQHandler ; SPI1 + DCD SPI2_IRQHandler ; SPI2 + DCD USART1_IRQHandler ; USART1 + DCD USART2_IRQHandler ; USART2 + DCD USART3_IRQHandler ; USART3 + DCD EXTI15_10_IRQHandler ; EXTI Line 15..10 + DCD RTCAlarm_IRQHandler ; RTC Alarm through EXTI Line + DCD USBWakeUp_IRQHandler ; USB Wakeup from suspend +__Vectors_End + +__Vectors_Size EQU __Vectors_End - __Vectors + + AREA |.text|, CODE, READONLY + +; Reset handler +Reset_Handler PROC + EXPORT Reset_Handler [WEAK] + IMPORT __main + + LDR R0, =SystemInit + BLX R0 + +; +; Enable UsageFault, MemFault and Busfault interrupts +; +_SHCSR EQU 0xE000ED24 ; SHCSR is located at address 0xE000ED24 + LDR.W R0, =_SHCSR + LDR R1, [R0] ; Read CPACR + ORR R1, R1, #(0x7 << 16) ; Set bits 16,17,18 to enable usagefault, busfault, memfault interrupts + STR R1, [R0] ; Write back the modified value to the CPACR + DSB ; Wait for store to complete + +; +; Set priority grouping (PRIGROUP) in AIRCR to 3 (16 levels for group priority and 0 for subpriority) +; +_AIRCR EQU 0xE000ED0C +_AIRCR_VAL EQU 0x05FA0300 + LDR.W R0, =_AIRCR + LDR.W R1, =_AIRCR_VAL + STR R1,[R0] + +; +; Finaly, jump to main function (void main (void)) +; + LDR R0, =__main + BX R0 + ENDP + +SystemInit PROC + EXPORT SystemInit [WEAK] + BX LR + ENDP + +; Dummy Exception Handlers (infinite loops which can be modified) + +NMI_Handler PROC + EXPORT NMI_Handler [WEAK] + B . + ENDP +HardFault_Handler\ + PROC + EXPORT HardFault_Handler [WEAK] + B . + ENDP +MemManage_Handler\ + PROC + EXPORT MemManage_Handler [WEAK] + B . + ENDP +BusFault_Handler\ + PROC + EXPORT BusFault_Handler [WEAK] + B . + ENDP +UsageFault_Handler\ + PROC + EXPORT UsageFault_Handler [WEAK] + B . + ENDP +SVC_Handler PROC + EXPORT SVC_Handler [WEAK] + B . + ENDP +DebugMon_Handler\ + PROC + EXPORT DebugMon_Handler [WEAK] + B . + ENDP +PendSV_Handler PROC + EXPORT PendSV_Handler [WEAK] + B . + ENDP +SysTick_Handler PROC + EXPORT SysTick_Handler [WEAK] + B . + ENDP + +Default_Handler PROC + + EXPORT WWDG_IRQHandler [WEAK] + EXPORT PVD_IRQHandler [WEAK] + EXPORT TAMPER_IRQHandler [WEAK] + EXPORT RTC_IRQHandler [WEAK] + EXPORT FLASH_IRQHandler [WEAK] + EXPORT RCC_IRQHandler [WEAK] + EXPORT EXTI0_IRQHandler [WEAK] + EXPORT EXTI1_IRQHandler [WEAK] + EXPORT EXTI2_IRQHandler [WEAK] + EXPORT EXTI3_IRQHandler [WEAK] + EXPORT EXTI4_IRQHandler [WEAK] + EXPORT DMA1_Channel1_IRQHandler [WEAK] + EXPORT DMA1_Channel2_IRQHandler [WEAK] + EXPORT DMA1_Channel3_IRQHandler [WEAK] + EXPORT DMA1_Channel4_IRQHandler [WEAK] + EXPORT DMA1_Channel5_IRQHandler [WEAK] + EXPORT DMA1_Channel6_IRQHandler [WEAK] + EXPORT DMA1_Channel7_IRQHandler [WEAK] + EXPORT ADC1_2_IRQHandler [WEAK] + EXPORT USB_HP_CAN1_TX_IRQHandler [WEAK] + EXPORT USB_LP_CAN1_RX0_IRQHandler [WEAK] + EXPORT CAN1_RX1_IRQHandler [WEAK] + EXPORT CAN1_SCE_IRQHandler [WEAK] + EXPORT EXTI9_5_IRQHandler [WEAK] + EXPORT TIM1_BRK_IRQHandler [WEAK] + EXPORT TIM1_UP_IRQHandler [WEAK] + EXPORT TIM1_TRG_COM_IRQHandler [WEAK] + EXPORT TIM1_CC_IRQHandler [WEAK] + EXPORT TIM2_IRQHandler [WEAK] + EXPORT TIM3_IRQHandler [WEAK] + EXPORT TIM4_IRQHandler [WEAK] + EXPORT I2C1_EV_IRQHandler [WEAK] + EXPORT I2C1_ER_IRQHandler [WEAK] + EXPORT I2C2_EV_IRQHandler [WEAK] + EXPORT I2C2_ER_IRQHandler [WEAK] + EXPORT SPI1_IRQHandler [WEAK] + EXPORT SPI2_IRQHandler [WEAK] + EXPORT USART1_IRQHandler [WEAK] + EXPORT USART2_IRQHandler [WEAK] + EXPORT USART3_IRQHandler [WEAK] + EXPORT EXTI15_10_IRQHandler [WEAK] + EXPORT RTCAlarm_IRQHandler [WEAK] + EXPORT USBWakeUp_IRQHandler [WEAK] + +WWDG_IRQHandler +PVD_IRQHandler +TAMPER_IRQHandler +RTC_IRQHandler +FLASH_IRQHandler +RCC_IRQHandler +EXTI0_IRQHandler +EXTI1_IRQHandler +EXTI2_IRQHandler +EXTI3_IRQHandler +EXTI4_IRQHandler +DMA1_Channel1_IRQHandler +DMA1_Channel2_IRQHandler +DMA1_Channel3_IRQHandler +DMA1_Channel4_IRQHandler +DMA1_Channel5_IRQHandler +DMA1_Channel6_IRQHandler +DMA1_Channel7_IRQHandler +ADC1_2_IRQHandler +USB_HP_CAN1_TX_IRQHandler +USB_LP_CAN1_RX0_IRQHandler +CAN1_RX1_IRQHandler +CAN1_SCE_IRQHandler +EXTI9_5_IRQHandler +TIM1_BRK_IRQHandler +TIM1_UP_IRQHandler +TIM1_TRG_COM_IRQHandler +TIM1_CC_IRQHandler +TIM2_IRQHandler +TIM3_IRQHandler +TIM4_IRQHandler +I2C1_EV_IRQHandler +I2C1_ER_IRQHandler +I2C2_EV_IRQHandler +I2C2_ER_IRQHandler +SPI1_IRQHandler +SPI2_IRQHandler +USART1_IRQHandler +USART2_IRQHandler +USART3_IRQHandler +EXTI15_10_IRQHandler +RTCAlarm_IRQHandler +USBWakeUp_IRQHandler + + B . + + ENDP + + ALIGN + +;******************************************************************************* +; User Stack and Heap initialization +;******************************************************************************* + IF :DEF:__MICROLIB + + EXPORT __initial_sp + EXPORT __heap_base + EXPORT __heap_limit + + ELSE + + IMPORT __use_two_region_memory + EXPORT __user_initial_stackheap + +__user_initial_stackheap + + LDR R0, = Heap_Mem + LDR R1, =(Stack_Mem + Stack_Size) + LDR R2, = (Heap_Mem + Heap_Size) + LDR R3, = Stack_Mem + BX LR + + ALIGN + + ENDIF + + END + +;******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE*****