#include "Driver_Timer.h" #include "stm32f10x.h" #include "stdio.h" /* Timer init function */ void MyTimer_Base_Init(MyTimer_Struct_TypeDef * Timer) { /* Reset the selected Timer */ if(Timer->Timer == TIM1) { RCC->APB2ENR |= RCC_APB2ENR_TIM1EN; } 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; } Timer->Timer->PSC = Timer->PSC; Timer->Timer->ARR = Timer->ARR; } /* Start function */ void MyTimer_Start(MyTimer_Struct_TypeDef * Timer) { Timer->Timer->CR1 |= TIM_CR1_CEN; } /* Stop function*/ void MyTimer_Stop(MyTimer_Struct_TypeDef * Timer) { Timer->Timer->CR1 &= ~TIM_CR1_CEN; } // Note : PWM Tested on PA0 /*Configuration PWM*/ void MyTimer_ConfigurePWM(MyTimer_Struct_TypeDef *Timer, uint8_t channel, uint16_t duty_cycle) { uint16_t CCR_Value = (duty_cycle * TIM2->ARR) / 100; // Configurer le Channel if (Timer->channel == 1) { Timer->Timer->CCMR1 = TIM_CCMR1_OC1M_2 | TIM_CCMR1_OC1M_1; Timer->Timer->CCMR1 |= TIM_CCMR1_OC1PE; // activer la pr�charge du registre de comparaison Timer->Timer->CCER |= TIM_CCER_CC1E; Timer->Timer->CCR1 = CCR_Value; } else if (Timer->channel == 2) { Timer->Timer->CCMR1 = TIM_CCMR1_OC2M_2 | TIM_CCMR1_OC2M_1; Timer->Timer->CCMR1 |= TIM_CCMR1_OC2PE; // activer la pr�charge du registre de comparaison Timer->Timer->CCER |= TIM_CCER_CC2E; Timer->Timer->CCR2 = CCR_Value; } else if (Timer->channel == 3) { Timer->Timer->CCMR2 = TIM_CCMR2_OC3M_2 | TIM_CCMR2_OC3M_1; Timer->Timer->CCMR2 |= TIM_CCMR2_OC3PE; // activer la pr�charge du registre de comparaison Timer->Timer->CCER |= TIM_CCER_CC3E; Timer->Timer->CCER &= ~TIM_CCER_CC3P; Timer->Timer->CCR3 = CCR_Value; } else if (Timer->channel == 4) { Timer->Timer->CCMR2 = TIM_CCMR2_OC4M_2 | TIM_CCMR2_OC4M_1; Timer->Timer->CCMR2 |= TIM_CCMR2_OC4PE; // activer la pr�charge du registre de comparaison Timer->Timer->CCER |= TIM_CCER_CC4E; Timer->Timer->CCR4 = CCR_Value; } } // Utiliser le TIM4 void MyTimer_ConfigureEncoder(MyTimer_Struct_TypeDef *Timer) { Timer->Timer->PSC = 0; // Configurer le prescaler à 0 (pour diviser l'horloge de base de 72 MHz par 1) Timer->Timer->ARR = 359; // Configurer la valeur maximale du compteur (pour éviter les problèmes de débordement) Timer->Timer->CCMR1 |= TIM_CCMR1_CC1S_0; Timer->Timer->CCMR1 |= TIM_CCMR1_CC2S_0; Timer->Timer->CCER &= ~TIM_CCER_CC1P; Timer->Timer->CCMR1 &= ~(TIM_CCMR1_IC1F_0 | TIM_CCMR1_IC1F_1 | TIM_CCMR1_IC1F_2 | TIM_CCMR1_IC1F_3); Timer->Timer->CCER &= ~TIM_CCER_CC2P; Timer->Timer->CCMR1 &= ~(TIM_CCMR1_IC2F_0 | TIM_CCMR1_IC2F_1 | TIM_CCMR1_IC2F_2 | TIM_CCMR1_IC2F_3); Timer->Timer->SMCR |= TIM_SMCR_SMS_0 | TIM_SMCR_SMS_1; // activer la clock pour le port GPIOC RCC->APB2ENR |= RCC_APB2ENR_IOPCEN; // configurer PC3 en mode entrée avec une pull-up GPIOC->CRL &= ~(GPIO_CRL_MODE3 | GPIO_CRL_CNF3); GPIOC->CRL |= GPIO_CRL_CNF3_1 | GPIO_CRL_MODE3_0; // configurer l'interruption pour PC3 en mode bord montant EXTI->IMR |= EXTI_IMR_MR3; EXTI->RTSR |= EXTI_RTSR_TR3; // configurer la priorité de l'interruption NVIC_SetPriority(EXTI3_IRQn, 1); // activer l'interruption NVIC_EnableIRQ(EXTI3_IRQn); } void Bug (void) { while(1); } void (*TIM2_fx) (void) = &Bug; void (*TIM3_fx) (void) = &Bug; void (*TIM4_fx) (void) = &Bug; /* Interrupt function */ void MyTimer_ActiveIT (TIM_TypeDef * Timer, char Prio, void (*IT_function)(void)) { Timer->DIER |= TIM_DIER_UIE; if(Timer == TIM1) { } if(Timer == TIM2) { NVIC_EnableIRQ(TIM2_IRQn); NVIC_SetPriority(TIM2_IRQn, Prio); TIM2_fx = IT_function; } if(Timer == TIM3) { NVIC_EnableIRQ(TIM3_IRQn); NVIC_SetPriority(TIM3_IRQn, Prio); TIM3_fx = IT_function; } if(Timer == TIM4) { NVIC_EnableIRQ(TIM4_IRQn); NVIC_SetPriority(TIM4_IRQn, Prio); TIM4_fx = IT_function; } } void TIM2_IRQHandler (void) { TIM2->SR &= ~TIM_SR_UIF; (*TIM2_fx)(); } void TIM3_IRQHandler (void) { TIM3->SR &= ~TIM_SR_UIF; (*TIM3_fx)(); } void TIM4_IRQHandler (void) { TIM3->SR &= ~TIM_SR_UIF; (*TIM4_fx)(); } int seed(int a) { return a = 2; } void EXTI3_IRQHandler(void) { int a = seed(a); }