stm32f10x基本定时器驱动

来源:互联网 发布:windows mstsc 编辑:程序博客网 时间:2024/06/05 16:27
/******************************************************************************  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_ENABLEvoid TIM1_UP_IRQHandler(void){ENTER_INTERRUPT();TIM_UpdateHandler(TIM_1);EXIT_INTERRUPT();}#endif#ifdef TIM_2_ENABLEvoid TIM2_IRQHandler(void){ENTER_INTERRUPT();TIM_UpdateHandler(TIM_2);EXIT_INTERRUPT();}#endif#ifdef TIM_3_ENABLEvoid TIM3_IRQHandler(void){ENTER_INTERRUPT();TIM_UpdateHandler(TIM_3);EXIT_INTERRUPT();}#endif#ifdef TIM_4_ENABLEvoid 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.h  Version       : Initial Draft  Author        : Hui.Liu  Created       : 2015/4/21  Last Modified :  Description   : sys_tim.c header file  Function List :  History       :  1.Date        : 2015/4/21    Author      : Hui.Liu    Modification: 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



0 0
原创粉丝点击