STM32F10x - TIM - 图文 下载本文

7 8 9 10 11 12 13 14 15 16 17 #define RCC_APB2Periph_GPIOE #define RCC_APB2Periph_GPIOF #define RCC_APB2Periph_GPIOG #define RCC_APB2Periph_ADC1 #define RCC_APB2Periph_ADC2 #define RCC_APB2Periph_TIM1 #define RCC_APB2Periph_SPI1 #define RCC_APB2Periph_TIM8 #define RCC_APB2Periph_USART1 #define RCC_APB2Periph_ADC3 #define RCC_APB2Periph_ALL ((u32)0x00000040) ((u32)0x00000080) ((u32)0x00000100) ((u32)0x00000200) ((u32)0x00000400) ((u32)0x00000800) ((u32)0x00001000) ((u32)0x00002000) ((u32)0x00004000) ((u32)0x00008000) ((u32)0x0000FFFD) bit6 bit7 bit8 bit9 bit10 bit11 bit12 bit13 bit14 bit15 (全开通以上各位) //void RCC_APB2PeriphResetCmd(u32 RCC_APB2Periph, FunctionalState NewState); /*【2】

void RCC_APB2PeriphResetCmd(u32 RCC_APB2Periph, FunctionalState NewState) {

/* Check the parameters */

assert_param(IS_RCC_APB2_PERIPH(RCC_APB2Periph)); assert_param(IS_FUNCTIONAL_STATE(NewState));

if (NewState != DISABLE) { RCC->APB2RSTR |= RCC_APB2Periph; } else { RCC->APB2RSTR &= ~RCC_APB2Periph; } } */

case TIM2_BASE:

RCC_APB1PeriphResetCmd(RCC_APB1Periph_TIM2, ENABLE); RCC_APB1PeriphResetCmd(RCC_APB1Periph_TIM2, DISABLE); break;

/*TIMx在APB1RSTR中的复位位如下: No 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 u32 RCC_APB1Periph定义如下: RCC_ APB1 RSTR寄存器定义 定义值 #define RCC_APB1Periph_TIM2 #define RCC_APB1Periph_TIM3 #define RCC_APB1Periph_TIM4 #define RCC_APB1Periph_TIM5 #define RCC_APB1Periph_TIM6 #define RCC_APB1Periph_TIM7 #define RCC_APB1Periph_WWDG #define RCC_APB1Periph_SPI2 #define RCC_APB1Periph_SPI3 #define RCC_APB1Periph_USART2 #define RCC_APB1Periph_USART3 #define RCC_APB1Periph_UART4 #define RCC_APB1Periph_UART5 #define RCC_APB1Periph_I2C1 #define RCC_APB1Periph_I2C2 #define RCC_APB1Periph_USB #define RCC_APB1Periph_CAN #define RCC_APB1Periph_BKP #define RCC_APB1Periph_PWR #define RCC_APB1Periph_DAC #define RCC_APB1Periph_ALL ((u32)0x00000001) ((u32)0x00000002) ((u32)0x00000004) ((u32)0x00000008) ((u32)0x00000010) ((u32)0x00000020) ((u32)0x00000800) ((u32)0x00004000) ((u32)0x00008000) ((u32)0x00020000) ((u32)0x00040000) ((u32)0x00080000) ((u32)0x00100000) ((u32)0x00200000) ((u32)0x00400000) ((u32)0x00800000) ((u32)0x02000000) ((u32)0x08000000) ((u32)0x10000000) ((u32)0x20000000) ((u32)0x3AFEC83F) 在APB2 RSTR中的位置 bit0 bit1 bit2 bit3 bit4 bit5 bit11 bit14 bit15 bit17 bit18 bit19 bit20 bit21 bit22 bit23 bit25 bit27 bit28 bit29 (全开通以上各位) */ /*【1】

void RCC_APB1PeriphResetCmd(u32 RCC_APB1Periph, FunctionalState NewState) {

/* Check the parameters */

assert_param(IS_RCC_APB1_PERIPH(RCC_APB1Periph)); assert_param(IS_FUNCTIONAL_STATE(NewState));

if (NewState != DISABLE) { RCC->APB1RSTR |= RCC_APB1Periph; }

else { RCC->APB1RSTR &= ~RCC_APB1Periph; } } */

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; } }

19.2.2 函数TIM_TimeBaseInit

Table 460. 函数TIM_TimeBaseInit 函数名 TIM_TimeBaseInit void TIM_TimeBaseInit(TIM_TypeDef* TIMx, 函数原形 TIM_TimeBaseInitTypeDef* TIM_TimeBaseInitStruct) 功能描述 根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位 输入参数1 TIMx:x可以是1,2,3,4,5,8来选择TIM外设 TIMTimeBase_InitStruct:指向结构TIM_TimeBaseInitTypeDef的指针,输入参数2 包含TIMx时间基数单位的配置信息 输出参数 无 返回值 无 先决条件 无 被调用函数 无 TIM_TimeBaseInitTypeDef structure TIM_TimeBaseInitTypeDef定义于文件:

typedef struct {

u16 TIM_Period; u16 TIM_Prescaler;

u16 TIM_ClockDivision; u16 TIM_CounterMode;

u8 TIM_RepetitionCounter; }TIM_TimeBaseInitTypeDef;

1.TIM_Period:设置在下一个更新事件装入活动的[TIMx_ARR]的周期的值。其值在0x0000-0xFFFF之间。 2.TIM_Prescaler:设置用来作为TIMx时钟频率除数的预分频值[TIMx_PSC]。其值在 0x0000-0xFFFF之间。 3.TIM_ClockDivision :设置了时钟分割。该参数取值见下表。

Table 461. TIM_ClockDivision值 TIM_ClockDivision TIM_CKD_DIV1 描述 TDTS = Tck_tim #define值 0x0000 备注 TIMx_CR1.CKD[1:0] TIM_CKD_DIV2 TIM_CKD_DIV4 TDTS = 2Tck_tim TDTS = 4Tck_tim 0x0100 0x0200 Bit8-9 4.TIM_CounterMode:选择了计数器模式。该参数取值见下表。 Table 462. TIM_CounterMode值 TIM_CounterMode TIM_CounterMode_Up TIM_CounterMode_Down TIM_CounterMode_CenterAligned1 TIM_CounterMode_CenterAligned2 TIM_CounterMode_CenterAligned3 描述 TIM向上计数模式 TIM向下计数模式 TIM中央对齐模式1计数模式 TIM中央对齐模式2计数模式 TIM中央对齐模式3计数模式 #define值 0x0000 0x0010 0x0020 0x0040 0x0060 在TIMx_CR1的位置 bit6-5 CMS[1:0]=00 CMS[1:0]=01 CMS[1:0]=10 CMS[1:0]=11 bit4 DIR=0 DIR=1 与DIR无关 (DIR=0) 5. TIM_RepetitionCounter:设置CCy的更新速率。 例:

TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_TimeBaseStructure.TIM_Period=0xFFFF; TIM_TimeBaseStructure.TIM_Prescaler = 0xF;

TIM_TimeBaseStructure.TIM_ClockDivision = 0x0;

TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInit(TIM2, & TIM_TimeBaseStructure);

函数原型如下:

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;//=0x008F //#define CR1_CounterMode_Mask ((u16)0x038F) //#define CR1_CKD_Mask ((u16)0x00FF)

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;

//#define TIM_PSCReloadMode_Immediate ((u16)0x0001)// TIMx_EGR.UG (Bit0)

if (((*(u32*)&TIMx) == TIM1_BASE) || ((*(u32*)&TIMx) == TIM8_BASE)) //RCR寄存器,只有T1/T8才有

{ TIMx->RCR = TIM_TimeBaseInitStruct->TIM_RepetitionCounter; } /* Set the Repetition Counter value */ }

19.2.3 函数TIM_OCInit

Table 463.函数TIM_OCInit 函数名 TIM_OCInit void TIM_OCInit(TIM_TypeDef* TIMx, TIM_OCInitTypeDef* 函数原形 TIM_OCInitStruct) 功能描述 根据TIM_OCInitStruct中指定的参数初始化外设TIMx 输入参数1 TIMx:x可以是2,3, 4,来选择TIM外设 TIM_OCInitStruct:指向结构TIM_OCInitTypeDef的指针,包输入参数2 含了TIMx时间基数单位的配置信息 输出参数 无 返回值 无 先决条件 无 被调用函数 无 TIM_OCInitTypeDef structure

TIM_OCInitTypeDef 定义于文件:

typedef struct

{ u16 TIM_OCMode; u16 TIM_Channel; u16 TIM_Pulse;

u16 TIM_OCPolarity; }TIM_OCInitTypeDef;

1.TIM_OCMode :选择定时器模式。该参数取值见下表。

Table 464. TIM_OCMode定义 TIM_OCMode TIM_OCMode_Timing TIM_OCMode_Active TIM_OCMode_Inactive TIM_OCMode_Toggle TIM_OCMode_PWM1 TIM_OCMode_PWM2 描述 #define值 0x0000 0x0010 0x0020 0x0030 0x0060 0x0070 备注

TIM输出比较时间模式 TIM输出比较主动模式 TIM输出比较非主动模式 TIM输出比较触发模式 TIM脉冲宽度调制模式1 TIM脉冲宽度调制模式2 TIMx_CCMRy.OCzM[2:0] 2.TIM_Channel :选择通道。该参数取值见下表。 Table 465. TIM_Channel值 TIM_Channel TIM_Channel_1 TIM_Channel_2 TIM_Channel_3 TIM_Channel_4 描述 使用TIM通道1 使用TIM通道2 使用TIM通道3 使用TIM通道4 #define值 0x0000 0x0004 0x0008 0x000C 3.TIM_Pulse :设置了待装入捕获比较寄存器的脉冲值。其值为0x0000~0xFFFF。 4.TIM_OCPolarity :输出极性。该参数取值见下表。

Table 466. TIM_OCPolarity值 TIM_OCPolarity TIM_OCPolarity_High TIM_OCPolarity_Low 描述 TIM输出比较极性高 TIM输出比较极性低 #define值 0x0000 0x0002 例:

/* Configures the TIM2 Channel1 in PWM Mode */ TIM_OCInitTypeDef TIM_OCInitStructure;

TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; TIM_OCInitStructure.TIM_Channel = TIM_Channel_1; TIM_OCInitStructure.TIM_Pulse = 0x3FFF;

TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; TIM_OCInit(TIM2, & TIM_OCInitStructure); 举例:OC3Init函数原型如下(OC1-OC4):

void TIM_OC3Init(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));

TIMx->CCER &= CCER_CC3E_Reset; /* Disable the Channel 2: Reset the CC2E Bit */ /* CCER的设置 #define值 备注 #define CCER_CC3E_Set ((u16)0x0100) CCER.CC3E(Bit8) #define CCER_CC3E_Reset ((u16)0xFEFF) 使能位 */

tmpccer = TIMx->CCER; /* Get the TIMx CCER register value */

tmpcr2 = TIMx->CR2; /* Get the TIMx CR2 register value */

tmpccmrx = TIMx->CCMR2; /* Get the TIMx CCMR2 register value */

tmpccmrx &= CCMR_OC13M_Mask; /* Reset the Output Compare Mode Bits */ //#define CCMR_CC13S_Mask ((u16)0xFFFC)//清除Bit1-0

tmpccmrx |= TIM_OCInitStruct->TIM_OCMode; /* Select the Output Compare Mode */ //TIM_OCMode在函数外已经被初始化【见结构体】

tmpccer &= CCER_CC3P_Reset; /* Reset the Output Polarity level */