114 lines
2.6 KiB
C
114 lines
2.6 KiB
C
#include "stm32f10x.h"
|
|
#include "Nucleo.h"
|
|
|
|
//REMEMBER TO ENALBLE TIMERS
|
|
//EXAMPLES
|
|
//RCC -> APB1ENR |= RCC_APB1ENR_TIM2EN | RCC_APB1ENR_TIM3EN; // Enable TIM2
|
|
//RCC->APB2ENR |= RCC_APB2ENR_TIM1EN; // Enable TIM1
|
|
|
|
void MyTimer_Base_Init( TIM_TypeDef * Timer , unsigned short ValARR , unsigned short ValPSC ) {
|
|
Timer -> PSC=(ValPSC);
|
|
Timer-> ARR = (ValARR);
|
|
|
|
Timer->EGR |= TIM_EGR_UG;
|
|
};
|
|
|
|
|
|
static void (*p_IT_functions[4])(void);
|
|
|
|
void MyTimer_ActiveIT(TIM_TypeDef *Timer, char Prio,void(*IT_function)(void)) {
|
|
//Enable interruption requisition
|
|
Timer->DIER |= TIM_DIER_UIE; // Update interrupt enable
|
|
|
|
//Id the interruption timer routine
|
|
IRQn_Type IRQn;
|
|
|
|
int timer_index = -1; // Indice pour notre array des pointeurs
|
|
if (Timer == TIM2) {
|
|
IRQn = TIM2_IRQn;
|
|
timer_index = 0;
|
|
} else if (Timer == TIM3) {
|
|
IRQn = TIM3_IRQn;
|
|
timer_index = 1;
|
|
} else if (Timer == TIM4) {
|
|
IRQn = TIM4_IRQn;
|
|
timer_index = 2;
|
|
}
|
|
// Keep the pointer of the valid timer function
|
|
if (timer_index != -1) {
|
|
p_IT_functions[timer_index] = IT_function; // index the function
|
|
} else {
|
|
return; // Timer invalid
|
|
}
|
|
|
|
// set interruption priority
|
|
NVIC_SetPriority(IRQn, Prio);
|
|
|
|
// Enable routine
|
|
NVIC_EnableIRQ(IRQn);
|
|
};
|
|
|
|
|
|
void TIM2_IRQHandler(void) {
|
|
// Clean flag
|
|
TIM2->SR &= ~TIM_SR_UIF; // Drapeau d'interuption
|
|
//Call function
|
|
if (p_IT_functions[0] != 0) {
|
|
p_IT_functions[0](); // Execute fonction
|
|
}
|
|
// TogglePin(GPIOA, 5); // Sans utiliser l'array de pointeurs
|
|
};
|
|
void TIM3_IRQHandler(void) {
|
|
// Clean flag
|
|
TIM3->SR &= ~TIM_SR_UIF;
|
|
//Call function
|
|
if (p_IT_functions[1] != 0) {
|
|
p_IT_functions[1](); // Execute function
|
|
}
|
|
};
|
|
void TIM4_IRQHandler(void) {
|
|
// Clean flag
|
|
TIM4->SR &= ~TIM_SR_UIF;
|
|
//Call function
|
|
if (p_IT_functions[2] != 0) {
|
|
p_IT_functions[2](); // Execute function
|
|
}
|
|
};
|
|
|
|
// IT PWM
|
|
void TIM1_CC_IRQHandler(void) {
|
|
// Clean flag
|
|
TIM1 -> DIER &= ~TIM_DIER_CC1IE;
|
|
|
|
//Set bit
|
|
|
|
GPIOA -> ODR |= (0x1 << 8);
|
|
|
|
};
|
|
|
|
void TIM1_UP_IRQHandler(void) {
|
|
// Clean flag
|
|
TIM1-> DIER &= ~TIM_DIER_TIE;
|
|
|
|
//Reset bit
|
|
GPIOA -> ODR &= ~(0x1 << 8);
|
|
|
|
};
|
|
|
|
|
|
void EnableTimer(TIM_TypeDef *Timer){
|
|
if(Timer == TIM2){
|
|
RCC -> APB1ENR |= RCC_APB1ENR_TIM2EN;
|
|
}
|
|
else if(Timer == TIM3){
|
|
RCC -> APB1ENR |= RCC_APB1ENR_TIM3EN;
|
|
}
|
|
else if(Timer == TIM4){
|
|
RCC -> APB1ENR |= RCC_APB1ENR_TIM4EN;
|
|
}
|
|
else if(Timer == TIM1){
|
|
RCC->APB2ENR |= RCC_APB2ENR_TIM1EN;
|
|
}
|
|
else{
|
|
}
|
|
}
|