2023-03-22 15:20:38 +01:00
|
|
|
#include "timer.h"
|
|
|
|
#include "gpio.h"
|
|
|
|
|
|
|
|
void plantage(void) {
|
|
|
|
while(1);
|
|
|
|
}
|
2023-04-04 14:36:29 +02:00
|
|
|
|
2023-03-22 15:20:38 +01:00
|
|
|
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);
|
|
|
|
}
|
|
|
|
|
2023-04-04 14:36:29 +02:00
|
|
|
void MyTimer_DutyCycle(TIM_TypeDef * Timer, char Channel, unsigned int DutyCycle)
|
2023-03-22 15:20:38 +01:00
|
|
|
{
|
|
|
|
unsigned int RC;
|
2023-04-04 14:36:29 +02:00
|
|
|
RC = ((Timer->ARR)*(DutyCycle)/10000);
|
2023-03-22 15:20:38 +01:00
|
|
|
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;
|
|
|
|
}
|
2023-03-31 12:18:42 +02:00
|
|
|
}
|