📄 stm32f10x_tim.c
字号:
/******************** (C) COPYRIGHT 2008 STMicroelectronics ********************
* 文件名称: stm32f10x_tim.c
* 程序作者: MCD Application Team
* 程序版本: V2.0.2
* 编制日期: 07/11/2008
* 功能描述: 这个文件提供了所有TIM的固件函数.
* 本文汉化: 孙可 2008.08.15
********************************************************************************
* 目前的固件的目的是为客户提供关于他们的产品的编码信息以便于节省他们时间。
* 结果, 意法半导体将不会为此承担任何直接,间接或相应的损害赔偿方面的任何索赔要求,
* 例如固件或使用所作的客户编码中他涉嫌包含与他们的相关产品的信息。
*******************************************************************************/
/* 包涵的文件 ------------------------------------------------------------------*/
#include "stm32f10x_tim.h"
#include "stm32f10x_rcc.h"
/* 自用类型 -----------------------------------------------------------*/
/* 自用定义 ------------------------------------------------------------*/
/* ---------------------- TIM registers bit mask ------------------------ */
#define CR1_CEN_Set ((u16)0x0001)
#define CR1_CEN_Reset ((u16)0x03FE)
#define CR1_UDIS_Set ((u16)0x0002)
#define CR1_UDIS_Reset ((u16)0x03FD)
#define CR1_URS_Set ((u16)0x0004)
#define CR1_URS_Reset ((u16)0x03FB)
#define CR1_OPM_Reset ((u16)0x03F7)
#define CR1_CounterMode_Mask ((u16)0x038F)
#define CR1_ARPE_Set ((u16)0x0080)
#define CR1_ARPE_Reset ((u16)0x037F)
#define CR1_CKD_Mask ((u16)0x00FF)
#define CR2_CCPC_Set ((u16)0x0001)
#define CR2_CCPC_Reset ((u16)0xFFFE)
#define CR2_CCUS_Set ((u16)0x0004)
#define CR2_CCUS_Reset ((u16)0xFFFB)
#define CR2_CCDS_Set ((u16)0x0008)
#define CR2_CCDS_Reset ((u16)0xFFF7)
#define CR2_MMS_Mask ((u16)0xFF8F)
#define CR2_TI1S_Set ((u16)0x0080)
#define CR2_TI1S_Reset ((u16)0xFF7F)
#define CR2_OIS1_Reset ((u16)0x7EFF)
#define CR2_OIS1N_Reset ((u16)0x7DFF)
#define CR2_OIS2_Reset ((u16)0x7BFF)
#define CR2_OIS2N_Reset ((u16)0x77FF)
#define CR2_OIS3_Reset ((u16)0x6FFF)
#define CR2_OIS3N_Reset ((u16)0x5FFF)
#define CR2_OIS4_Reset ((u16)0x3FFF)
#define SMCR_SMS_Mask ((u16)0xFFF8)
#define SMCR_ETR_Mask ((u16)0x00FF)
#define SMCR_TS_Mask ((u16)0xFF8F)
#define SMCR_MSM_Reset ((u16)0xFF7F)
#define SMCR_ECE_Set ((u16)0x4000)
#define CCMR_CC13S_Mask ((u16)0xFFFC)
#define CCMR_CC24S_Mask ((u16)0xFCFF)
#define CCMR_TI13Direct_Set ((u16)0x0001)
#define CCMR_TI24Direct_Set ((u16)0x0100)
#define CCMR_OC13FE_Reset ((u16)0xFFFB)
#define CCMR_OC24FE_Reset ((u16)0xFBFF)
#define CCMR_OC13PE_Reset ((u16)0xFFF7)
#define CCMR_OC24PE_Reset ((u16)0xF7FF)
#define CCMR_OC13M_Mask ((u16)0xFF8F)
#define CCMR_OC24M_Mask ((u16)0x8FFF)
#define CCMR_OC13CE_Reset ((u16)0xFF7F)
#define CCMR_OC24CE_Reset ((u16)0x7FFF)
#define CCMR_IC13PSC_Mask ((u16)0xFFF3)
#define CCMR_IC24PSC_Mask ((u16)0xF3FF)
#define CCMR_IC13F_Mask ((u16)0xFF0F)
#define CCMR_IC24F_Mask ((u16)0x0FFF)
#define CCMR_Offset ((u16)0x0018)
#define CCER_CCE_Set ((u16)0x0001)
#define CCER_CCNE_Set ((u16)0x0004)
#define CCER_CC1P_Reset ((u16)0xFFFD)
#define CCER_CC2P_Reset ((u16)0xFFDF)
#define CCER_CC3P_Reset ((u16)0xFDFF)
#define CCER_CC4P_Reset ((u16)0xDFFF)
#define CCER_CC1NP_Reset ((u16)0xFFF7)
#define CCER_CC2NP_Reset ((u16)0xFF7F)
#define CCER_CC3NP_Reset ((u16)0xF7FF)
#define CCER_CC1E_Set ((u16)0x0001)
#define CCER_CC1E_Reset ((u16)0xFFFE)
#define CCER_CC1NE_Reset ((u16)0xFFFB)
#define CCER_CC2E_Set ((u16)0x0010)
#define CCER_CC2E_Reset ((u16)0xFFEF)
#define CCER_CC2NE_Reset ((u16)0xFFBF)
#define CCER_CC3E_Set ((u16)0x0100)
#define CCER_CC3E_Reset ((u16)0xFEFF)
#define CCER_CC3NE_Reset ((u16)0xFBFF)
#define CCER_CC4E_Set ((u16)0x1000)
#define CCER_CC4E_Reset ((u16)0xEFFF)
#define BDTR_MOE_Set ((u16)0x8000)
#define BDTR_MOE_Reset ((u16)0x7FFF)
/* 自用宏 -------------------------------------------------------------*/
/* 自用变量 ---------------------------------------------------------*/
/* 自用函数原型 -----------------------------------------------*/
static void TI1_Config(TIM_TypeDef* TIMx, u16 TIM_ICPolarity, u16 TIM_ICSelection,
u16 TIM_ICFilter);
static void TI2_Config(TIM_TypeDef* TIMx, u16 TIM_ICPolarity, u16 TIM_ICSelection,
u16 TIM_ICFilter);
static void TI3_Config(TIM_TypeDef* TIMx, u16 TIM_ICPolarity, u16 TIM_ICSelection,
u16 TIM_ICFilter);
static void TI4_Config(TIM_TypeDef* TIMx, u16 TIM_ICPolarity, u16 TIM_ICSelection,
u16 TIM_ICFilter);
/* 自用函数 ---------------------------------------------------------*/
/*******************************************************************************
* 函数名称: TIM_DeInit
* 功能描述: 重置TIMx外设寄存器为其默认复位值.
* 输入参数: TIMx:此处x可以是1到8以选择外设.
* 输出参数: 无
* 返回参数: 无
*******************************************************************************/
void TIM_DeInit(TIM_TypeDef* TIMx)
{
/* Check the parameters [检查参数]*/
assert_param(IS_TIM_ALL_PERIPH(TIMx));
switch (*(u32*)&TIMx)
{
case TIM1_BASE:
RCC_APB2PeriphResetCmd(RCC_APB2Periph_TIM1, ENABLE);
RCC_APB2PeriphResetCmd(RCC_APB2Periph_TIM1, DISABLE);
break;
case TIM2_BASE:
RCC_APB1PeriphResetCmd(RCC_APB1Periph_TIM2, ENABLE);
RCC_APB1PeriphResetCmd(RCC_APB1Periph_TIM2, DISABLE);
break;
case TIM3_BASE:
RCC_APB1PeriphResetCmd(RCC_APB1Periph_TIM3, ENABLE);
RCC_APB1PeriphResetCmd(RCC_APB1Periph_TIM3, DISABLE);
break;
case TIM4_BASE:
RCC_APB1PeriphResetCmd(RCC_APB1Periph_TIM4, ENABLE);
RCC_APB1PeriphResetCmd(RCC_APB1Periph_TIM4, DISABLE);
break;
case TIM5_BASE:
RCC_APB1PeriphResetCmd(RCC_APB1Periph_TIM5, ENABLE);
RCC_APB1PeriphResetCmd(RCC_APB1Periph_TIM5, DISABLE);
break;
case TIM6_BASE:
RCC_APB1PeriphResetCmd(RCC_APB1Periph_TIM6, ENABLE);
RCC_APB1PeriphResetCmd(RCC_APB1Periph_TIM6, DISABLE);
break;
case TIM7_BASE:
RCC_APB1PeriphResetCmd(RCC_APB1Periph_TIM7, ENABLE);
RCC_APB1PeriphResetCmd(RCC_APB1Periph_TIM7, DISABLE);
break;
case TIM8_BASE:
RCC_APB2PeriphResetCmd(RCC_APB2Periph_TIM8, ENABLE);
RCC_APB2PeriphResetCmd(RCC_APB2Periph_TIM8, DISABLE);
break;
default:
break;
}
}
/*******************************************************************************
* 函数名称: TIM_TimeBaseInit
* 功能描述: 根据TIM_TimeBaseInitStruct中的特定参数初始化某个TIM的时间基单元.
* 输入参数: (1)TIMx:此处x可以是1,2,3,4,5或8以选择外设.
* (2)TIM_BaseInitStruct:指向一个包含TIM时间基配置信息的TIM_BaseInitTypeDef结构的指针..
* 输出参数: 无
* 返回参数: 无
*******************************************************************************/
void TIM_TimeBaseInit(TIM_TypeDef* TIMx, TIM_TimeBaseInitTypeDef* TIM_TimeBaseInitStruct)
{
/* Check the parameters [检查参数]*/
assert_param(IS_TIM_123458_PERIPH(TIMx));
assert_param(IS_TIM_COUNTER_MODE(TIM_TimeBaseInitStruct->TIM_CounterMode));
assert_param(IS_TIM_CKD_DIV(TIM_TimeBaseInitStruct->TIM_ClockDivision));
/* Select the Counter Mode and set the clock division [选择计数模式和设置时钟分频]*/
TIMx->CR1 &= CR1_CKD_Mask & CR1_CounterMode_Mask;
TIMx->CR1 |= (u32)TIM_TimeBaseInitStruct->TIM_ClockDivision |
TIM_TimeBaseInitStruct->TIM_CounterMode;
/* Set the Autoreload value [设置自动装载值]*/
TIMx->ARR = TIM_TimeBaseInitStruct->TIM_Period ;
/* Set the Prescaler value [设置预分频器值]*/
TIMx->PSC = TIM_TimeBaseInitStruct->TIM_Prescaler;
/* Generate an update event to reload the Prescaler value immediatly [产生一个更新事件立即重新装载预分频器值]*/
TIMx->EGR = TIM_PSCReloadMode_Immediate;
if (((*(u32*)&TIMx) == TIM1_BASE) || ((*(u32*)&TIMx) == TIM8_BASE))
{
/* Set the Repetition Counter value [设置重复计数器值]*/
TIMx->RCR = TIM_TimeBaseInitStruct->TIM_RepetitionCounter;
}
}
/*******************************************************************************
* 函数名称: TIM_OC1Init
* 功能描述: 根据TIM_OCInitStruct中的特定参数初始化TIMx通道1.
* 输入参数: (1)TIMx:此处x可以是1,2,3,4,5或8以选择外设.
* (2)TIM_OCInitStruct:指向一个包含特定TIMx外设的配置信息的TIM_OCInitTypeDef结构的指针.
* 输出参数: 无
* 返回参数: 无
*******************************************************************************/
void TIM_OC1Init(TIM_TypeDef* TIMx, TIM_OCInitTypeDef* TIM_OCInitStruct)
{
u16 tmpccmrx = 0, tmpccer = 0, tmpcr2 = 0;
/* Check the parameters [检查参数]*/
assert_param(IS_TIM_123458_PERIPH(TIMx));
assert_param(IS_TIM_OC_MODE(TIM_OCInitStruct->TIM_OCMode));
assert_param(IS_TIM_OUTPUT_STATE(TIM_OCInitStruct->TIM_OutputState));
assert_param(IS_TIM_OC_POLARITY(TIM_OCInitStruct->TIM_OCPolarity));
/* Disable the Channel 1: Reset the CC1E Bit [禁止通道1:复位CC1E位]*/
TIMx->CCER &= CCER_CC1E_Reset;
/* Get the TIMx CCER register value [取得TIMx 捕获/比较使能寄存器的寄存器值]*/
tmpccer = TIMx->CCER;
/* Get the TIMx CR2 register value [取得TIMx 控制2的寄存器值]*/
tmpcr2 = TIMx->CR2;
/* Get the TIMx CCMR1 register value [取得TIMx 捕获/比较模式寄存器1的寄存器值]*/
tmpccmrx = TIMx->CCMR1;
/* Reset the Output Compare Mode Bits [复位输出比较模式位]*/
tmpccmrx &= CCMR_OC13M_Mask;
/* Select the Output Compare Mode [选择输出比较模式位]*/
tmpccmrx |= TIM_OCInitStruct->TIM_OCMode;
/* Reset the Output Polarity level [复位输出极性级别]*/
tmpccer &= CCER_CC1P_Reset;
/* Set the Output Compare Polarity [设置输出比较极性]*/
tmpccer |= TIM_OCInitStruct->TIM_OCPolarity;
/* Set the Output State [设置输出状态]*/
tmpccer |= TIM_OCInitStruct->TIM_OutputState;
/* Set the Capture Compare Register value [设置捕获比较寄存器值]*/
TIMx->CCR1 = TIM_OCInitStruct->TIM_Pulse;
if((*(u32*)&TIMx == TIM1_BASE) || (*(u32*)&TIMx == TIM8_BASE))
{
assert_param(IS_TIM_OUTPUTN_STATE(TIM_OCInitStruct->TIM_OutputNState));
assert_param(IS_TIM_OCN_POLARITY(TIM_OCInitStruct->TIM_OCNPolarity));
assert_param(IS_TIM_OCNIDLE_STATE(TIM_OCInitStruct->TIM_OCNIdleState));
assert_param(IS_TIM_OCIDLE_STATE(TIM_OCInitStruct->TIM_OCIdleState));
/* Reset the Output N Polarity level [复位输出N极性等级]*/
tmpccer &= CCER_CC1NP_Reset;
/* Set the Output N Polarity [设置输出N极性]*/
tmpccer |= TIM_OCInitStruct->TIM_OCNPolarity;
/* Reset the Output N State [复位输出N状态]*/
tmpccer &= CCER_CC1NE_Reset;
/* Set the Output N State [设置输出N状态]*/
tmpccer |= TIM_OCInitStruct->TIM_OutputNState;
/* Reset the Ouput Compare and Output Compare N IDLE State [复位输出比较和输出比较N IDLE状态]*/
tmpcr2 &= CR2_OIS1_Reset;
tmpcr2 &= CR2_OIS1N_Reset;
/* Set the Output Idle state [设置输出IDLE状态]*/
tmpcr2 |= TIM_OCInitStruct->TIM_OCIdleState;
/* Set the Output N Idle state [设置输出N IDLE状态]*/
tmpcr2 |= TIM_OCInitStruct->TIM_OCNIdleState;
}
/* Write to TIMx CR2 [写TIMx配置寄存器2]*/
TIMx->CR2 = tmpcr2;
/* Write to TIMx CCMR1 [写TIMx捕获/比较模式寄存器1]*/
TIMx->CCMR1 = tmpccmrx;
/* Write to TIMx CCER [写TIMx捕获/比较使能寄存器]*/
TIMx->CCER = tmpccer;
}
/*******************************************************************************
* 函数名称: TIM_OC2Init
* 功能描述: 根据TIM_OCInitStruct中的特定参数初始化TIMx通道2。
* 输入参数: (1)TIMx:此处x可以是1,2,3,4,5或8以选择外设.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -