InformatiqueMaterielle4A/Services/Chrono.c

191 lines
4 KiB
C

// A COMPLETER
/*
Service permettant de chornométrer jusqu'à 59mn 59s 99 1/100
Utilise un timer au choix (TIMER1 à TIMER4).
Utilise la lib MyTimers.h /.c
*/
#include "Chrono.h"
#include "MyTimer.h"
#include "stm32f1xx_ll_gpio.h"
#include "stm32f1xx_ll_bus.h" // CLock
#include "stm32f1xx_ll_utils.h"
// variable privée de type Time qui mémorise la durée mesurée
static Time Chrono_Time; // rem : static rend la visibilité de la variable Chrono_Time limitée à ce fichier
// variable privée qui mémorise pour le module le timer utilisé par le module
static TIM_TypeDef * Chrono_Timer=TIM1; // init par défaut au cas où l'utilisateur ne lance pas Chrono_Conf avant toute autre fct.
// déclaration callback appelé toute les 10ms
void Chrono_Task_10ms(void);
void Chrono_Conf_io(void) {
LL_APB2_GRP1_EnableClock(LL_APB2_GRP1_PERIPH_GPIOC);
LL_GPIO_SetPinMode(GPIOC, LL_GPIO_PIN_8, LL_GPIO_MODE_FLOATING);
LL_GPIO_SetPinMode(GPIOC, LL_GPIO_PIN_13, LL_GPIO_MODE_FLOATING);
LL_GPIO_SetPinMode(GPIOC, LL_GPIO_PIN_10, LL_GPIO_MODE_OUTPUT_2MHz);
LL_GPIO_SetPinOutputType(GPIOC, LL_GPIO_PIN_10, LL_GPIO_OUTPUT_OPENDRAIN);
LL_GPIO_SetOutputPin(GPIOC, LL_GPIO_PIN_10); // Car logique négative
}
void Chrono_Background(void) {
static int isAllume = 1;
static int Start_Stop_Button_Last_State = 0;
static int Reset_Button_Last_State = 1;
if (LL_GPIO_IsInputPinSet(GPIOC, LL_GPIO_PIN_8)) {
Start_Stop_Button_Last_State = 1;
}
if (!LL_GPIO_IsInputPinSet(GPIOC, LL_GPIO_PIN_8) && Start_Stop_Button_Last_State) {
Start_Stop_Button_Last_State = 0;
if (isAllume) {
isAllume = 0;
Chrono_Stop();
} else {
isAllume = 1;
Chrono_Start();
}
LL_mDelay(1);
}
if (!LL_GPIO_IsInputPinSet(GPIOC, LL_GPIO_PIN_13)) {
Reset_Button_Last_State = 0;
}
if (LL_GPIO_IsInputPinSet(GPIOC, LL_GPIO_PIN_13) && !Reset_Button_Last_State) {
Reset_Button_Last_State = 1;
Chrono_Reset();
if (isAllume) {
Chrono_Start();
}
}
}
/**
* @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;
// Réglage Timer pour un débordement à 10ms
MyTimer_Conf(Chrono_Timer,999, 719);
// Réglage interruption du Timer avec callback : Chrono_Task_10ms()
MyTimer_IT_Conf(Chrono_Timer, Chrono_Task_10ms,3);
// Validation IT
MyTimer_IT_Enable(Chrono_Timer);
// Configuration des IO
Chrono_Conf_io();
}
/**
* @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)
{
MyTimer_Start(Chrono_Timer);
}
/**
* @brief Arrête le chronomètre.
* @note
* @param Aucun
* @retval Aucun
*/
void Chrono_Stop(void)
{
MyTimer_Stop(Chrono_Timer);
}
/**
* @brief Remet le chronomètre à 0
* @note
* @param Aucun
* @retval Aucun
*/
void Chrono_Reset(void)
{
// Arrêt Chrono
MyTimer_Stop(Chrono_Timer);
// 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
*/
Time * Chrono_Read(void)
{
return &Chrono_Time;
}
/**
* @brief incrémente la variable privée Chron_Time modulo 60mn
* @note
* @param Aucun
* @retval Aucun
*/
void Chrono_Task_10ms(void)
{
static int LED_OFF = 1;
Chrono_Time.Hund++;
if (Chrono_Time.Hund==100)
{
Chrono_Time.Sec++;
Chrono_Time.Hund=0;
if (LED_OFF) {
LL_GPIO_ResetOutputPin(GPIOC, LL_GPIO_PIN_10);
LED_OFF = 0;
} else {
LL_GPIO_SetOutputPin(GPIOC, LL_GPIO_PIN_10);
LED_OFF = 1;
}
}
if (Chrono_Time.Sec==60)
{
Chrono_Time.Min++;
Chrono_Time.Sec=0;
}
if (Chrono_Time.Min==60)
{
Chrono_Time.Hund=0;
}
}