tp/drivers/Driver_Timer.c
2023-03-22 13:47:09 +01:00

52 lines
2.2 KiB
C

#include "Driver_Timer.h"
void MyTimer_Init(MyTimer_Struct_TypeDef *Timer)
{
// Activation de l'horloge correspondante au Timer
if (Timer->Timer == TIM1) {
RCC->APB2ENR |= RCC_APB2ENR_TIM1EN; // Voir p140 du manual
} else if (Timer->Timer == TIM2) {
RCC->APB1ENR |= RCC_APB1ENR_TIM2EN;
} else if (Timer->Timer == TIM3) {
RCC->APB1ENR |= RCC_APB1ENR_TIM3EN;
} else if (Timer->Timer == TIM4) {
RCC->APB1ENR |= RCC_APB1ENR_TIM4EN;
}
// Configuration du Timer
// Le compteur du registre PSC commence à zéro, donc on soustrait 1 pour éviter les débordements.
Timer->Timer->PSC = Timer->PSC - 1; // Valeur du prescaler
Timer->Timer->ARR = Timer->ARR - 1; // Valeur de l'autoreload -> Quand cette valeur est atteinte le timer est réinitialisé
//Timer->Timer->CR1 |= TIM_CR1_ARPE; // Active "Autoreload preload" pour prendre en compte immédiatement les modifications de la valeur de l'autoreload (ARR) lors du prochain cycle de Timer -> Utile pour PWM Variable
}
void MyTimer_Start(MyTimer_Struct_TypeDef *Timer)
{
Timer->Timer->CR1 |= TIM_CR1_CEN; // Démarre le Timer
}
void MyTimer_Stop(MyTimer_Struct_TypeDef *Timer)
{
Timer->Timer->CR1 &= ~TIM_CR1_CEN; // Arrête le Timer
}
void MyTimer_EnableInterrupt(MyTimer_Struct_TypeDef *Timer) {
Timer->Timer->DIER |= TIM_DIER_UIE; // Active l'interruption "Update" du Timer
NVIC->ISER[Timer->IRQn / 32] = (1 << Timer->IRQn); // Pour que ce soit générique : On divise IRQn par 32 pour avoir le ISER[] correspondant. On fait également le modulo 32 de IRQn pour avoir un nombre entre 0 et 31 correspondant au setting
}
void MyTimer_SetPriority(MyTimer_Struct_TypeDef *Timer, uint8_t priority) {
NVIC->IP[Timer->IRQn] = (priority << 4); // Décalé vers la gauche de 4 selon la datasheet voir p125
}
void MyTimer_ConfigurePWM(MyTimer_Struct_TypeDef *Timer, uint16_t duty_cycle) { // ducy_cycle en %
// Configuration du PWM
Timer->Timer->CCMR1 |= TIM_CCMR1_OC1M_1 | TIM_CCMR1_OC1M_2; // Mode PWM1 sur le canal 1 (CC1)
Timer->Timer->CCER |= TIM_CCER_CC1E; // Activation du canal 1 (CC1)
// Configuration du registre CCR1 avec la valeur du rapport cyclique
Timer->Timer->CCR1 = (duty_cycle * Timer->ARR) / 100;
// MOE
}