📄 stm32f10x_tim.c
字号:
/**
******************************************************************************
* @文件 stm32f10x_tim.c
* @作者 MCD 应用程序组
* @版本 V3.1.0
* @日期 06/19/2009
* @简述 这个文件 提供所有 TIM 固件函数.
* @翻译 ANSON/sweet1985 Email:airanson110@126.com
* @日期 10/07/2009
******************************************************************************
* @复件
*
* 这个固件仅仅是提供给客户作为设计产品而编写程序的参考目的使客户节约时间。由于
* 客户使用本固件在开发产品编程上产生的结果意法半导体公司不承担任何直接的和间接
* 的责任,也不承担任何损害而引起的赔偿。
*
* <h2><center>&复制; 版权所有 2009 意法半导体公司</center></h2>
* 翻译版本仅供学习,如与英文原版有出入应以英文原版为准。
*/
/* 包含 ------------------------------------------------------------------*/
#include "stm32f10x_tim.h"
#include "stm32f10x_rcc.h"
/* 自用类型 --------------------------------------------------------------*/
/* 自用定义 --------------------------------------------------------------*/
/* ---------------------- TIM registers bit mask ------------------------ */
#define CR1_CEN_Set ((uint16_t)0x0001)
#define CR1_CEN_Reset ((uint16_t)0x03FE)
#define CR1_UDIS_Set ((uint16_t)0x0002)
#define CR1_UDIS_Reset ((uint16_t)0x03FD)
#define CR1_URS_Set ((uint16_t)0x0004)
#define CR1_URS_Reset ((uint16_t)0x03FB)
#define CR1_OPM_Reset ((uint16_t)0x03F7)
#define CR1_CounterMode_Mask ((uint16_t)0x038F)
#define CR1_ARPE_Set ((uint16_t)0x0080)
#define CR1_ARPE_Reset ((uint16_t)0x037F)
#define CR1_CKD_Mask ((uint16_t)0x00FF)
#define CR2_CCPC_Set ((uint16_t)0x0001)
#define CR2_CCPC_Reset ((uint16_t)0xFFFE)
#define CR2_CCUS_Set ((uint16_t)0x0004)
#define CR2_CCUS_Reset ((uint16_t)0xFFFB)
#define CR2_CCDS_Set ((uint16_t)0x0008)
#define CR2_CCDS_Reset ((uint16_t)0xFFF7)
#define CR2_MMS_Mask ((uint16_t)0xFF8F)
#define CR2_TI1S_Set ((uint16_t)0x0080)
#define CR2_TI1S_Reset ((uint16_t)0xFF7F)
#define CR2_OIS1_Reset ((uint16_t)0x7EFF)
#define CR2_OIS1N_Reset ((uint16_t)0x7DFF)
#define CR2_OIS2_Reset ((uint16_t)0x7BFF)
#define CR2_OIS2N_Reset ((uint16_t)0x77FF)
#define CR2_OIS3_Reset ((uint16_t)0x6FFF)
#define CR2_OIS3N_Reset ((uint16_t)0x5FFF)
#define CR2_OIS4_Reset ((uint16_t)0x3FFF)
#define SMCR_SMS_Mask ((uint16_t)0xFFF8)
#define SMCR_ETR_Mask ((uint16_t)0x00FF)
#define SMCR_TS_Mask ((uint16_t)0xFF8F)
#define SMCR_MSM_Reset ((uint16_t)0xFF7F)
#define SMCR_ECE_Set ((uint16_t)0x4000)
#define CCMR_CC13S_Mask ((uint16_t)0xFFFC)
#define CCMR_CC24S_Mask ((uint16_t)0xFCFF)
#define CCMR_TI13Direct_Set ((uint16_t)0x0001)
#define CCMR_TI24Direct_Set ((uint16_t)0x0100)
#define CCMR_OC13FE_Reset ((uint16_t)0xFFFB)
#define CCMR_OC24FE_Reset ((uint16_t)0xFBFF)
#define CCMR_OC13PE_Reset ((uint16_t)0xFFF7)
#define CCMR_OC24PE_Reset ((uint16_t)0xF7FF)
#define CCMR_OC13M_Mask ((uint16_t)0xFF8F)
#define CCMR_OC24M_Mask ((uint16_t)0x8FFF)
#define CCMR_OC13CE_Reset ((uint16_t)0xFF7F)
#define CCMR_OC24CE_Reset ((uint16_t)0x7FFF)
#define CCMR_IC13PSC_Mask ((uint16_t)0xFFF3)
#define CCMR_IC24PSC_Mask ((uint16_t)0xF3FF)
#define CCMR_IC13F_Mask ((uint16_t)0xFF0F)
#define CCMR_IC24F_Mask ((uint16_t)0x0FFF)
#define CCMR_Offset ((uint16_t)0x0018)
#define CCER_CCE_Set ((uint16_t)0x0001)
#define CCER_CCNE_Set ((uint16_t)0x0004)
#define CCER_CC1P_Reset ((uint16_t)0xFFFD)
#define CCER_CC2P_Reset ((uint16_t)0xFFDF)
#define CCER_CC3P_Reset ((uint16_t)0xFDFF)
#define CCER_CC4P_Reset ((uint16_t)0xDFFF)
#define CCER_CC1NP_Reset ((uint16_t)0xFFF7)
#define CCER_CC2NP_Reset ((uint16_t)0xFF7F)
#define CCER_CC3NP_Reset ((uint16_t)0xF7FF)
#define CCER_CC1E_Set ((uint16_t)0x0001)
#define CCER_CC1E_Reset ((uint16_t)0xFFFE)
#define CCER_CC1NE_Reset ((uint16_t)0xFFFB)
#define CCER_CC2E_Set ((uint16_t)0x0010)
#define CCER_CC2E_Reset ((uint16_t)0xFFEF)
#define CCER_CC2NE_Reset ((uint16_t)0xFFBF)
#define CCER_CC3E_Set ((uint16_t)0x0100)
#define CCER_CC3E_Reset ((uint16_t)0xFEFF)
#define CCER_CC3NE_Reset ((uint16_t)0xFBFF)
#define CCER_CC4E_Set ((uint16_t)0x1000)
#define CCER_CC4E_Reset ((uint16_t)0xEFFF)
#define BDTR_MOE_Set ((uint16_t)0x8000)
#define BDTR_MOE_Reset ((uint16_t)0x7FFF)
/* 自用宏 -------------------------------------------------------------*/
/* 自用变量 -----------------------------------------------------------*/
/* 自用函数原型 -------------------------------------------------------*/
static void TI1_Config(TIM_TypeDef* TIMx, uint16_t TIM_ICPolarity, uint16_t TIM_ICSelection,
uint16_t TIM_ICFilter);
static void TI2_Config(TIM_TypeDef* TIMx, uint16_t TIM_ICPolarity, uint16_t TIM_ICSelection,
uint16_t TIM_ICFilter);
static void TI3_Config(TIM_TypeDef* TIMx, uint16_t TIM_ICPolarity, uint16_t TIM_ICSelection,
uint16_t TIM_ICFilter);
static void TI4_Config(TIM_TypeDef* TIMx, uint16_t TIM_ICPolarity, uint16_t TIM_ICSelection,
uint16_t TIM_ICFilter);
/* 自用函数 -----------------------------------------------------------*/
/**
* @简述 将外设 TIMx 寄存器重设为缺省值.
* @参数 TIMx: 此处x可以是1到8以选择外设.
* @返回 没有
*/
void TIM_DeInit(TIM_TypeDef* TIMx)
{
/* 检查参数 */
assert_param(IS_TIM_ALL_PERIPH(TIMx));
if (TIMx == TIM1)
{
RCC_APB2PeriphResetCmd(RCC_APB2Periph_TIM1, ENABLE);
RCC_APB2PeriphResetCmd(RCC_APB2Periph_TIM1, DISABLE);
}
else if (TIMx == TIM2)
{
RCC_APB1PeriphResetCmd(RCC_APB1Periph_TIM2, ENABLE);
RCC_APB1PeriphResetCmd(RCC_APB1Periph_TIM2, DISABLE);
}
else if (TIMx == TIM3)
{
RCC_APB1PeriphResetCmd(RCC_APB1Periph_TIM3, ENABLE);
RCC_APB1PeriphResetCmd(RCC_APB1Periph_TIM3, DISABLE);
}
else if (TIMx == TIM4)
{
RCC_APB1PeriphResetCmd(RCC_APB1Periph_TIM4, ENABLE);
RCC_APB1PeriphResetCmd(RCC_APB1Periph_TIM4, DISABLE);
}
else if (TIMx == TIM5)
{
RCC_APB1PeriphResetCmd(RCC_APB1Periph_TIM5, ENABLE);
RCC_APB1PeriphResetCmd(RCC_APB1Periph_TIM5, DISABLE);
}
else if (TIMx == TIM6)
{
RCC_APB1PeriphResetCmd(RCC_APB1Periph_TIM6, ENABLE);
RCC_APB1PeriphResetCmd(RCC_APB1Periph_TIM6, DISABLE);
}
else if (TIMx == TIM7)
{
RCC_APB1PeriphResetCmd(RCC_APB1Periph_TIM7, ENABLE);
RCC_APB1PeriphResetCmd(RCC_APB1Periph_TIM7, DISABLE);
}
else
{
if (TIMx == TIM8)
{
RCC_APB2PeriphResetCmd(RCC_APB2Periph_TIM8, ENABLE);
RCC_APB2PeriphResetCmd(RCC_APB2Periph_TIM8, DISABLE);
}
}
}
/**
* @简述 根据 TIM_TimeBaseInitStruct 中指定的参数初始化 TIMx 的时间基数单位.
* @参数 TIMx: 这里 x 可以是 1, 2, 3, 4, 5 或 8 设定 TIM 外设.
* @参数 TIM_TimeBaseInitStruct: 指向一个包含 TIM 时间基配置信息的 TIM_BaseInitTypeDef 结构的指针.
* @返回 没有
*/
void TIM_TimeBaseInit(TIM_TypeDef* TIMx, TIM_TimeBaseInitTypeDef* TIM_TimeBaseInitStruct)
{
/* 检查参数 */
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));
/* 选择计数器模式 ,设置时钟频率 */
TIMx->CR1 &= CR1_CKD_Mask & CR1_CounterMode_Mask;
TIMx->CR1 |= (uint32_t)TIM_TimeBaseInitStruct->TIM_ClockDivision |
TIM_TimeBaseInitStruct->TIM_CounterMode;
/* 设置自动装载值 */
TIMx->ARR = TIM_TimeBaseInitStruct->TIM_Period ;
/* 设置预分频器值 */
TIMx->PSC = TIM_TimeBaseInitStruct->TIM_Prescaler;
if ((((uint32_t) TIMx) == TIM1_BASE) || (((uint32_t) TIMx) == TIM8_BASE))
{
/* 设置重复计数器值 */
TIMx->RCR = TIM_TimeBaseInitStruct->TIM_RepetitionCounter;
}
/* 产生一个更新事件立即重新装载预分频器值 */
TIMx->EGR = TIM_PSCReloadMode_Immediate;
}
/**
* @简述 根据 TIM_OCInitStruct 中的特定参数初始化TIMx通道1.
* @参数 TIMx: 此处x可以是1,2,3,4,5或8以选择外设.
* @参数 TIM_OCInitStruct: 指向一个包含特定TIMx外设的配置信息的 TIM_OCInitTypeDef 结构的指针.
* @返回 没有
*/
void TIM_OC1Init(TIM_TypeDef* TIMx, TIM_OCInitTypeDef* TIM_OCInitStruct)
{
uint16_t tmpccmrx = 0, tmpccer = 0, tmpcr2 = 0;
/* 检查参数 */
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));
/* 失能通道 1: 复位 CC1E 位 */
TIMx->CCER &= CCER_CC1E_Reset;
/* 得到 TIMx CCER(捕获/比较使能) 寄存器的值 */
tmpccer = TIMx->CCER;
/* 得到 TIMx CR2(控制寄存器2) 寄存器的值 */
tmpcr2 = TIMx->CR2;
/* 得到 TIMx CCMR1(捕获/比较模式) 寄存器的值 */
tmpccmrx = TIMx->CCMR1;
/* 复位输出比较模式位 */
tmpccmrx &= CCMR_OC13M_Mask;
/* 选择输出比较模式 */
tmpccmrx |= TIM_OCInitStruct->TIM_OCMode;
/* 复位输出极性等级 */
tmpccer &= CCER_CC1P_Reset;
/* 设置输出比较极性 */
tmpccer |= TIM_OCInitStruct->TIM_OCPolarity;
/* 设置输出状态 */
tmpccer |= TIM_OCInitStruct->TIM_OutputState;
/* 设置捕获比较寄存器值 */
TIMx->CCR1 = TIM_OCInitStruct->TIM_Pulse;
if(((uint32_t) TIMx == TIM1_BASE) || ((uint32_t) 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));
/* 复位输出 N 极性等级 */
tmpccer &= CCER_CC1NP_Reset;
/* 设置输出 N 极性 */
tmpccer |= TIM_OCInitStruct->TIM_OCNPolarity;
/* 复位输出 N 状态 */
tmpccer &= CCER_CC1NE_Reset;
/* 设置输出 N 状态 */
tmpccer |= TIM_OCInitStruct->TIM_OutputNState;
/* 复位输出比较,输出比较 N 空闲状态 */
tmpcr2 &= CR2_OIS1_Reset;
tmpcr2 &= CR2_OIS1N_Reset;
/* 设置输出空闲状态 */
tmpcr2 |= TIM_OCInitStruct->TIM_OCIdleState;
/* 设置输出 N 空闲状态 */
tmpcr2 |= TIM_OCInitStruct->TIM_OCNIdleState;
}
/* 写 TIMx CR2(控制寄存器2) */
TIMx->CR2 = tmpcr2;
/* 写 TIMx CCMR1(捕获/比较模式寄存器1) */
TIMx->CCMR1 = tmpccmrx;
/* 写 TIMx CCER(捕获/比较使能寄存器) */
TIMx->CCER = tmpccer;
}
/**
* @简述 根据 TIM_OCInitStruct 中的特定参数初始化TIMx通道2.
* @参数 TIMx: 此处x可以是1,2,3,4,5或8以选择外设.
* @参数 TIM_OCInitStruct: 指向一个包含特定TIMx外设的配置信息的 TIM_OCInitTypeDef 结构的指针.
* @返回 没有
*/
void TIM_OC2Init(TIM_TypeDef* TIMx, TIM_OCInitTypeDef* TIM_OCInitStruct)
{
uint16_t tmpccmrx = 0, tmpccer = 0, tmpcr2 = 0;
/* 检查参数 */
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));
/* 失能通道 2: 复位 CC2E 位 */
TIMx->CCER &= CCER_CC2E_Reset;
/* 得到 TIMx CCER(捕获/比较使能) 寄存器的值 */
tmpccer = TIMx->CCER;
/* 得到 TIMx CR2(控制寄存器2) 寄存器的值 */
tmpcr2 = TIMx->CR2;
/* 得到 TIMx CCMR1(捕获/比较模式) 寄存器的值 */
tmpccmrx = TIMx->CCMR1;
/* 复位输出比较模式位 */
tmpccmrx &= CCMR_OC24M_Mask;
/* 选择输出比较模式 */
tmpccmrx |= (uint16_t)(TIM_OCInitStruct->TIM_OCMode << 8);
/* 复位输出极性等级 */
tmpccer &= CCER_CC2P_Reset;
/* 设置输出比较极性 */
tmpccer |= (uint16_t)(TIM_OCInitStruct->TIM_OCPolarity << 4);
/* 设置输出状态 */
tmpccer |= (uint16_t)(TIM_OCInitStruct->TIM_OutputState << 4);
/* 设置捕获比较寄存器值 */
TIMx->CCR2 = TIM_OCInitStruct->TIM_Pulse;
if(((uint32_t) TIMx == TIM1_BASE) || ((uint32_t) 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));
/* 复位输出 N 极性等级 */
tmpccer &= CCER_CC2NP_Reset;
/* 设置输出 N 极性 */
tmpccer |= (uint16_t)(TIM_OCInitStruct->TIM_OCNPolarity << 4);
/* 复位输出 N 状态 */
tmpccer &= CCER_CC2NE_Reset;
/* 设置输出 N 状态 */
tmpccer |= (uint16_t)(TIM_OCInitStruct->TIM_OutputNState << 4);
/* 复位输出比较,输出比较 N 空闲状态 */
tmpcr2 &= CR2_OIS2_Reset;
tmpcr2 &= CR2_OIS2N_Reset;
/* 设置输出空闲状态 */
tmpcr2 |= (uint16_t)(TIM_OCInitStruct->TIM_OCIdleState << 2);
/* 设置输出 N 空闲状态 */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -