您的位置:首页 > 其它

stm32f10x基本定时器驱动

2015-04-29 19:17 363 查看
/******************************************************************************

Copyright (C), 2001-2011, DCN Co., Ltd.

******************************************************************************
File Name     : sys_tim.c
Version       : Initial Draft
Author        : Hui.Liu
Created       : 2015/4/21
Last Modified :
Description   : sys_tim.c
Function List :
History       :
1.Date        : 2015/4/21
Author      : Hui.Liu
Modification: Created file

******************************************************************************/

#include "stm32f10x.h"
#include "sys_tim.h"

#define ENTER_INTERRUPT()
#define EXIT_INTERRUPT()

typedef struct
{
TIM_TypeDef *tim;
uint32_t    RCC_Clk;
uint16_t    IRQn;
uint8_t     PreemptionPriority;
uint8_t     SubPriority;
} TIM_STRUCT;

void (*TIM_Interrupt[4])(void) =
{
(void *)0,
(void *)0,
(void *)0,
(void *)0,
};

const TIM_STRUCT TIMx[4] =
{
TIM1,   RCC_APB2Periph_TIM1,    TIM1_UP_IRQn,   TIM1_PreemptionPriority,    TIM1_SubPriority,
TIM2,   RCC_APB1Periph_TIM2,    TIM2_IRQn,      TIM2_PreemptionPriority,    TIM2_SubPriority,
TIM3,   RCC_APB1Periph_TIM3,    TIM3_IRQn,      TIM3_PreemptionPriority,    TIM3_SubPriority,
TIM4,   RCC_APB1Periph_TIM4,    TIM4_IRQn,      TIM4_PreemptionPriority,    TIM4_SubPriority,
};

void sys_timInit(TIM_ENUM TIM_x, uint16_t Prescaler, uint16_t Period, void(*CallBack)(void))
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;
NVIC_InitTypeDef NVIC_InitStruct;

if(TIMx[TIM_x].tim == TIM1)
{
RCC_APB2PeriphClockCmd(TIMx[TIM_x].RCC_Clk, ENABLE);
}
else
{
RCC_APB1PeriphClockCmd(TIMx[TIM_x].RCC_Clk, ENABLE);
}
TIM_TimeBaseInitStruct.TIM_Prescaler = Prescaler ? Prescaler - 1 : 0;
TIM_TimeBaseInitStruct.TIM_Period = Period ? Period - 1 : 0;
TIM_TimeBaseInitStruct.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInitStruct.TIM_ClockDivision = 0;
TIM_TimeBaseInitStruct.TIM_RepetitionCounter = 0;
TIM_TimeBaseInit(TIMx[TIM_x].tim, &TIM_TimeBaseInitStruct);

NVIC_InitStruct.NVIC_IRQChannel = TIMx[TIM_x].IRQn;
NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = TIMx[TIM_x].PreemptionPriority;
NVIC_InitStruct.NVIC_IRQChannelSubPriority = TIMx[TIM_x].SubPriority;
NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStruct);

TIM_Interrupt[TIM_x] = CallBack;

TIM_ITConfig(TIMx[TIM_x].tim , TIM_IT_Update, ENABLE);

TIM_Cmd(TIMx[TIM_x].tim, DISABLE);
}

void sys_timOpen(TIM_ENUM TIM_x)
{
TIM_ClearFlag(TIMx[TIM_x].tim, TIM_IT_Update);
TIM_Cmd(TIMx[TIM_x].tim, ENABLE);
}
void sys_timClose(TIM_ENUM TIM_x)
{
TIM_Cmd(TIMx[TIM_x].tim, DISABLE);
}

void TIM_UpdateHandler(TIM_ENUM TIM_x)
{
if(TIM_GetITStatus(TIMx[TIM_x].tim, TIM_IT_Update) != RESET)
{
TIM_ClearITPendingBit(TIMx[TIM_x].tim, TIM_IT_Update);
if(TIM_Interrupt[TIM_x] != (void *)0)
{
(*TIM_Interrupt[TIM_x])();
}
}
}
#ifdef TIM_1_ENABLE
void TIM1_UP_IRQHandler(void)
{
ENTER_INTERRUPT();
TIM_UpdateHandler(TIM_1);
EXIT_INTERRUPT();
}
#endif

#ifdef TIM_2_ENABLE
void TIM2_IRQHandler(void)
{
ENTER_INTERRUPT();
TIM_UpdateHandler(TIM_2);
EXIT_INTERRUPT();
}
#endif

#ifdef TIM_3_ENABLE
void TIM3_IRQHandler(void)
{
ENTER_INTERRUPT();
TIM_UpdateHandler(TIM_3);
EXIT_INTERRUPT();
}
#endif

#ifdef TIM_4_ENABLE
void TIM4_IRQHandler(void)
{
ENTER_INTERRUPT();
TIM_UpdateHandler(TIM_4);
EXIT_INTERRUPT();
}
#endif
<pre name="code" class="cpp">/******************************************************************************Copyright (C), 2001-2011, DCN Co., Ltd.******************************************************************************File Name     : sys_tim.hVersion       : Initial DraftAuthor        : Hui.LiuCreated       : 2015/4/21Last Modified :Description   : sys_tim.c header fileFunction List :History       :1.Date        : 2015/4/21Author      : Hui.LiuModification: Created file******************************************************************************/#ifndef __SYS_TIM_H__#define __SYS_TIM_H__/*示例:void LED1(void){LED_1 = !LED_1;}int main(void){sys_timInit(TIM_4, 72, 1000, LED1);sys_timOpen(TIM_4);while(1){}return 0;}*/typedef enum{TIM_1 = 0,TIM_2,TIM_3,TIM_4,}TIM_ENUM;/*TIM 使能配置*///#define TIM_1_ENABLE//#define TIM_2_ENABLE//#define TIM_3_ENABLE#define TIM_4_ENABLE/*TIM 优先级配置*/#define TIM1_PreemptionPriority        (uint8_t)1#define TIM1_SubPriority               (uint8_t)1#define TIM2_PreemptionPriority        (uint8_t)1#define TIM2_SubPriority               (uint8_t)1#define TIM3_PreemptionPriority        (uint8_t)1#define TIM3_SubPriority               (uint8_t)1#define TIM4_PreemptionPriority        (uint8_t)1#define TIM4_SubPriority               (uint8_t)1void sys_timInit(TIM_ENUM TIM_x, uint16_t Prescaler, uint16_t Period, void(*CallBack)(void));void sys_timOpen(TIM_ENUM TIM_x);void sys_timClose(TIM_ENUM TIM_x);#endif

                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  stm32 tim 库函数