📄 stm32f10x_tim.c
字号:
void TIM_ETRConfig(TIM_TypeDef* TIMx, uint16_t TIM_ExtTRGPrescaler, uint16_t TIM_ExtTRGPolarity,
uint16_t ExtTRGFilter)
{
uint16_t tmpsmcr = 0;
/* 检查参数 */
assert_param(IS_TIM_123458_PERIPH(TIMx));
assert_param(IS_TIM_EXT_PRESCALER(TIM_ExtTRGPrescaler));
assert_param(IS_TIM_EXT_POLARITY(TIM_ExtTRGPolarity));
assert_param(IS_TIM_EXT_FILTER(ExtTRGFilter));
tmpsmcr = TIMx->SMCR;
/* 复位 ETR 位 */
tmpsmcr &= SMCR_ETR_Mask;
/* 设置预分频器,过滤器值和极性 */
tmpsmcr |= (uint16_t)(TIM_ExtTRGPrescaler | (uint16_t)(TIM_ExtTRGPolarity | (uint16_t)(ExtTRGFilter << (uint16_t)8)));
/* 写TIMx SMCR */
TIMx->SMCR = tmpsmcr;
}
/**
* @简述 配置 TIMx 预分频器.
* @参数 TIMx: 此处x可以是1到8以选择外设.
* @参数 Prescaler: 指定预分频数的新值
* @参数 TIM_PSCReloadMode: 指定预分频数重载模式
* 这个参数可以取下面的值之一:
* TIM_PSCReloadMode_Update: TIM 预分频值在更新事件装入.
* TIM_PSCReloadMode_Immediate: TIM 预分频值即时装入.
* @返回 没有
*/
void TIM_PrescalerConfig(TIM_TypeDef* TIMx, uint16_t Prescaler, uint16_t TIM_PSCReloadMode)
{
/* 检查参数 */
assert_param(IS_TIM_ALL_PERIPH(TIMx));
assert_param(IS_TIM_PRESCALER_RELOAD(TIM_PSCReloadMode));
/* 设置预分频器值 */
TIMx->PSC = Prescaler;
/* 设置 或 复位 UG 位 */
TIMx->EGR = TIM_PSCReloadMode;
}
/**
* @简述 指定 TIMx 计数器模式.
* @参数 TIMx: 此处x可以是1,2,3,4,5或8以选择外设.
* @参数 TIM_CounterMode: 待使用的计数器模式
* 这个参数可以取下面的值之一:
* TIM_CounterMode_Up: TIM 向上计数模式
* TIM_CounterMode_Down: TIM 向下计数模式
* TIM_CounterMode_CenterAligned1: TIM 中心对齐模式1
* TIM_CounterMode_CenterAligned2: TIM 中心对齐模式2
* TIM_CounterMode_CenterAligned3: TIM 中心对齐模式3
* @返回 没有
*/
void TIM_CounterModeConfig(TIM_TypeDef* TIMx, uint16_t TIM_CounterMode)
{
uint16_t tmpcr1 = 0;
/* 检查参数 */
assert_param(IS_TIM_123458_PERIPH(TIMx));
assert_param(IS_TIM_COUNTER_MODE(TIM_CounterMode));
tmpcr1 = TIMx->CR1;
/* 复位 CMS 和 DIR 位 */
tmpcr1 &= CR1_CounterMode_Mask;
/* 设置计数模式 */
tmpcr1 |= TIM_CounterMode;
/* 写 TIMx CR1 寄存器 */
TIMx->CR1 = tmpcr1;
}
/**
* @简述 选择输入触发源
* @参数 TIMx: 此处x可以是1,2,3,4,5或8以选择外设.
* @参数 TIM_InputTriggerSource: 输入触发源.
* 这个参数可以取下面的值之一:
* TIM_TS_ITR0: 内部触发器 0
* TIM_TS_ITR1: 内部触发器 1
* TIM_TS_ITR2: 内部触发器 2
* TIM_TS_ITR3: 内部触发器 3
* TIM_TS_TI1F_ED: TI1 边缘检测其
* TIM_TS_TI1FP1: 过滤器时钟输入 1
* TIM_TS_TI2FP2: 过滤器时钟输入 2
* TIM_TS_ETRF: 外部触发输入
* @返回 没有
*/
void TIM_SelectInputTrigger(TIM_TypeDef* TIMx, uint16_t TIM_InputTriggerSource)
{
uint16_t tmpsmcr = 0;
/* 检查参数 */
assert_param(IS_TIM_123458_PERIPH(TIMx));
assert_param(IS_TIM_TRIGGER_SELECTION(TIM_InputTriggerSource));
/* 得到 TIMx SMCR 寄存器值 */
tmpsmcr = TIMx->SMCR;
/* 复位 TS 位 */
tmpsmcr &= SMCR_TS_Mask;
/* 设置输入触发源 */
tmpsmcr |= TIM_InputTriggerSource;
/* 写 TIMx SMCR */
TIMx->SMCR = tmpsmcr;
}
/**
* @简述 配置 TIMx 编码器界面.
* @参数 TIMx: 此处x可以是1,2,3,4,5或8以选择外设.
* @参数 TIM_EncoderMode: 指定 TIMx 编码器模式.
* 这个参数可以取下面的值之一:
* TIM_EncoderMode_TI1: TIM编码器使用模式1.
* TIM_EncoderMode_TI2: TIM编码器使用模式2.
* TIM_EncoderMode_TI12: TIM编码器使用模式3.
* @参数 TIM_IC1Polarity: 指定 IC1 极性
* 这个参数可以取下面的值之一:
* TIM_ICPolarity_Falling: IC 下降沿.
* TIM_ICPolarity_Rising: IC 上升沿.
* @参数 TIM_IC2Polarity: 指定 IC2 极性
* 这个参数可以取下面的值之一:
* TIM_ICPolarity_Falling: IC 下降沿.
* TIM_ICPolarity_Rising: IC 上升沿.
* @返回 没有
*/
void TIM_EncoderInterfaceConfig(TIM_TypeDef* TIMx, uint16_t TIM_EncoderMode,
uint16_t TIM_IC1Polarity, uint16_t TIM_IC2Polarity)
{
uint16_t tmpsmcr = 0;
uint16_t tmpccmr1 = 0;
uint16_t tmpccer = 0;
/* 检查参数 */
assert_param(IS_TIM_123458_PERIPH(TIMx));
assert_param(IS_TIM_ENCODER_MODE(TIM_EncoderMode));
assert_param(IS_TIM_IC_POLARITY(TIM_IC1Polarity));
assert_param(IS_TIM_IC_POLARITY(TIM_IC2Polarity));
/* 得到 TIMx SMCR 寄存器的值 */
tmpsmcr = TIMx->SMCR;
/* 得到 TIMx CCMR1 寄存器的值 */
tmpccmr1 = TIMx->CCMR1;
/* 得到 TIMx CCER 寄存器的值 */
tmpccer = TIMx->CCER;
/* 设置编码器模式 */
tmpsmcr &= SMCR_SMS_Mask;
tmpsmcr |= TIM_EncoderMode;
/* 选择捕获比较 1 和捕获比较 2 作为输入 */
tmpccmr1 &= CCMR_CC13S_Mask & CCMR_CC24S_Mask;
tmpccmr1 |= CCMR_TI13Direct_Set | CCMR_TI24Direct_Set;
/* 设置 TI1 和 TI2 极性 */
tmpccer &= CCER_CC1P_Reset & CCER_CC2P_Reset;
tmpccer |= (uint16_t)(TIM_IC1Polarity | (uint16_t)(TIM_IC2Polarity << (uint16_t)4));
/* 写 TIMx SMCR */
TIMx->SMCR = tmpsmcr;
/* 写 TIMx CCMR1 */
TIMx->CCMR1 = tmpccmr1;
/* 写 TIMx CCER */
TIMx->CCER = tmpccer;
}
/**
* @简述 置 TIMx 输出1为活动或者非活动电平.
* @参数 TIMx: 此处x可以是1,2,3,4,5或8以选择外设.
* @参数 TIM_ForcedAction: 输出信号的设置动作.
* 这个参数可以取下面的值之一:
* TIM_ForcedAction_Active: 强制OCxREF为有效电平
* TIM_ForcedAction_InActive: 强制OCxREF为无效电平
* @返回 没有
*/
void TIM_ForcedOC1Config(TIM_TypeDef* TIMx, uint16_t TIM_ForcedAction)
{
uint16_t tmpccmr1 = 0;
/* 检查参数 */
assert_param(IS_TIM_123458_PERIPH(TIMx));
assert_param(IS_TIM_FORCED_ACTION(TIM_ForcedAction));
tmpccmr1 = TIMx->CCMR1;
/* 复位 OC1M 位 */
tmpccmr1 &= CCMR_OC13M_Mask;
/* 配置强制输出模式 */
tmpccmr1 |= TIM_ForcedAction;
/* 写 TIMx CCMR1 寄存器 */
TIMx->CCMR1 = tmpccmr1;
}
/**
* @简述 置 TIMx 输出2为活动或者非活动电平.
* @参数 TIMx: 此处x可以是1,2,3,4,5或8以选择外设.
* @参数 TIM_ForcedAction: 输出信号的设置动作.
* 这个参数可以取下面的值之一:
* TIM_ForcedAction_Active: 强制OCxREF为有效电平
* TIM_ForcedAction_InActive: 强制OCxREF为无效电平
* @返回 没有
*/
void TIM_ForcedOC2Config(TIM_TypeDef* TIMx, uint16_t TIM_ForcedAction)
{
uint16_t tmpccmr1 = 0;
/* 检查参数 */
assert_param(IS_TIM_123458_PERIPH(TIMx));
assert_param(IS_TIM_FORCED_ACTION(TIM_ForcedAction));
tmpccmr1 = TIMx->CCMR1;
/* 复位 OC2M 位 */
tmpccmr1 &= CCMR_OC24M_Mask;
/* 配置强制输出模式 */
tmpccmr1 |= (uint16_t)(TIM_ForcedAction << 8);
/* 写 TIMx CCMR1 寄存器 */
TIMx->CCMR1 = tmpccmr1;
}
/**
* @简述 置 TIMx 输出3为活动或者非活动电平.
* @参数 TIMx: 此处x可以是1,2,3,4,5或8以选择外设.
* @参数 TIM_ForcedAction: 输出信号的设置动作.
* 这个参数可以取下面的值之一:
* TIM_ForcedAction_Active: 强制OCxREF为有效电平
* TIM_ForcedAction_InActive: 强制OCxREF为无效电平
* @返回 没有
*/
void TIM_ForcedOC3Config(TIM_TypeDef* TIMx, uint16_t TIM_ForcedAction)
{
uint16_t tmpccmr2 = 0;
/* 检查参数 */
assert_param(IS_TIM_123458_PERIPH(TIMx));
assert_param(IS_TIM_FORCED_ACTION(TIM_ForcedAction));
tmpccmr2 = TIMx->CCMR2;
/* 复位 OC1M 位 */
tmpccmr2 &= CCMR_OC13M_Mask;
/* 配置强制输出模式 */
tmpccmr2 |= TIM_ForcedAction;
/* 写 TIMx CCMR2 寄存器 */
TIMx->CCMR2 = tmpccmr2;
}
/**
* @简述 置 TIMx 输出4为活动或者非活动电平.
* @参数 TIMx: 此处x可以是1,2,3,4,5或8以选择外设.
* @参数 TIM_ForcedAction: 输出信号的设置动作.
* 这个参数可以取下面的值之一:
* TIM_ForcedAction_Active: 强制OCxREF为有效电平
* TIM_ForcedAction_InActive: 强制OCxREF为无效电平
* @返回 没有
*/
void TIM_ForcedOC4Config(TIM_TypeDef* TIMx, uint16_t TIM_ForcedAction)
{
uint16_t tmpccmr2 = 0;
/* 检查参数 */
assert_param(IS_TIM_123458_PERIPH(TIMx));
assert_param(IS_TIM_FORCED_ACTION(TIM_ForcedAction));
tmpccmr2 = TIMx->CCMR2;
/* 复位 OC2M 位 */
tmpccmr2 &= CCMR_OC24M_Mask;
/* 配置强制输出模式 */
tmpccmr2 |= (uint16_t)(TIM_ForcedAction << 8);
/* 写 TIMx CCMR2 寄存器 */
TIMx->CCMR2 = tmpccmr2;
}
/**
* @简述 使能或者失能 TIMx 在 ARR 上的预装载寄存器.
* @参数 TIMx: 此处x可以是1,2,3,4,5或8以选择外设.
* @参数 NewState: 在TIM1_CR1寄存器中的ARPE位的新状态
* 这个参数可以是: ENABLE or DISABLE.
* @返回 没有
*/
void TIM_ARRPreloadConfig(TIM_TypeDef* TIMx, FunctionalState NewState)
{
/* 检查参数 */
assert_param(IS_TIM_ALL_PERIPH(TIMx));
assert_param(IS_FUNCTIONAL_STATE(NewState));
if (NewState != DISABLE)
{
/* 设置 ARR 的预装载位 */
TIMx->CR1 |= CR1_ARPE_Set;
}
else
{
/* 复位 ARR 的预装载位 */
TIMx->CR1 &= CR1_ARPE_Reset;
}
}
/**
* @简述 选择 TIM 外设的通讯事件.
* @参数 TIMx: 此处x可以是1到8以选择外设
* @参数 NewState: 通讯事件的新状态.
* 这个参数可以是: ENABLE 或 DISABLE.
* @返回 没有
*/
void TIM_SelectCOM(TIM_TypeDef* TIMx, FunctionalState NewState)
{
/* 检查参数 */
assert_param(IS_TIM_18_PERIPH(TIMx));
assert_param(IS_FUNCTIONAL_STATE(NewState));
if (NewState != DISABLE)
{
/* 设置 COM 位 */
TIMx->CR2 |= CR2_CCUS_Set;
}
else
{
/* 复位 COM 位 */
TIMx->CR2 &= CR2_CCUS_Reset;
}
}
/**
* @简述 选择 TIMx 外设的捕获比较 DMA 源.
* @参数 TIMx: 此处x可以是1,2,3,4,5或8以选择外设.
* @参数 NewState: 捕获比较 DMA 源的新状态
* 这个参数可以是: ENABLE 或 DISABLE.
* @返回 没有
*/
void TIM_SelectCCDMA(TIM_TypeDef* TIMx, FunctionalState NewState)
{
/* 检查参数 */
assert_param(IS_TIM_123458_PERIPH(TIMx));
assert_param(IS_FUNCTIONAL_STATE(NewState));
if (NewState != DISABLE)
{
/* 设置 CCDS 位 */
TIMx->CR2 |= CR2_CCDS_Set;
}
else
{
/* 复位 CCDS 位 */
TIMx->CR2 &= CR2_CCDS_Reset;
}
}
/**
* @简述 设置或者复位 TIMx 捕获比较控制位.
* @参数 TIMx: 此处x可以是1到8以选择外设
* @参数 NewState: 捕获比较预载控制位的新状态
* 这个参数可以是: ENABLE 或 DISABLE.
* @返回 没有
*/
void TIM_CCPreloadControl(TIM_TypeDef* TIMx, FunctionalState NewState)
{
/* 检查参数 */
assert_param(IS_TIM_18_PERIPH(TIMx));
assert_param(IS_FUNCTIONAL_STATE(NewState));
if (NewState != DISABLE)
{
/* 设置 CCPC 位 */
TIMx->CR2 |= CR2_CCPC_Set;
}
else
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -