From d34d0f95da20326eb851f7f25953297c80e96ceb Mon Sep 17 00:00:00 2001 From: benassai Date: Fri, 6 Nov 2020 09:09:21 +0100 Subject: [PATCH 1/2] Debut d'ecriture de GPIO.h et de GPIO.c: GPIO_conf partiellement ecrite --- MyDrivers/GPIO.c | 16 ++++++++++++++++ MyDrivers/GPIO.h | 10 ++++++++++ 2 files changed, 26 insertions(+) diff --git a/MyDrivers/GPIO.c b/MyDrivers/GPIO.c index 93bf04a..820a14f 100644 --- a/MyDrivers/GPIO.c +++ b/MyDrivers/GPIO.c @@ -1,2 +1,18 @@ #include "GPIO.h" +#include "stm32f1xx_ll_gpio.h" +void GPIO_conf(GPIO_TypeDef * GPIOx, uint32_t PINx, uint32_t mode, uint32_t outputType, uint32_t pullMode){ + + LL_GPIO_InitTypeDef init; + + //Activation de l'horloge + if (GPIOx == GPIOA) LL_APB2_GRP1_EnableClock(LL_APB2_GRP1_PERIPH_GPIOA); + else if (GPIOx == GPIOB) LL_APB2_GRP1_EnableClock(LL_APB2_GRP1_PERIPH_GPIOB); + else if (GPIOx == GPIOC) LL_APB2_GRP1_EnableClock(LL_APB2_GRP1_PERIPH_GPIOC); + else if (GPIOx == GPIOD) LL_APB2_GRP1_EnableClock(LL_APB2_GRP1_PERIPH_GPIOD); + + //Configuration de la PIN + LL_GPIO_StructInit(&init); + init.Pin = PINx; + +} \ No newline at end of file diff --git a/MyDrivers/GPIO.h b/MyDrivers/GPIO.h index 8e3c489..9a0178e 100644 --- a/MyDrivers/GPIO.h +++ b/MyDrivers/GPIO.h @@ -1,4 +1,14 @@ #ifndef GPIO_H #define GPIO_H +#include "stm32f103xb.h" +#include "stm32f1xx_ll_gpio.h" +#include "stm32f1xx_ll_bus.h" + +void GPIO_conf(GPIO_TypeDef * GPIOx, uint32_t PINx, uint32_t mode, uint32_t outputType, uint32_t pullMode); + +void GPIO_setPin(GPIO_TypeDef GPIOx, uint32_t PINx, int output); + +void GPIO_readPin(GPIO_TypeDef GPIOx, uint32_t PINx); + #endif From db0406a4f5d6b0f6df59038640eb6612996f04c0 Mon Sep 17 00:00:00 2001 From: benassai Date: Fri, 6 Nov 2020 10:14:24 +0100 Subject: [PATCH 2/2] =?UTF-8?q?Fonctions=20associ=C3=A9es=20au=20GPIO=20?= =?UTF-8?q?=C3=A9crites?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- MyDrivers/GPIO.c | 21 +++++++- MyDrivers/GPIO.h | 13 ++++- MyDrivers/Timer.c | 67 +++++++++++++---------- MyDrivers/Timer.h | 79 ++++++++++++++++++--------- Services/Chrono.c | 135 +++++++++++++++++++++++----------------------- Services/Chrono.h | 36 ++++++------- 6 files changed, 208 insertions(+), 143 deletions(-) diff --git a/MyDrivers/GPIO.c b/MyDrivers/GPIO.c index 820a14f..b5fccc2 100644 --- a/MyDrivers/GPIO.c +++ b/MyDrivers/GPIO.c @@ -11,8 +11,25 @@ void GPIO_conf(GPIO_TypeDef * GPIOx, uint32_t PINx, uint32_t mode, uint32_t outp else if (GPIOx == GPIOC) LL_APB2_GRP1_EnableClock(LL_APB2_GRP1_PERIPH_GPIOC); else if (GPIOx == GPIOD) LL_APB2_GRP1_EnableClock(LL_APB2_GRP1_PERIPH_GPIOD); - //Configuration de la PIN + //Configuration du PIN LL_GPIO_StructInit(&init); init.Pin = PINx; + init.Mode = mode; + //init.Speed = ; + init.OutputType = outputType; + init.Pull = pullMode; + LL_GPIO_Init(GPIOx, &init); +} + +void GPIO_setPin(GPIO_TypeDef * GPIOx, uint32_t PINx, int output){ -} \ No newline at end of file + if (output) LL_GPIO_SetOutputPin(GPIOx, PINx); + else LL_GPIO_ResetOutputPin(GPIOx,PINx); + +}; + +int GPIO_readPin(GPIO_TypeDef * GPIOx, uint32_t PINx){ + + return LL_GPIO_IsOutputPinSet(GPIOx, PINx); + +} diff --git a/MyDrivers/GPIO.h b/MyDrivers/GPIO.h index 9a0178e..c8e51fb 100644 --- a/MyDrivers/GPIO.h +++ b/MyDrivers/GPIO.h @@ -5,10 +5,19 @@ #include "stm32f1xx_ll_gpio.h" #include "stm32f1xx_ll_bus.h" + +/** + * @brief Configure le GPIO considéré + * @note + * @param GPIO_TypeDef * GPIOx indique le GPIO à configurer : GPIOA, GPIOB, GPIOC ou GPIOD + uint32_t PINx indique le PIN à configurer, sous la forme LL_GPIO_PIN_x + Pour une liste des modes disponibles, consulter la librairie LL + * @retval None + */ void GPIO_conf(GPIO_TypeDef * GPIOx, uint32_t PINx, uint32_t mode, uint32_t outputType, uint32_t pullMode); -void GPIO_setPin(GPIO_TypeDef GPIOx, uint32_t PINx, int output); +void GPIO_setPin(GPIO_TypeDef * GPIOx, uint32_t PINx, int output); -void GPIO_readPin(GPIO_TypeDef GPIOx, uint32_t PINx); +int GPIO_readPin(GPIO_TypeDef * GPIOx, uint32_t PINx); #endif diff --git a/MyDrivers/Timer.c b/MyDrivers/Timer.c index eda5cae..0aebddb 100644 --- a/MyDrivers/Timer.c +++ b/MyDrivers/Timer.c @@ -4,7 +4,7 @@ /**************************************************************************** - * INTERRUPTIONS + * INTERRUPTIONS ***************************************************************************/ @@ -47,10 +47,10 @@ void TIM4_IRQHandler(void) /** * @brief Autorise les interruptions - * @note + * @note * @param TIM_TypeDef Timer : indique le timer à utiliser par le chronomètre, TIM1, TIM2, TIM3 ou TIM4 - * @retval None - */ + * @retval None + */ void Timer_IT_enable(TIM_TypeDef * timer) { LL_TIM_EnableIT_UPDATE(timer); @@ -59,10 +59,10 @@ void Timer_IT_enable(TIM_TypeDef * timer) /** * @brief Interdit les interruptions - * @note + * @note * @param TIM_TypeDef Timer : indique le timer à utiliser par le chronomètre, TIM1, TIM2, TIM3 ou TIM4 - * @retval None - */ + * @retval None + */ void Timer_IT_disable(TIM_TypeDef * timer) { LL_TIM_DisableIT_UPDATE(timer); @@ -70,12 +70,12 @@ void Timer_IT_disable(TIM_TypeDef * timer) /** * @brief Configure le Timer considéré en interruption sur débordement. - * @note A ce stade, les interruptions ne sont pas validés (voir MyTimer_IT_Enable ) + * @note A ce stade, les interruptions ne sont pas validés (voir MyTimer_IT_Enable ) * @param TIM_TypeDef Timer : indique le timer à utiliser par le chronomètre, TIM1, TIM2, TIM3 ou TIM4 * void (*IT_function) (void) : nom (adresse) de la fonction à lancer sur interruption * int Prio : priorité associée à l'interruption - * @retval None - */ + * @retval None + */ void Timer_IT_conf(TIM_TypeDef * timer, void (*it_callback) (void), int prio) { // affectation de la fonction @@ -103,15 +103,15 @@ void Timer_IT_conf(TIM_TypeDef * timer, void (*it_callback) (void), int prio) } /**************************************************************************** - * TIMER + * TIMER ***************************************************************************/ /** * @brief Démarre le timer considéré et active les interruptions - * @note + * @note * @param TIM_TypeDef Timer : indique le timer à utiliser par le chronomètre, TIM1, TIM2, TIM3 ou TIM4 - * @retval None - */ + * @retval None + */ void Timer_start(TIM_TypeDef * timer) { LL_TIM_EnableCounter(timer); @@ -119,10 +119,10 @@ void Timer_start(TIM_TypeDef * timer) /** * @brief Arrêt le timer considéré et désactive les interruptions - * @note + * @note * @param TIM_TypeDef Timer : indique le timer à utiliser par le chronomètre, TIM1, TIM2, TIM3 ou TIM4 - * @retval None - */ + * @retval None + */ void Timer_stop(TIM_TypeDef * timer) { LL_TIM_DisableCounter(timer); @@ -130,12 +130,12 @@ void Timer_stop(TIM_TypeDef * timer) /** * @brief Active l'horloge et règle l'ARR et le PSC du timer visé. - * @note Fonction à lancer avant toute autre. Le timer n'est pas encore lancé (voir Timer_start) + * @note Fonction à lancer avant toute autre. Le timer n'est pas encore lancé (voir Timer_start) * @param TIM_TypeDef Timer : indique le timer à utiliser par le chronomètre, TIM1, TIM2, TIM3 ou TIM4 * int Arr : valeur à placer dans ARR * int Psc : valeur à placer dans PSC - * @retval None - */ + * @retval None + */ void Timer_conf(TIM_TypeDef * timer, int arr, int psc) { LL_TIM_InitTypeDef init_struct; @@ -163,12 +163,12 @@ void Timer_conf(TIM_TypeDef * timer, int arr, int psc) } /**************************************************************************** - * PWM INPUT + * PWM INPUT ***************************************************************************/ /**************************************************************************** - * PWM OUTPUT + * PWM OUTPUT ***************************************************************************/ int getArrFromFreq(float freq_khz) @@ -176,7 +176,7 @@ int getArrFromFreq(float freq_khz) return (72000 / freq_khz) - 1; } -void PWMo_conf(TIM_TypeDef * timer, int channel, float freq_khz, float dutyCycle) +void Timer_pwmo_conf(TIM_TypeDef * timer, int channel, float freq_khz, float dutyCycle) { const int arr = getArrFromFreq(freq_khz); Timer_conf(timer, arr, 0); @@ -190,7 +190,7 @@ void PWMo_conf(TIM_TypeDef * timer, int channel, float freq_khz, float dutyCycle LL_TIM_OC_Init(timer, channel, &init_struct); } -void PWMo_setDutyCycle(TIM_TypeDef * timer, int channel, float freq_khz, float dutyCycle) +void Timer_pwmo_setDutyCycle(TIM_TypeDef * timer, int channel, float freq_khz, float dutyCycle) { int compare = dutyCycle * getArrFromFreq(freq_khz); if (channel == LL_TIM_CHANNEL_CH1) LL_TIM_OC_SetCompareCH1(timer, compare); @@ -200,15 +200,26 @@ void PWMo_setDutyCycle(TIM_TypeDef * timer, int channel, float freq_khz, float d } /**************************************************************************** - * ENCODER + * ENCODER ***************************************************************************/ -void Timer_encoder_conf(TIM_TypeDef * timer, int arr, int psc) +void Timer_encoder_conf(TIM_TypeDef * timer) { + Timer_conf(timer, 359, 0); + LL_TIM_ENCODER_InitTypeDef init_struct; + LL_TIM_ENCODER_StructInit(&init_struct); + init_struct.EncoderMode = LL_TIM_ENCODERMODE_X2_TI1; + + LL_TIM_ENCODER_Init(timer, &init_struct); } -int Timer_encoder_get(TIM_TypeDef * timer) +int Timer_encoder_getAngle(TIM_TypeDef * timer) { - return 0; + return LL_TIM_GetCounter(timer); +} + +int Timer_encoder_getDirection(TIM_TypeDef * timer) +{ + return LL_TIM_GetDirection(timer); } diff --git a/MyDrivers/Timer.h b/MyDrivers/Timer.h index a1583eb..d2a7ca7 100644 --- a/MyDrivers/Timer.h +++ b/MyDrivers/Timer.h @@ -4,7 +4,7 @@ #include "stm32f103xb.h" /**************************************************************************** - * INTERRUPTIONS + * INTERRUPTIONS ***************************************************************************/ void Timer_IT_enable(TIM_TypeDef * timer); @@ -15,41 +15,41 @@ void Timer_IT_conf(TIM_TypeDef * timer, void (*it_callback) (void), int prio); /**************************************************************************** - * TIMER + * TIMER ***************************************************************************/ /** * @brief Active l'horloge et règle l'ARR et le PSC du timer visé - * @note Fonction à lancer avant toute autre. Le timer n'est pas encore lancé (voir MyTimerStart) + * @note Fonction à lancer avant toute autre. Le timer n'est pas encore lancé (voir MyTimerStart) * @param TIM_TypeDef Timer : indique le timer à utiliser par le chronomètre, TIM1, TIM2, TIM3 ou TIM4 * int Arr : valeur à placer dans ARR * int Psc : valeur à placer dans PSC - * @retval None - */ + * @retval None + */ void Timer_conf(TIM_TypeDef * timer, int arr, int psc); /** * @brief Démarre le timer considéré - * @note + * @note * @param TIM_TypeDef Timer : indique le timer à utiliser par le chronomètre, TIM1, TIM2, TIM3 ou TIM4 - * @retval None - */ + * @retval None + */ void Timer_start(TIM_TypeDef * timer); /** * @brief Arrêt le timer considéré - * @note + * @note * @param TIM_TypeDef Timer : indique le timer à utiliser par le chronomètre, TIM1, TIM2, TIM3 ou TIM4 - * @retval None - */ + * @retval None + */ void Timer_stop(TIM_TypeDef * timer); /**************************************************************************** - * PWM INPUT + * PWM INPUT ***************************************************************************/ void PWMi_conf(TIM_TypeDef * timer, int channel); @@ -57,27 +57,56 @@ void PWMi_conf(TIM_TypeDef * timer, int channel); int PWMi_getDutyCycle(TIM_TypeDef * timer, int channel); /**************************************************************************** - * PWM OUTPUT + * PWM OUTPUT ***************************************************************************/ -void PWMo_conf(TIM_TypeDef * timer, int channel, float freq_khz, float dutyCycle); - /** - * @brief Arrêt le timer considéré - * @note + * @brief Configure le timer en mode PWM output à la fréquence donnée + * @note * @param TIM_TypeDef Timer : indique le timer à utiliser : TIM1, TIM2, TIM3 ou TIM4 - * int channel : Le channel utilisé par la PWM - * float dutyCycle : Valeur entre 0 et 1 - * @retval None - */ -void PWMo_setDutyCycle(TIM_TypeDef * timer, int channel, float freq_khz, float dutyCycle); + * int channel : Le channel utilisé par la PWM + * float freq_khz : Fréquence en KHz + * float dutyCycle : Valeur entre 0 et 1 + * @retval None + */ +void Timer_pwmo_conf(TIM_TypeDef * timer, int channel, float freq_khz, float dutyCycle); + +/** + * @brief Modifie le duty cycle de la PWM + * @note + * @param TIM_TypeDef Timer : indique le timer à utiliser : TIM1, TIM2, TIM3 ou TIM4 + * int channel : Le channel utilisé par la PWM + * float dutyCycle : Valeur entre 0 et 1 + * @retval None + */ +void Timer_pwmo_setDutyCycle(TIM_TypeDef * timer, int channel, float freq_khz, float dutyCycle); /**************************************************************************** - * ENCODER + * ENCODER ***************************************************************************/ -void Timer_encoder_conf(TIM_TypeDef * timer, int arr, int psc); +/** + * @brief Configure le timer en mode encoder + * @note + * @param TIM_TypeDef Timer : indique le timer à utiliser : TIM1, TIM2, TIM3 ou TIM4 + * @retval None + */ +void Timer_encoder_conf(TIM_TypeDef * timer); -int Timer_encoder_get(TIM_TypeDef * timer); +/** + * @brief Récupère l'angle, en degrès + * @note + * @param TIM_TypeDef Timer : indique le timer à utiliser : TIM1, TIM2, TIM3 ou TIM4 + * @retval None + */ +int Timer_encoder_getAngle(TIM_TypeDef * timer); + +/** + * @brief Récupère la direction + * @note + * @param TIM_TypeDef Timer : indique le timer à utiliser : TIM1, TIM2, TIM3 ou TIM4 + * @retval None + */ +int Timer_encoder_getDirection(TIM_TypeDef * timer); #endif diff --git a/Services/Chrono.c b/Services/Chrono.c index ff2aa38..8cd438f 100644 --- a/Services/Chrono.c +++ b/Services/Chrono.c @@ -21,110 +21,109 @@ static TIM_TypeDef * Chrono_Timer=TIM1; // init par d void Chrono_Task_10ms(void); /** - * @brief Configure le chronomètre. - * @note A lancer avant toute autre fonction. - * @param Timer : indique le timer à utiliser par le chronomètre, TIM1, TIM2, TIM3 ou TIM4 - * @retval None - */ +* @brief Configure le chronomètre. +* @note A lancer avant toute autre fonction. +* @param Timer : indique le timer à utiliser par le chronomètre, TIM1, TIM2, TIM3 ou TIM4 +* @retval None +*/ void Chrono_Conf(TIM_TypeDef * Timer) { - // Reset Time - Chrono_Time.Hund = 0; - Chrono_Time.Sec = 0; - Chrono_Time.Min = 0; - - // Fixation du Timer - Chrono_Timer = Timer; +// Reset Time +Chrono_Time.Hund = 0; +Chrono_Time.Sec = 0; +Chrono_Time.Min = 0; - // Réglage Timer pour un débordement à 10ms - Timer_conf(Chrono_Timer, 999, 719); - - // Réglage des interruptions - Timer_IT_conf(Chrono_Timer, Chrono_Task_10ms, 3); - Timer_IT_enable(Chrono_Timer); +// Fixation du Timer +Chrono_Timer = Timer; + +// Réglage Timer pour un débordement à 10ms +Timer_conf(Chrono_Timer, 999, 719); + +// Réglage des interruptions +Timer_IT_conf(Chrono_Timer, Chrono_Task_10ms, 3); +Timer_IT_enable(Chrono_Timer); } /** - * @brief Démarre le chronomètre. - * @note si la durée dépasse 59mn 59sec 99 Hund, elle est remise à zéro et repart - * @param Aucun - * @retval Aucun - */ +* @brief Démarre le chronomètre. +* @note si la durée dépasse 59mn 59sec 99 Hund, elle est remise à zéro et repart +* @param Aucun +* @retval Aucun +*/ void Chrono_Start(void) { - Timer_start(Chrono_Timer); +Timer_start(Chrono_Timer); } /** - * @brief Arrête le chronomètre. - * @note - * @param Aucun - * @retval Aucun - */ +* @brief Arrête le chronomètre. +* @note +* @param Aucun +* @retval Aucun +*/ void Chrono_Stop(void) { - Timer_stop(Chrono_Timer); +Timer_stop(Chrono_Timer); } /** - * @brief Remet le chronomètre à 0 - * @note - * @param Aucun - * @retval Aucun - */ +* @brief Remet le chronomètre à 0 +* @note +* @param Aucun +* @retval Aucun +*/ void Chrono_Reset(void) { - // Arrêt Chrono - Timer_stop(Chrono_Timer); +// Arrêt Chrono +Timer_stop(Chrono_Timer); - // Reset Time - Chrono_Time.Hund=0; - Chrono_Time.Sec=0; - Chrono_Time.Min=0; +// Reset Time +Chrono_Time.Hund=0; +Chrono_Time.Sec=0; +Chrono_Time.Min=0; } /** - * @brief Renvoie l'adresse de la variable Time privée gérée dans le module Chrono.c - * @note - * @param Aucun - * @retval adresse de la variable Time - */ +* @brief Renvoie l'adresse de la variable Time privée gérée dans le module Chrono.c +* @note +* @param Aucun +* @retval adresse de la variable Time +*/ Time * Chrono_Read(void) { - return &Chrono_Time; +return &Chrono_Time; } /** - * @brief incrémente la variable privée Chron_Time modulo 60mn - * @note - * @param Aucun - * @retval Aucun - */ +* @brief incrémente la variable privée Chron_Time modulo 60mn +* @note +* @param Aucun +* @retval Aucun +*/ void Chrono_Task_10ms(void) { - Chrono_Time.Hund++; - if (Chrono_Time.Hund==100) - { - Chrono_Time.Sec++; - Chrono_Time.Hund=0; - } - if (Chrono_Time.Sec==60) - { - Chrono_Time.Min++; - Chrono_Time.Sec=0; - } - if (Chrono_Time.Min==60) - { - Chrono_Time.Hund=0; - } - +Chrono_Time.Hund++; +if (Chrono_Time.Hund==100) +{ +Chrono_Time.Sec++; +Chrono_Time.Hund=0; +} +if (Chrono_Time.Sec==60) +{ +Chrono_Time.Min++; +Chrono_Time.Sec=0; +} +if (Chrono_Time.Min==60) +{ +Chrono_Time.Hund=0; } +} diff --git a/Services/Chrono.h b/Services/Chrono.h index 4b03760..558b46e 100644 --- a/Services/Chrono.h +++ b/Services/Chrono.h @@ -30,10 +30,10 @@ Les fonctions qui g /** * @brief polle les 3 entrées et gènère les actions à faire - * @note Fct à lancer en tâche de fond (non bloquante) + * @note Fct à lancer en tâche de fond (non bloquante) * @param None - * @retval None - */ + * @retval None + */ void Chrono_Background(void); @@ -55,10 +55,10 @@ typedef struct { /** * @brief Configure le chronomètre. - * @note A lancer avant toute autre fonction. + * @note A lancer avant toute autre fonction. * @param TIM_TypeDef Timer : indique le timer à utiliser par le chronomètre, TIM1, TIM2, TIM3 ou TIM4 - * @retval None - */ + * @retval None + */ void Chrono_Conf(TIM_TypeDef * Timer); @@ -68,37 +68,37 @@ void Chrono_Conf(TIM_TypeDef * Timer); /** * @brief Démarre le chronomètre. - * @note si la durée dépasse 59mn 59sec 99 cent, elle est remise à zéro et repart + * @note si la durée dépasse 59mn 59sec 99 cent, elle est remise à zéro et repart * @param Aucun - * @retval Aucun - */ + * @retval Aucun + */ void Chrono_Start(void); /** * @brief Arrête le chronomètre. - * @note + * @note * @param Aucun - * @retval Aucun - */ + * @retval Aucun + */ void Chrono_Stop(void); /** * @brief Remet le chronomètre à 0 - * @note + * @note * @param Aucun - * @retval Aucun - */ + * @retval Aucun + */ void Chrono_Reset(void); /** * @brief Renvoie l'adresse de la variable Time privée gérée dans le module Chrono.c - * @note + * @note * @param Aucun - * @retval adresse de la variable Time - */ + * @retval adresse de la variable Time + */ Time * Chrono_Read(void);