voilier-team-1/driver/timer.c

194 lines
3.4 KiB
C
Raw Normal View History

#include "timer.h"
#include "gpio.h"
void plantage(void) {
while(1);
}
void (*IT_Tim1) (void) = plantage;
void (*IT_Tim2) (void) = plantage;
void (*IT_Tim3) (void) = plantage;
void (*IT_Tim4) (void) = plantage;
void MyTimer_Base_Init(MyTimer_Struct_Typedef * Timer) {
if ((Timer->Timer) == TIM1)
RCC->APB2ENR |= RCC_APB2ENR_TIM1EN;
if ((Timer->Timer) == TIM2)
RCC->APB1ENR |= RCC_APB1ENR_TIM2EN;
if ((Timer->Timer) == TIM3)
RCC->APB1ENR |= RCC_APB1ENR_TIM3EN;
if ((Timer->Timer) == TIM4)
RCC->APB1ENR |= RCC_APB1ENR_TIM4EN;
Timer->Timer->PSC = Timer->PSC;
Timer->Timer->ARR = Timer->ARR;
}
void MyTimer_ActiveIT(TIM_TypeDef * Timer, char Prio, void (*IT_function) (void)) {
Timer->DIER |= TIM_DIER_UIE;
if (Timer == TIM2) {
NVIC_EnableIRQ(TIM1_BRK_IRQn);
NVIC_SetPriority(TIM1_BRK_IRQn, Prio);
IT_Tim1 = IT_function;
}
if (Timer == TIM2) {
NVIC_EnableIRQ(TIM2_IRQn);
NVIC_SetPriority(TIM2_IRQn, Prio);
IT_Tim2 = IT_function;
}
if (Timer == TIM3) {
NVIC_EnableIRQ(TIM3_IRQn);
NVIC_SetPriority(TIM3_IRQn, Prio);
IT_Tim3 = IT_function;
}
if (Timer == TIM4) {
NVIC_EnableIRQ(TIM4_IRQn);
NVIC_SetPriority(TIM4_IRQn, Prio);
IT_Tim4 = IT_function;
}
}
void TIM1_IRQHandler(void) {
TIM1->SR &= ~TIM_SR_UIF;
(*IT_Tim1)();
}
void TIM2_IRQHandler(void) {
TIM2->SR &= ~TIM_SR_UIF;
(*IT_Tim2)();
}
void TIM3_IRQHandler(void) {
TIM3->SR &= ~TIM_SR_UIF;
(*IT_Tim3)();
}
void TIM4_IRQHandler(void) {
TIM4->SR &= ~TIM_SR_UIF;
(*IT_Tim4)();
}
void MyTimer_PWM(TIM_TypeDef * Timer ,char Channel)
{
MyGPIO_Struct_TypeDef PWM_OUT;
PWM_OUT.GPIO_Conf = AltOut_Ppull;
switch (Channel) {
case 1:
case 2:
Timer->CCMR1 &= ~TIM_CCMR1_OC1M_0;
Timer->CCMR1 |= (TIM_CCMR1_OC1M_1| TIM_CCMR1_OC1M_2);
break;
case 3:
case 4:
Timer->CCMR2 &= ~TIM_CCMR1_OC1M_0;
Timer->CCMR2 |= (TIM_CCMR1_OC1M_1| TIM_CCMR1_OC1M_2);
break;
}
Timer->CCER |= (TIM_CCER_CC1E << (4*(Channel-1)));
if(Timer == TIM1)
{
TIM1->BDTR |= 0x8000;
PWM_OUT.GPIO = GPIOA;
switch (Channel) {
case 1:
PWM_OUT.GPIO_Pin = 8;
break;
case 2:
PWM_OUT.GPIO_Pin = 9;
break;
case 3:
PWM_OUT.GPIO_Pin = 10;
break;
case 4:
PWM_OUT.GPIO_Pin = 11;
break;
}
}
if(Timer == TIM2)
{
PWM_OUT.GPIO = GPIOA;
switch (Channel) {
case 1:
PWM_OUT.GPIO_Pin = 0;
break;
case 2:
PWM_OUT.GPIO_Pin = 1;
break;
case 3:
PWM_OUT.GPIO_Pin = 2;
break;
case 4:
PWM_OUT.GPIO_Pin = 3;
break;
}
}
if(Timer == TIM3)
{
switch (Channel) {
case 1:
PWM_OUT.GPIO = GPIOA;
PWM_OUT.GPIO_Pin = 6;
break;
case 2:
PWM_OUT.GPIO = GPIOA;
PWM_OUT.GPIO_Pin = 7;
break;
case 3:
PWM_OUT.GPIO = GPIOB;
PWM_OUT.GPIO_Pin = 0;
break;
case 4:
PWM_OUT.GPIO = GPIOB;
PWM_OUT.GPIO_Pin = 1;
break;
}
}
if(Timer == TIM4)
{
PWM_OUT.GPIO = GPIOB;
switch (Channel) {
case 1:
PWM_OUT.GPIO_Pin = 6;
break;
case 2:
PWM_OUT.GPIO_Pin = 7;
break;
case 3:
PWM_OUT.GPIO_Pin = 8;
break;
case 4:
PWM_OUT.GPIO_Pin = 9;
break;
}
}
MyGPIO_Init(&PWM_OUT);
}
void MyTimer_DutyCycle(TIM_TypeDef * Timer, char Channel, unsigned int DutyCycle)
{
unsigned int RC;
RC = ((Timer->ARR)*(DutyCycle)/10000);
switch (Channel) {
case 1:
Timer->CCR1 = RC;
break;
case 2:
Timer->CCR2 = RC;
break;
case 3:
Timer->CCR3 = RC;
break;
case 4:
Timer->CCR4 = RC;
break;
}
}