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
相关文章推荐
- STM32F10x 学习笔记10(基本定时器)
- STM32F10x 学习笔记10(基本定时器)
- STM32F10x 学习笔记之基本定时器
- STM32F10X便利的定时器C++驱动设计(基于基础库)
- STM32F10x 学习笔记10(基本定时器)
- Linux设备驱动——内核定时器
- linux驱动之定时器的使用
- android 电容屏(二):驱动调试之基本概念篇
- linux驱动由浅入深系列:usb子系统之一(域、包、事务、传输的基本概念)
- DDD领域驱动设计基本理论知识总结
- linux驱动基础开发1——linux 设备驱动基本概念
- 2010.11.20(基本定时器实验)
- Linux驱动学习笔记之一——高精度定时器(1)
- linux驱动由浅入深系列:驱动程序的基本结构概览之二(详解驱动注册过程)
- MongoDB学习笔记(二) 通过samus驱动实现基本数据操作
- 定时器的基本使用方法
- linux驱动开发要知道的那些知识(三)------container_of,定时器 及系统调用
- 测试驱动开发(tdd) 学习笔记(1)基本思想原则和术语
- 用内核定时器来实现的按键驱动代码分析以及测试代码