文档库 最新最全的文档下载
当前位置:文档库 › STM32定时器

STM32定时器

STM32定时器
STM32定时器

一、定时器(TIMx)

1.关联函数:

A.TIM_OC1Init(TIM_TypeDef* TIMx, TIM_OCInitTypeDef* TIM_OCInitStruct) :

TIMx通道1配置函数。

B.TIM_OC2Init(TIM_TypeDef* TIMx, TIM_OCInitTypeDef* TIM_OCInitStruct) :

TIMx通道2配置函数。

C.TIM_OC3Init(TIM_TypeDef* TIMx, TIM_OCInitTypeDef* TIM_OCInitStruct):

TIMx通道3配置函数。

D.TIM_OC4Init(TIM_TypeDef* TIMx, TIM_OCInitTypeDef* TIM_OCInitStruct):

TIMx通道4配置函数。

E.TIM_ICInit(TIM_TypeDef* TIMx, TIM_ICInitTypeDef* TIM_ICInitStruct):

TIMx捕获输入配置函数

F.TI1_Config(TIM_TypeDef* TIMx, uint16_t TIM_ICPolarity, uint16_t TIM_ICSelection,

uint16_t TIM_ICFilter):TI1配置函数

G.TI2_Config(TIM_TypeDef* TIMx, uint16_t TIM_ICPolarity, uint16_t TIM_ICSelection,

uint16_t TIM_ICFilter):TI2配置函数

H.TI3_Config(TIM_TypeDef* TIMx, uint16_t TIM_ICPolarity, uint16_t TIM_ICSelection,

uint16_t TIM_ICFilter):TI3配置函数

I.TI4_Config(TIM_TypeDef* TIMx, uint16_t TIM_ICPolarity, uint16_t TIM_ICSelection,

uint16_t TIM_ICFilter):TI4配置函数

J.TIM_SetICxPrescaler(TIM_TypeDef* TIMx, uint16_t TIM_ICPSC):

配置TIMx输入捕获x的预分频器函数K.TIM_PWMIConfig(TIM_TypeDef* TIMx, TIM_ICInitTypeDef* TIM_ICInitStruct):

TIMx的PWM输入模式配置函数

L.TIM_BDTRConfig(TIM_TypeDef* TIMx, TIM_BDTRInitTypeDef *TIM_BDTRInitStruct)

配置刹车, 死区时间, 锁定级别, OSSI,OSSR 状态和自动输出函数. M.TIM_Cmd(TIM_TypeDef* TIMx, FunctionalState NewState)

typedef enum {DISABLE = 0, ENABLE = !DISABLE} FunctionalState; TIMx功能的开关状态N.TIM_CtrlPWMOutputs(TIM_TypeDef* TIMx, FunctionalState NewState)

typedef enum {DISABLE = 0, ENABLE = !DISABLE} FunctionalState; TIMx的PWM功能的开关状态

O.TIM_ITConfig(TIM_TypeDef* TIMx, uint16_t TIM_IT, FunctionalState NewState)

TIMx中断和DMA开启与关断函数

P.TIM_GenerateEvent(TIM_TypeDef* TIMx, uint16_t TIM_EventSource)

事件产生配置函数

Q.TIM_DMAConfig(TIM_TypeDef* TIMx, uint16_t TIM_DMABase, uint16_t

TIM_DMABurstLength)

TIMx的DMA基本配置函数

R.TIM_DMACmd(TIM_TypeDef* TIMx, uint16_t TIM_DMASource, FunctionalState NewState)

TIMx的DMA发送函数

【说明:】函数体中,tmpccmrx 、tmpccer 、tmpcr2 为中间变量,先读取当前寄存器的配置数据,再使用&=配置相关位的数值以便保留当前配置数据。

2.结构体TIM_TimeBaseInitTypeDef内容

1)定义方式: a. TIM_TimeBaseInitTypeDef * TIM_TimeBaseInitStructure或

b. TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure

2)函数调用: a. TIM_TimeBaseInit (TIM1, TIM_TimeBaseInitStructure)或

b. TIM_TimeBaseInit (TIM1,& TIM_TimeBaseInitStructure)

a对应a;b对应b

3)配置内容:TIMx、TIM_CounterMode、TIM_ClockDivision

A.函数

1)TIM_TimeBaseInit(TIM_TypeDef* TIMx, TIM_TimeBaseInitTypeDef* TIM_TimeBaseInitStruct)

B.TIM_Prescaler(寄存器TIMx_PSC)(Prescaler value)

1)预分频设置,赋值使用TIM_TimeBaseInitStructure->TIM_Prescaler

C.TIM_CounterMode(寄存器位TIMx_CR1_DIR_CMS)

1)TIM_CounterMode_Up:计数器向上计数TIMx_CR1 = 0x0000

2)TIM_CounterMode_Down:计数器向下计数TIMx_CR1 = 0x0010

3)TIM_CounterMode_CenterAligned1 :中央对齐模式1 TIMx_CR1 = 0x0020

4)TIM_CounterMode_CenterAligned2 :中央对齐模式2 TIMx_CR1 = 0x0040

5)TIM_CounterMode_CenterAligned3 :中央对齐模式3 TIMx_CR1 = 0x0060

D.TIM_Period(寄存器TIMx_ARR)(Autoreload value)

1)自动重装载寄存器,赋值使用TIM_TimeBaseInitStructure->TIM_Period

E.TIM_ClockDivision(寄存器位TIMx_CR1_CKD)

1)TIM_CKD_DIV1 :tDTS = tCK_INT TIMx_CR1 = 0x0000

2)TIM_CKD_DIV2:tDTS = 2×tCK_INT TIMx_CR1 = 0x0100

3)TIM_CKD_DIV4 :tDTS = 4×tCK_INT TIMx_CR1 = 0x0200

F.TIM_RepetitionCounter(寄存器TIMx_RCR)(Repetition Counter value)

1)设置重复计数寄存器,赋值使用TIM_TimeBaseInitStructure->TIM_RepetitionCounter

3.结构体TIM_OCInitTypeDef内容:

1)定义方式: a. TIM_OCInitTypeDef * TIMx_OCInitStructure或

b. TIM_OCInitTypeDef TIMx_OCInitStructure

2)函数调用: a. TIM_OC1Init(TIM1, TIM1_OCInitStructure)或

b. TIM_OC1Init(TIM1,& TIM1_OCInitStructure)

a对应a;b对应b

3)配置内容:TIMx、TIM_OCMode、IM_OutputState、TIM_OCPolarity

A.函数:

1)TIM_OC1Init(TIM_TypeDef* TIMx, TIM_OCInitTypeDef* TIM_OCInitStruct)

B.TIM_OCMode:输出比较模式选择(寄存器CCMRx_OCxM)

1)TIM_OCMode_Timing:CCMR=0X0000

2)TIM_OCMode_Active:CCMR=0X0010

3)TIM_OCMode_Inactive: CCMR=0X0020

4)TIM_OCMode_Toggle : CCMR=0X0030

5)TIM_OCMode_PWM1: CCMR=0X0060:PWM1模式输出:

6)TIM_OCMode_PWM2: CCMR=0X0070:PWM2模式输出:

C.TIM_OutputState:输出比较状态使能(寄存器位TIMx_CCER_CCxE)

1)TIM_OutputState_Disable:PWM输出使能

4)<< x为左移x位来使能或者禁止PWM输出。通道4<<12,3<<8,2<<4

D.TIM_OutputNState:互补输出比较状态使能(寄存器位TIMx_CCER_CCxN)

1)TIM_OutputNState_Disable:互补PWM通道输出使能

2)TIM_OutputNState_Enable:互补PWM通道输出禁止

【备注】TIMx->CCER |= (uint16_t)(TIM_OCInitStruct->TIM_OutputNState << x);

<< x为左移x位来使能或者禁止互补通道的PWM输出。通道3<<8、2<<4

E.TIM_Pulse:捕获比较频率设置,范围0x0000~0xFFFF

F.TIM_OCPolarity:输出比较极性选择(寄存器位TIMx_CCER_CC1P)

1)TIM_OCPolarity_High:输出极性高电平有效TIMx_CCER = 0x0000

2)TIM_OCPolarity_Low:输出极性低电平有效TIMx_CCER = 0x0002

G.TIM_OCNPolarity:互补通道输出极性选择(寄存器位TIMx_CCER_CC1NP)

1)TIM_OCNPolarity_High:输出极性高电平有效TIMx_CCER = 0x0000

2)TIM_OCNPolarity_Low:输出极性低电平有效_ TIMx_CCER = 0x0008

H.TIM_OCIdleState:TIMx的IDLE状态(寄存器位TIMx_CR2_0ISx)

1)TIM_OCIdleState_Set:IDLE状态置位TIMx_CCER = 0x0100

2)TIM_OCIdleState_Reset:IDLE状态复位TIMx_CCER = 0x0000

I.TIM_OCNIdleState:TIMx的IDLE状态(寄存器位TIMx_CR2_OISxN)

1)TIM_OCNIdleState_Set:互补通道IDLE状态置位TIMx_CR2 = 0x0200

2)TIM_OCNIdleState_Reset:互补通道IDLE状态复位TIMx_CR2 = 0x0000

J.【说明:】设置IDLE状态位是刹车寄存器MOE位置0时,是PWM输出极性失效

4.结构体TIM_ICInitTypeDef内容:(定时器的输入捕获功能)

3)定义方式: a. TIM_ICInitTypeDef * TIM_ICInitStructure或

b. TIM_ICInitTypeDef TIM_ICInitStructure

4)函数调用: a. TIM_ICInit(TIM1, TIM_ICInitStructure)或

b. TIM_ICInit(TIM1, &TIM_ICInitStructure)

a对应a;b对应b

5)配置内容:TIM_Channel 、TIM_ICSelection、TIM_ICPrescaler、TIM_ICFilter

A.TIM_Channel:

1)TIM_Channel_1:TIMx通道1

2)TIM_Channel_2:TIMx通道2

3)TIM_Channel_3:TIMx通道3

4)TIM_Channel_4:TIMx通道4

B.TIM_ICPolarity:(TIM1、TIM2、TIM3、TIM4、TIM5、TIM8)

1)TIM_ICPolarity_Rising:上升沿捕获

2)TIM_ICPolarity_Falling:下降沿捕获

C.TIM_ICPolarity_LITE:(寄存器TIMx_CCER)

1)TIM_ICPolarity_Rising:上升沿捕获TIMx_CCER = 0x0000

2)TIM_ICPolarity_Falling:下降沿捕获TIMx_CCER = 0x0002

3)TIM_ICPolarity_BothEdge:双边捕获TIMx_CCER = 0x000A

D.TIM_ICSelection:(寄存器TIMx_CCMRx)

1)TIM_ICSelection_DirectTI:直接映射:通道1—TI1、2—TI2、3—TI3、4—TI4 TIMx_CCMR1 = 0x0001

2)TIM_ICSelection_IndirectTI:间接映射:通道1—TI2、2—TI1、3—TI4、4—TI3 TIMx_CCMR1 =

0x0002

3)TIM_ICSelection_TRC:映射到TRC:通道1、2、3、4映射到TRC TIMx_CCMR1 =

1)TIM_ICPSC_DIV1:无分频器,每一个边沿都出发一次捕获TIMx_CCMR1 = 0x0000

2)TIM_ICPSC_DIV2:每2个事件触发一次捕获TIMx_CCMR1 = 0x0004

3)TIM_ICPSC_DIV4:每4个事件触发一次捕获TIMx_CCMR1 = 0x0008

4)TIM_ICPSC_DIV8:每8个事件触发一次捕获TIMx_CCMR1 = 0x000C

F.TIM_ICFilter:(寄存器位TIMx_CCMRx_ICxF)

1)(ICFILTER) <= 0xF:输入捕获滤波器

5.结构体TIM_BDTRInitTypeDef内容:

1)定义方式: a. TIM_BDTRInitTypeDef * TIM_BDTRInitStructure或

b. TIM_BDTRInitTypeDef TIM_BDTRInitStructure

2)函数调用: a. TIM_BDTRConfig(TIM1, TIM_BDTRInitStruct)或

b. TIM_BDTRConfig(TIM1, &TIM_BDTRInitStruct)

a对应a;b对应b

3)配置内容:

TIM_OSSRState、TIM_OSSIState、TIM_LOCKLevel、TIM_Break、TIM_BreakPolarityTIM_AutomaticOutput

A.TIM_OSSRState:(寄存器TIMx_BDTR_OSSR)

1)TIM_OSSRState_Enable:((uint16_t)0x0800)

2)TIM_OSSRState_Disable:((uint16_t)0x0000)

B.TIM_OSSIState:(寄存器TIMx_BDTR_OSSI)

1)TIM_OSSIState_Enable:((uint16_t)0x0400)

2)TIM_OSSIState_Disable:((uint16_t)0x0000)

C.TIM_LOCKLevel:(寄存器TIMx_BDTR_LOOK)

1)TIM_LOCKLevel_3:((uint16_t)0x0300) :锁定级别3

2)TIM_LOCKLevel_2:((uint16_t)0x0200) :锁定级别2

3)TIM_LOCKLevel_1:((uint16_t)0x0100) :锁定级别1:

4)TIM_LOCKLevel_OFF:((uint16_t)0x0000):锁定关闭

D.TIM_DeadTime:(寄存器TIMx_BDTR_DTG)

1)DTG[7:5]=0xx => DT=DTG[7:0] ×Tdtg,Tdtg = TDTS;

2)DTG[7:5]=10x => DT=(64+DTG[5:0]) ×Tdtg,Tdtg = 2 ×TDTS;

3)DTG[7:5]=110 => DT=(32+DTG[4:0]) ×Tdtg,Tdtg = 8 ×TDTS;

4)DTG[7:5]=111 => DT=(32+DTG[4:0])×Tdtg,Tdtg = 16 ×TDTS;

E.TIM_Break:(寄存器TIMx_BDTR_BKE)

1)TIM_Break_Enable:((uint16_t)0x1000)刹车功能使能

2)TIM_Break_Disable:((uint16_t)0x0000)刹车功能禁止

F.TIM_BreakPolarity:(寄存器TIMx_BDTR_BKP)

1)TIM_BreakPolarity_Low:((uint16_t)0x0000):刹车输入低电平有效

2)TIM_BreakPolarity_High:((uint16_t)0x2000):刹车输入高电平有效

G.TIM_AutomaticOutput:(寄存器TIMx_BDTR_AOE)

1)TIM_AutomaticOutput_Enable:((uint16_t)0x4000):MOE能被软件置1或者下一个更新时间自动置1

2)TIM_AutomaticOutput_Disable:((uint16_t)0x0000):MOE只能被软件置1

6.定时器TIMx 中断TIM_IT

A.TIM_ITConfig(TIM_TypeDef* TIMx, uint16_t TIM_IT, FunctionalState NewState)

1)TIM_IT_Update:((uint16_t)0x0001) 更新中断

2)TIM_IT_CC1:((uint16_t)0x0002) 捕获比较1中断

5)TIM_IT_CC4:((uint16_t)0x0010) 捕获比较4中断

6)TIM_IT_COM:((uint16_t)0x0020) COM中断

7)TIM_IT_Trigger:((uint16_t)0x0040) 触发中断

8)TIM_IT_Break:((uint16_t)0x0080) 刹车中断中断

B.中断判断:IS_TIM_IT(IT) ((((IT) & (uint16_t)0xFF00) == 0x0000) && ((IT) != 0x0000))

7.定时器TIMx事件发生控制(TIM_EGR)

A.TIM_GenerateEvent(TIM_TypeDef* TIMx, uint16_t TIM_EventSource)

1)TIM_EventSource_Update:((uint16_t)0x0001) 更新时间

2)TIM_EventSource_CC1:((uint16_t)0x0002) 捕获比较1事件

3)TIM_EventSource_CC2:((uint16_t)0x0004) 捕获比较2事件

4)TIM_EventSource_CC3:((uint16_t)0x0008) 捕获比较3事件

5)TIM_EventSource_CC4:((uint16_t)0x0010) 捕获比较4事件

6)TIM_EventSource_COM:((uint16_t)0x0020) 捕获比较事件产生控制更新

7)TIM_EventSource_Trigger:((uint16_t)0x0040) 产生出发事件

8)TIM_EventSource_Break:((uint16_t)0x0080) 产生刹车事件

1)事件判断:IS_TIM_EVENT_SOURCE(SOURCE) ((((SOURCE) & (uint16_t)0xFF00) == 0x0000) && ((SOURCE) !=

0x0000))

B.TIM_DMABase内容:(寄存器TIMx_DCR_DBA)DBA定义为从TIMx_CR1寄存器所在地址开始的偏移量

2)#define TIM_DMABase_CR1 ((uint16_t)0x0000)

3)#define TIM_DMABase_CR2 ((uint16_t)0x0001)

4)#define TIM_DMABase_SMCR ((uint16_t)0x0002)

5)#define TIM_DMABase_DIER ((uint16_t)0x0003)

6)#define TIM_DMABase_SR ((uint16_t)0x0004)

7)#define TIM_DMABase_EGR ((uint16_t)0x0005)

8)#define TIM_DMABase_CCMR1 ((uint16_t)0x0006)

9)#define TIM_DMABase_CCMR2 ((uint16_t)0x0007)

10)#define TIM_DMABase_CCER ((uint16_t)0x0008)

11)#define TIM_DMABase_CNT ((uint16_t)0x0009)

12)#define TIM_DMABase_PSC ((uint16_t)0x000A)

13)#define TIM_DMABase_ARR ((uint16_t)0x000B)

14)#define TIM_DMABase_RCR ((uint16_t)0x000C)

15)#define TIM_DMABase_CCR1 ((uint16_t)0x000D)

16)#define TIM_DMABase_CCR2 ((uint16_t)0x000E)

17)#define TIM_DMABase_CCR3 ((uint16_t)0x000F)

18)#define TIM_DMABase_CCR4 ((uint16_t)0x0010)

19)#define TIM_DMABase_BDTR ((uint16_t)0x0011)

20)#define TIM_DMABase_DCR ((uint16_t)0x0012)

C.TIM_DMABurstLength内容:(寄存器TIMx_DCR_DBL)定义传输的次数

1)#define TIM_DMABurstLength_1Transfer ((uint16_t)0x0000)

2)#define TIM_DMABurstLength_2Transfers ((uint16_t)0x0100)

3)#define TIM_DMABurstLength_3Transfers ((uint16_t)0x0200)

4)#define TIM_DMABurstLength_4Transfers ((uint16_t)0x0300)

5)#define TIM_DMABurstLength_5Transfers ((uint16_t)0x0400)

8)#define TIM_DMABurstLength_8Transfers ((uint16_t)0x0700)

9)#define TIM_DMABurstLength_9Transfers ((uint16_t)0x0800)

10)#define TIM_DMABurstLength_10Transfers ((uint16_t)0x0900)

11)#define TIM_DMABurstLength_11Transfers ((uint16_t)0x0A00)

12)#define TIM_DMABurstLength_12Transfers ((uint16_t)0x0B00)

13)#define TIM_DMABurstLength_13Transfers ((uint16_t)0x0C00)

14)#define TIM_DMABurstLength_14Transfers ((uint16_t)0x0D00)

15)#define TIM_DMABurstLength_15Transfers ((uint16_t)0x0E00)

16)#define TIM_DMABurstLength_16Transfers ((uint16_t)0x0F00)

17)#define TIM_DMABurstLength_17Transfers ((uint16_t)0x1000)

18)#define TIM_DMABurstLength_18Transfers ((uint16_t)0x1100)

D.TIM_DMASource内容:(寄存器TIMx_DIER)

1)#define TIM_DMA_Update ((uint16_t)0x0100) 允许更新的DMA请求

2)#define TIM_DMA_CC1 ((uint16_t)0x0200) 允许捕获比较1的DMA

请求

3)#define TIM_DMA_CC2 ((uint16_t)0x0400) 允许捕获比较2的DMA请求

4)#define TIM_DMA_CC3 ((uint16_t)0x0800) 允许捕获比较3的DMA请求

5)#define TIM_DMA_CC4 ((uint16_t)0x1000) 允许捕获比较4的DMA请求

6)#define TIM_DMA_COM ((uint16_t)0x2000) 允许COM的DMA请求

7)#define TIM_DMA_Trigger ((uint16_t)0x4000) 允许出发的DMA请求

8.定时器从模式配置

A.TIM_InternalClockConfig(TIM_TypeDef* TIMx):

函数功能:配置使用TIMx内部时钟,关闭从模式

1)TIM_SMCR_SMS(从模式):((uint16_t)0x0007)

2)TIMx->SMCR &= (uint16_t)(~((uint16_t)TIM_SMCR_SMS));

B.TIM_ITRxExternalClockConfig(TIM_TypeDef* TIMx, uint16_t TIM_InputTriggerSource):

函数功能:设置TIMx从模式为外部时钟模式1,触发源为时钟内部ITR0~ITR3

1)TIM_InputTriggerSource(选择输入触发源)

2)#define TIM_TS_ITR0 ((uint16_t)0x0000)

3)#define TIM_TS_ITR1 ((uint16_t)0x0010)

4)#define TIM_TS_ITR2 ((uint16_t)0x0020)

5)#define TIM_TS_ITR3 ((uint16_t)0x0030)

6)#define TIM_TS_TI1F_ED ((uint16_t)0x0040)

7)#define TIM_TS_TI1FP1 ((uint16_t)0x0050)

8)#define TIM_TS_TI2FP2 ((uint16_t)0x0060)

9)#define TIM_TS_ETRF ((uint16_t)0x0070)

10)TIM_SlaveMode(从模式选择)

11)#define TIM_SlaveMode_Reset ((uint16_t)0x0004)

12)复位模式–选中的触发输入(TRGI)的上升沿重新初始化计数器,并且产生一个更新寄存器的信号。

13)#define TIM_SlaveMode_Gated ((uint16_t)0x0005)

14)门控模式–当触发输入(TRGI)为高时,计数器的时钟开启。一旦触发输入变为低,则计数器停止

15)#define TIM_SlaveMode_Trigger ((uint16_t)0x0006)

16)触发模式–计数器在触发输入TRGI的上升沿启动(但不复位),只有计数器的启动是受控的。

17)#define TIM_SlaveMode_External1 ((uint16_t)0x0007)

函数功能:选择TIMx输入触发源

D.TIM_TIxExternalClockConfig(TIM_TypeDef* TIMx, uint16_t TIM_TIxExternalCLKSource,

uint16_t TIM_ICPolarity, uint16_t ICFilter) 函数功能:设置外部时钟模式1,选择TI1或TI2作为外部触发源

1)TIM_TIxExternalCLKSource(寄存器TIMx_SMCR_TS)

2)#define TIM_TIxExternalCLK1Source_TI1 ((uint16_t)0x0050) 滤波后的TI1作为外部时钟源入口

3)#define TIM_TIxExternalCLK1Source_TI2 ((uint16_t)0x0060) 滤波后的TI2作为外部时钟源入口

4)#define TIM_TIxExternalCLK1Source_TI1ED ((uint16_t)0x0040) TI1的边沿检测

E.TIM_ETRClockMode1Config(TIM_TypeDef* TIMx, uint16_t TIM_ExtTRGPrescaler,

uint16_t TIM_ExtTRGPolarity,uint16_t ExtTRGFilter):函数功能:设置TIMx从模式为外部时钟模式1,使用外部触发输入ETRF

F.TIM_ETRClockMode2Config(TIM_TypeDef* TIMx, uint16_t TIM_ExtTRGPrescaler,

uint16_t TIM_ExtTRGPolarity, uint16_t ExtTRGFilter):函数功能:设置TIMx从模式为外部时钟模式2,计数器由ETRF信号上的任意有效上升沿驱动。

1)TIM_ExtTRGPrescaler(寄存器TIMx_SMCR_ETPS;外部触发预分频,外部触发信号ETRP的频率必须最多是

TIMxCLK频率的1/4。)

2)#define TIM_ExtTRGPSC_OFF ((uint16_t)0x0000) 关闭分频

3)#define TIM_ExtTRGPSC_DIV2 ((uint16_t)0x1000) ETRP频率除以2

4)#define TIM_ExtTRGPSC_DIV4 ((uint16_t)0x2000) ETRP频率除以4

5)#define TIM_ExtTRGPSC_DIV8 ((uint16_t)0x3000) ETRP频率除以8

6)TIM_ExtTRGPolarity:(寄存器TIMx_SMCR_ETP;外部触发极性)

7)#define TIM_ExtTRGPolarity_Inverted ((uint16_t)0x8000)ETR被反相,低电平或下降沿有效。

8)#define TIM_ExtTRGPolarity_NonInverted ((uint16_t)0x0000)ETR不反相,高电平或上升沿有效;

9)ExtTRGFilter:(寄存器TIMx_SMCR_ETF;外部触发滤波)

10)((EXTFILTER) <= 0xF)

G.TIM_ETRConfig(TIM_TypeDef* TIMx, uint16_t TIM_ExtTRGPrescaler,

uint16_t TIM_ExtTRGPolarity,uint16_t ExtTRGFilter)

函数功能:设置TIMx外部触发输入ETR的参数:预分频值、外部触发极性、外部触发滤波

9.定时器TIMx预分频设置

A.TIM_PrescalerConfig(TIM_TypeDef* TIMx, uint16_t Prescaler,

uint16_t TIM_PSCReloadMode)

函数功能:设置定时器的预分频器,设置TIMx_EGR_UG状态位

1)TIM_PSCReloadMode

2)#define TIM_PSCReloadMode_Update ((uint16_t)0x0000)无动作

3)#define TIM_PSCReloadMode_Immediate ((uint16_t)0x0001)立即更新,产生一个事件

10.定时器TIMx计数模式

A.TIM_CounterModeConfig(TIM_TypeDef* TIMx, uint16_t TIM_CounterMode)

函数功能:选择TIMx的工作模式为计数模式,并选择计数方向和对齐模式

1)TIM_CounterMode(寄存器TIMx_CR1):

2)#define TIM_CounterMode_Up ((uint16_t)0x0000) 边沿对齐模式,计数器向上计数

3)#define TIM_CounterMode_Down ((uint16_t)0x0010) 边沿对齐模式,计数器向下计数

4)#define TIM_CounterMode_CenterAligned1 ((uint16_t)0x0020) 中央对齐模式1

5)#define TIM_CounterMode_CenterAligned2 ((uint16_t)0x0040) 中央对齐模式2

11.定时器TIMx编码器接口模式

A.TIM_EncoderInterfaceConfig(TIM_TypeDef* TIMx, uint16_t TIM_EncoderMode,

uint16_t TIM_IC1Polarity, uint16_t TIM_IC2Polarity) 函数功能:设置定时器TIMx为编码器接口模式,并对相应的通道进行参数设置

7)TIM_EncoderMode:(寄存器TIMx_SMCR_SMS)

8)#define TIM_EncoderMode_TI1 ((uint16_t)0x0001) 编码器模式1

9)#define TIM_EncoderMode_TI2 ((uint16_t)0x0002) 编码器模式2

10)#define TIM_EncoderMode_TI12 ((uint16_t)0x0003) 编码器模式3

11)TIM_ICPolarity:(寄存器TIMx_CCER)

12)#define TIM_ICPolarity_Rising ((uint16_t)0x0000)

13)#define TIM_ICPolarity_Falling ((uint16_t)0x0002)

14)#define TIM_ICPolarity_BothEdge ((uint16_t)0x000A)

12.定时器TIMx强制输出

A.TIM_ForcedOC1Config(TIM_TypeDef* TIMx, uint16_t TIM_ForcedAction)

函数功能:使能或禁止定时器TIMx的输出比较模式1为强制输出模式,使OC1REF输出为1

1)TIM_ForcedAction:(TIMx_CCMRx)

2)#define TIM_ForcedAction_Active ((uint16_t)0x0050)强制为有效电平,OC1REF为高

3)#define TIM_ForcedAction_InActive ((uint16_t)0x0040)强制为无效电平,OC1REF为低

B.TIM_ForcedOC2Config(TIM_TypeDef* TIMx, uint16_t TIM_ForcedAction)

函数功能:使能或禁止定时器TIMx的输出比较模式2为强制输出模式,使OC1REF输出为1 C.TIM_ForcedOC3Config(TIM_TypeDef* TIMx, uint16_t TIM_ForcedAction)

函数功能:使能或禁止定时器TIMx的输出比较模式3为强制输出模式,使OC1REF输出为1 D.TIM_ForcedOC4Config(TIM_TypeDef* TIMx, uint16_t TIM_ForcedAction)

函数功能:使能或禁止定时器TIMx的输出比较模式4为强制输出模式,使OC1REF输出为1

13.定时器TIMx自动重装载功能(TIMx_CR1_ARPE)(ENABLE or DISABLE)

A.TIM_ARRPreloadConfig(TIM_TypeDef* TIMx, FunctionalState NewState)

函数功能:使能或禁止定时器的自动重装载功能

14.定时器TIMx捕获比较控制更新(TIMx_CR2_CCUS)(ENABLE or DISABLE)

A.TIM_SelectCOM(TIM_TypeDef* TIMx, FunctionalState NewState)

函数功能:使能或禁止定时器的捕获比较控制更新选择

15.定时器TIMx的DMA功能(TIMx_CR2_CCDS)(ENABLE or DISABLE)

A.TIM_SelectCCDMA(TIM_TypeDef* TIMx, FunctionalState NewState)

16.定时器TIMx捕获比较输出的预装载功能(TIMx_CR2_CCPC)(ENABLE or DISABLE)

A.TIM_CCPreloadControl(TIM_TypeDef* TIMx, FunctionalState NewState)

17.定时器TIMx输出比较预装载使能或禁止

A.TIM_OC1PreloadConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPreload)

函数功能:使能或禁止定时器的输出比较1装载功能

1)TIM_OCPreload:(寄存器TIMx_CCMR1_OC1PE)

B.TIM_OC2PreloadConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPreload)

函数功能:使能或禁止定时器的输出比较2装载功能

C.TIM_OC3PreloadConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPreload)

函数功能:使能或禁止定时器的输出比较3装载功能

D.TIM_OC4PreloadConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPreload)

函数功能:使能或禁止定时器的输出比较3装载功能

18.定时器TIMx输出比较快速使能功能

A.TIM_OC1FastConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCFast)

函数功能:使能或禁止定时器的输出比较1快速功能

1)TIM_OCFast:(寄存器TIMx_ CCMR1_OC1FE)

2)#define TIM_OCFast_Enable ((uint16_t)0x0004)

3)#define TIM_OCFast_Disable ((uint16_t)0x0000)

B.TIM_OC2FastConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCFast)

函数功能:使能或禁止定时器的输出比较2快速功能

C.TIM_OC3FastConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCFast)

函数功能:使能或禁止定时器的输出比较3快速功能

D.TIM_OC4FastConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCFast)

函数功能:使能或禁止定时器的输出比较4快速功能

19.定时器TIMx输出比较清0使能

A.TIM_ClearOC1Ref(TIM_TypeDef* TIMx, uint16_t TIM_OCClear)

函数功能:使用外部触发ETR(高电平有效)使能或禁止定时器的输出比较1的OC1REF清零

1)TIM_OCClear:(寄存器TIMx_ CCMR1_OC1CE)

2)#define TIM_OCClear_Enable ((uint16_t)0x0080)

3)#define TIM_OCClear_Disable ((uint16_t)0x0000)

B.TIM_ClearOC2Ref(TIM_TypeDef* TIMx, uint16_t TIM_OCClear)

函数功能:使用外部触发ETR(高电平有效)使能或禁止定时器的输出比较2的OC1REF清零C.TIM_ClearOC3Ref(TIM_TypeDef* TIMx, uint16_t TIM_OCClear)

函数功能:使用外部触发ETR(高电平有效)使能或禁止定时器的输出比较3的OC1REF清零D.TIM_ClearOC4Ref(TIM_TypeDef* TIMx, uint16_t TIM_OCClear)

函数功能:使用外部触发ETR(高电平有效)使能或禁止定时器的输出比较4的OC1REF清零

20.定时器TIMx通道极性配置

A.TIM_OC1PolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPolarity)

B.TIM_OC1NPolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCNPolarity)

C.TIM_OC2PolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPolarity)

D.TIM_OC2NPolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCNPolarity)

E.TIM_OC3PolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPolarity)

F.TIM_OC3NPolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCNPolarity)

G.TIM_OC4PolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPolarity)

21.定时器TIMx输出比较通道输出使能(TIMx_CCER)

A.TIM_CCxCmd(TIM_TypeDef* TIMx, uint16_t TIM_Channel, uint16_t TIM_CCx)

1)TIM_CCx:

B.TIM_CCxNCmd(TIM_TypeDef* TIMx, uint16_t TIM_Channel, uint16_t TIM_CCxN)

1)TIM_CCxN:

2)#define TIM_CCxN_Enable ((uint16_t)0x0004)

3)#define TIM_CCxN_Disable ((uint16_t)0x0000)

22.定时器TIMx输出比较模式设置

A.TIM_SelectOCxM(TIM_TypeDef* TIMx, uint16_t TIM_Channel, uint16_t TIM_OCMode)

1)TIM_OCMode

2)#define TIM_Channel_1 ((uint16_t)0x0000)

3)#define TIM_Channel_2 ((uint16_t)0x0004)

4)#define TIM_Channel_3 ((uint16_t)0x0008)

5)#define TIM_Channel_4 ((uint16_t)0x000C)

23.定时器TIMx更新事件使能(TIMx_CR1_UDIS)

A.TIM_UpdateDisableConfig(TIM_TypeDef* TIMx, FunctionalState NewState)

24.定时器TIMx更新中断请求源

A.TIM_UpdateRequestConfig(TIM_TypeDef* TIMx, uint16_t TIM_UpdateSource)

1)TIM_UpdateSource:

2)#define TIM_UpdateSource_Global ((uint16_t)0x0000)任意事件

3)#define TIM_UpdateSource_Regular ((uint16_t)0x0001)只有计数器下溢或溢出

25.定时器TIMx霍尔传感器接口模式使能控制

A.TIM_SelectHallSensor(TIM_TypeDef* TIMx, FunctionalState NewState)

26.定时器TIMx单脉冲模式

A.TIM_SelectOnePulseMode(TIM_TypeDef* TIMx, uint16_t TIM_OPMode)

1)TIM_OPMode:(TIMx_CR1_OPM)

2)#define TIM_OPMode_Single ((uint16_t)0x0008)使能

3)#define TIM_OPMode_Repetitive ((uint16_t)0x0000)禁止

27.定时器TIMx输出TRGO模式

A.TIM_SelectOutputTrigger(TIM_TypeDef* TIMx, uint16_t TIM_TRGOSource)

1)TIM_TRGOSource:(TIMx_CR2_MMS)

2)#define TIM_TRGOSource_Reset ((uint16_t)0x0000)

3)#define TIM_TRGOSource_Enable ((uint16_t)0x0010)

4)#define TIM_TRGOSource_Update ((uint16_t)0x0020)

5)#define TIM_TRGOSource_OC1 ((uint16_t)0x0030)

6)#define TIM_TRGOSource_OC1Ref ((uint16_t)0x0040)

7)#define TIM_TRGOSource_OC2Ref ((uint16_t)0x0050)

8)#define TIM_TRGOSource_OC3Ref ((uint16_t)0x0060)

9)#define TIM_TRGOSource_OC4Ref ((uint16_t)0x0070)

28.定时器TIMx的主从模式控制(SMCR_MSM)

A.TIM_SelectMasterSlaveMode(TIM_TypeDef* TIMx, uint16_t TIM_MasterSlaveMode)

3)#define TIM_MasterSlaveMode_Disable ((uint16_t)0x0000)

29.定时器TIMx的计数器设置(CNT)

A.TIM_SetCounter(TIM_TypeDef* TIMx, uint16_t Counter)

30.定时器TIMx的自动重装载设置(ARR)

A.TIM_SetAutoreload(TIM_TypeDef* TIMx, uint16_t Autoreload)

31.设置定时器TIMx比捕获较寄存器x的值(CCRx)

A.TIM_SetCompare1(TIM_TypeDef* TIMx, uint16_t Compare1)

B.TIM_SetCompare2(TIM_TypeDef* TIMx, uint16_t Compare2)

C.TIM_SetCompare3(TIM_TypeDef* TIMx, uint16_t Compare3)

D.TIM_SetCompare4(TIM_TypeDef* TIMx, uint16_t Compare4)

32.设置定时器TIMx输入捕获x预分频器的值(CCMR_ICxPSC)

A.TIM_SetIC1Prescaler(TIM_TypeDef* TIMx, uint16_t TIM_ICPSC)

B.TIM_SetIC2Prescaler(TIM_TypeDef* TIMx, uint16_t TIM_ICPSC)

C.TIM_SetIC3Prescaler(TIM_TypeDef* TIMx, uint16_t TIM_ICPSC)

D.TIM_SetIC4Prescaler(TIM_TypeDef* TIMx, uint16_t TIM_ICPSC)

33.设置定时器TIMx的时钟分频(CR1_CKD)

A.TIM_SetClockDivision(TIM_TypeDef* TIMx, uint16_t TIM_CKD)

34.获得定时器TIMx输入捕获x的值(CCRx)

A.TIM_GetCapture1(TIM_TypeDef* TIMx)

B.TIM_GetCapture2(TIM_TypeDef* TIMx)

C.TIM_GetCapture3(TIM_TypeDef* TIMx)

D.TIM_GetCapture4(TIM_TypeDef* TIMx)

35.获得定时器TIMx计数器的值(CNT)

A.TIM_GetCounter(TIM_TypeDef* TIMx)

36.获得定时器TIMx预分频器的值(PSC)

A.TIM_GetPrescaler(TIM_TypeDef* TIMx)

37.检查定时器TIMx的标志位

A.FlagStatus TIM_GetFlagStatus(TIM_TypeDef* TIMx, uint16_t TIM_FLAG)

1)TIM_FLAG(TIMx_SR)

2)#define TIM_FLAG_Update ((uint16_t)0x0001)

3)#define TIM_FLAG_CC1 ((uint16_t)0x0002)

4)#define TIM_FLAG_CC2 ((uint16_t)0x0004)

5)#define TIM_FLAG_CC3 ((uint16_t)0x0008)

6)#define TIM_FLAG_CC4 ((uint16_t)0x0010)

7)#define TIM_FLAG_COM ((uint16_t)0x0020)

8)#define TIM_FLAG_Trigger ((uint16_t)0x0040)

11)#define TIM_FLAG_CC2OF ((uint16_t)0x0400)

12)#define TIM_FLAG_CC3OF ((uint16_t)0x0800)

13)#define TIM_FLAG_CC4OF ((uint16_t)0x1000)

38.清除定时器TIMx的标志位

A.TIM_ClearFlag(TIM_TypeDef* TIMx, uint16_t TIM_FLAG)

39.检查定时器TIMx的中断是否发生

A.ITStatus TIM_GetITStatus(TIM_TypeDef* TIMx, uint16_t TIM_IT)

1)TIM_IT

2)#define TIM_IT_Update ((uint16_t)0x0001)

3)#define TIM_IT_CC1 ((uint16_t)0x0002)

4)#define TIM_IT_CC2 ((uint16_t)0x0004)

5)#define TIM_IT_CC3 ((uint16_t)0x0008)

6)#define TIM_IT_CC4 ((uint16_t)0x0010)

7)#define TIM_IT_COM ((uint16_t)0x0020)

8)#define TIM_IT_Trigger ((uint16_t)0x0040)

9)#define TIM_IT_Break ((uint16_t)0x0080)

40.清除定时器TIMx的中断位

A.TIM_ClearITPendingBit(TIM_TypeDef* TIMx, uint16_t TIM_IT)

B.TIM_CtrlPWMOutputs(TIM_TypeDef* TIMx, FunctionalState NewState)

05_STM32F4通用定时器详细讲解精编版

STM32F4系列共有14个定时器,功能很强大。14个定时器分别为: 2个高级定时器:Timer1和Timer8 10个通用定时器:Timer2~timer5 和 timer9~timer14 2个基本定时器: timer6和timer7 本篇欲以通用定时器timer3为例,详细介绍定时器的各个方面,并对其PWM 功能做彻底的探讨。 Timer3是一个16位的定时器,有四个独立通道,分别对应着PA6 PA7 PB0 PB1 主要功能是:1输入捕获——测量脉冲长度。 2 输出波形——PWM 输出和单脉冲输出。 Timer3有4个时钟源: 1:内部时钟(CK_INT ),来自RCC 的TIMxCLK 2:外部时钟模式1:外部输入TI1FP1与TI2FP2 3:外部时钟模式2:外部触发输入TIMx_ETR ,仅适用于TIM2、TIM3、TIM4,TIM3,对应 着PD2引脚 4:内部触发输入:一个定时器触发另一个定时器。 时钟源可以通过TIMx_SMCR 相关位进行设置。这里我们使用内部时钟。 定时器挂在高速外设时钟APB1或低速外设时钟APB2上,时钟不超过内部高速时钟HCLK ,故当APBx_Prescaler 不为1时,定时器时钟为其2倍,当为1时,为了不超过HCLK ,定时器时钟等于HCLK 。 例如:我们一般配置系统时钟SYSCLK 为168MHz ,内部高速时钟 AHB=168Mhz ,APB1欲分频为4,(因为APB1最高时钟为42Mhz ),那么挂在APB1总线上的timer3时钟为84Mhz 。 《STM32F4xx 中文参考手册》的424~443页列出与通用定时器相关的寄存器一共20个, 以下列出与Timer3相关的寄存器及重要寄存器的简单介绍。 1 TIM3 控制寄存器 1 (TIM3_CR1) SYSCLK(最高 AHB_Prescaler APBx_Prescaler

STM32通用定时器_15-1-6

通用定时器的相关配置 1、预装入(Preload) 预装入实际上是设置TIMx_ARR寄存器有没有缓冲,根据“The auto-reload register is preloaded。Writing to or reading from the auto-reload register accesses the preload register。”可知: 1)如果预装入允许,则对自动重装寄存器的读写是对预装入寄存器的存取,自动重装寄存器的值在更新事件后更新; 2)如果预装入不允许,则对自动重装寄存器的读写是直接修改其本身,自动重装寄存器的值立刻更新; 3)设置方式:TIMx_CR1 →ARPE(1) 2、更新事件(UEV) 1)产生条件:①定时器溢出 ②TIMx_CR1→ UDIS = 0 ③或者:软件产生,TIMx_EGR→ UG = 1 2)更新事件产生后,所有寄存器都被“清零”,注意预分频器计数 器也被清零(但是预分频系数不变)。若在中心对称模式下或DIR=0(向上计数)则计数器被清零;若DIR=1(向下计数)则计数器取TIMx_ARR的值。 3)注意URS(复位为0)位的选择,如下:

如果是软件产生更新,则URS→1,这样就不会产生更新请求 和DMA请求。 4)更新标志位(UIF)根据URS的选择置位。 5)可以通过软件来失能更新事件: 3、计数器(Counter) 计数器由预分频器的输出时钟(CK_CNT)驱动,TIMx_CR1→CEN = 1 使能,注意:真正的计数使能信号(CNT_EN)在 CEN 置位后一个周期开始有效。 4、预分频器(Prescaler) 预分频器用来对时钟进行分频,分频值由TIMx_PSC决定,计数器的时钟频率CK_CNT= fCK_PSC / (PSC[15:0] + 1)。 根据“It can be changed on the fly as this control register

stm32定时器的区别

STM32高级定时器、通用定时器(TIMx) 、基本定时器(TIM6和TIM7) 区别? 高级定时器TIM1和TIM8、通用定时器(TIM2,TIM3,TIM4,TIM5) 、基本定时器(TIM6和TIM7) 区别? TIM1和TIM8主要特性TIM1和TIM8定时器的功能包括: ● 16位向上、向下、向上/下自动装载计数器 ● 16位可编程(可以实时修改)预分频器,计数器时钟频率的分频系数为1~65535之间的任意数值 ● 多达4个独立通道:─ 输入捕获─ 输出比较─ PWM生成(边缘或中间对齐模式) ─ 单脉冲模式输出 ● 死区时间可编程的互补输出 ● 使用外部信号控制定时器和定时器互联的同步电路 ● 允许在指定数目的计数器周期之后更新定时器寄存器的重复计数器 ● 刹车输入信号可以将定时器输出信号置于复位状态或者一个已知状态 ● 如下事件发生时产生中断/DMA:─ 更新:计数器向上溢出/向下溢出,计数器初始化(通过软件或者内部/外部触发) ─ 触发事件(计数器启动、停止、初始化或者由内部/外部触发计数) ─ 输入捕获─ 输出比较─ 刹车信号输入 ● 支持针对定位的增量(正交)编码器和霍尔传感器电路 ● 触发输入作为外部时钟或者按周期的电流管理 TIMx主要功能通用TIMx (TIM2、TIM3、TIM4和TIM5)定时器功能包括: ● 16位向上、向下、向上/向下自动装载计数器 ● 16位可编程(可以实时修改)预分频器,计数器时钟频率的分频系数为1~65536之间的任意数值 ● 4个独立通道:─ 输入捕获─ 输出比较─ PWM生成(边缘或中间对齐模式) ─ 单脉冲模式输出 ● 使用外部信号控制定时器和定时器互连的同步电路 ● 如下事件发生时产生中断/DMA:─ 更新:计数器向上溢出/向下溢出,计数器初始化(通过软件或者内部/外部触发) ─ 触发事件(计数器启动、停止、初始化或者由内部/外部触发计数) ─ 输入捕获─ 输出比较 ● 支持针对定位的增量(正交)编码器和霍尔传感器电路 ● 触发输入作为外部时钟或者按周期的电流管理 TIM6和TIM7的主要特性TIM6和TIM7定时器的主要功能包括: ● 16位自动重装载累加计数器 ● 16位可编程(可实时修改)预分频器,用于对输入的时钟按系数为1~65536之间的任意数值分频 ● 触发DAC的同步电路注:此项是TIM6/7独有功能. ● 在更新事件(计数器溢出)时产生中断/DMA请求 强大,高级定时器应该是用于电机控制方面的吧

STM32学习笔记通用定时器PWM输出

STM32学习笔记(5):通用定时器PWM输出 2011年3月30日TIMER输出PWM 1.TIMER输出PWM基本概念 脉冲宽度调制(PWM),是英文“Pulse Width Modulation”的缩写,简称脉宽调制,是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术。简单一点,就是对脉冲宽度的控制。一般用来控制步进电机的速度等等。 STM32的定时器除了TIM6和TIM7之外,其他的定时器都可以用来产生PWM输出,其中高级定时器TIM1和TIM8可以同时产生7路的PWM输出,而通用定时器也能同时产生4路的PWM输出。 1.1PWM输出模式 STM32的PWM输出有两种模式,模式1和模式2,由TIMx_CCMRx寄存器中的OCxM位确定的(“110”为模式1,“111”为模式2)。模式1和模式2的区别如下: 110:PWM模式1-在向上计数时,一旦TIMx_CNTTIMx_CCR1时通道1为无效电平(OC1REF=0),否则为有效电平(OC1REF=1)。 111:PWM模式2-在向上计数时,一旦TIMx_CNTTIMx_CCR1时通道1为有效电平,否则为无效电平。 由此看来,模式1和模式2正好互补,互为相反,所以在运用起来差别也并不太大。 而从计数模式上来看,PWM也和TIMx在作定时器时一样,也有向上计数模式、向下计数模式和中心对齐模式,关于3种模式的具体资料,可以查看《STM32参考手册》的“14.3.9 PWM模式”一节,在此就不详细赘述了。 1.2PWM输出管脚 PWM的输出管脚是确定好的,具体的引脚功能可以查看《STM32参考手册》的“8.3.7 定时器复用功能重映射”一节。在此需要强调的是,不同的TIMx有分配不同的引脚,但是考虑到管脚复用功能,STM32提出了一个重映像的概念,就是说通过设置某一些相关的寄存器,来使得在其他非原始指定的管脚上也能输出PWM。但是这些重映像的管脚也是由参考手册给出的。比如

STM32入门篇之通用定时器彻底研究

STM32入门篇之通用定时器彻底研究 STM32的定时器功能很强大,学习起来也很费劲儿,本人在这卡了5天才算看明白。写下下面的文字送给后来者,希望能带给你点启发。在此声明,本人也是刚入门,接触STM32不足10天,所以有失误的地方请以手册为准,欢迎大家拍砖。 其实手册讲的还是挺全面的,只是无奈TIMER的功能太复杂,所以显得手册很难懂,我就是通过这样看手册:while(!SUCCESS){看手册…}才搞明白的!所以接下来我以手册的顺序为主线,增加一些自己的理解,并通过11个例程对TIMER 做个剖析。实验环境是STM103V100的实验板,MDK3.2 +Library2.东西都不怎么新,凑合用…… TIMER主要是由三部分组成: 1、时基单元。 2、输入捕获。 3、输出比较。 还有两种模式控制功能:从模式控制和主模式控制。 一、框图 让我们看下手册,一开始是定时器的框图,这里面几乎包含了所有定时器的信息,您要是能看明白,那么接下来就不用再看别的了… 为了方便的看图,我对里面出现的名词和符号做个注解: TIMx_ETR:TIMER外部触发引脚ETR:外部触发输入 ETRP:分频后的外部触发输入ETRF:滤波后的外部触发输入 ITRx:内部触发x(由另外的定时器触发) TI1F_ED:TI1的边沿检测器。 TI1FP1/2:滤波后定时器1/2的输入 TRGI:触发输入TRGO:触发输出 CK_PSC:应该叫分频器时钟输入 CK_CNT:定时器时钟。(定时周期的计算就靠它) TIMx_CHx:TIMER的输入脚TIx:应该叫做定时器输入信号x

ICx:输入比较x ICxPS:分频后的ICx OCx:输出捕获x OCxREF:输出参考信号 关于框图还有以下几点要注意: 1、影子寄存器。 有阴影的寄存器,表示在物理上这个寄存器对应2个寄存器,一个是程序员可以写入或读出的寄存器,称为preload register(预装 载寄存器),另一个是程序员看不见的、但在操作中真正起作用的寄存 器,称为shadow register(影子寄存器);(详细请参考版主博客 https://www.wendangku.net/doc/a77287164.html,/STM32/401461/message.aspx) 2、输入滤波机制 在ETR何TIx输入端有个输入滤波器,它的作用是以采样频率 Fdts来采样N次进行滤波的。(具体也请参考版主博客 https://www.wendangku.net/doc/a77287164.html,/STM32/263170/message.aspx ) 3、输入引脚和输出引脚是相同的。 二、时基单元 时基单元有三个部分:CNT、PSC、ARR。CNT的计数方式分三种:向上、向下、中央对齐。通俗的说就是0—ARR、ARR—0、0—(ARR-1)—ARR—1. 三、时钟源的选择 这个是难点之一。从手册上我们看到共有三种时钟源: 1、内部时钟。 也就是选择CK_INT做时钟,这个简单,但是有一点要注意,定 时器的时钟不是直接来自APB1或APB2,而是来自于输入为

STM32通用定时器

STM32通用定时器 一、定时器的基础知识 三种STM32定时器区别 通用定时器功能特点描述: STM3 的通用 TIMx (TIM2、TIM3、TIM4 和 TIM5)定时器功能特点包括: 位于低速的APB1总线上(APB1) 16 位向上、向下、向上/向下(中心对齐)计数模式,自动装载计数器(TIMx_CNT)。 16 位可编程(可以实时修改)预分频器(TIMx_PSC),计数器时钟频率的分频系数 为 1~65535 之间的任意数值。 4 个独立通道(TIMx_CH1~4),这些通道可以用来作为: ①输入捕获 ②输出比较 ③ PWM 生成(边缘或中间对齐模式) ④单脉冲模式输出 可使用外部信号(TIMx_ETR)控制定时器和定时器互连(可以用 1 个定时器控制另外一个定时器)的同步电路。 如下事件发生时产生中断/DMA(6个独立的IRQ/DMA请求生成器): ①更新:计数器向上溢出/向下溢出,计数器初始化(通过软件或者内部/外部触发) ②触发事件(计数器启动、停止、初始化或者由内部/外部触发计数) ③输入捕获 ④输出比较 ⑤支持针对定位的增量(正交)编码器和霍尔传感器电路 ⑥触发输入作为外部时钟或者按周期的电流管理 STM32 的通用定时器可以被用于:测量输入信号的脉冲长度(输入捕获)或者产生输出波形(输出比较和 PWM)等。 使用定时器预分频器和 RCC 时钟控制器预分频器,脉冲长度和波形周期可以在几个微秒到几个毫秒间调整。 STM32 的每个通用定时器都是完全独立的,没有互相共享的任何资源。 定时器框图:

倍频得到),外部时钟引脚,可以通过查看数据手册。也可以是TIMx_CHn,此时主要是实现捕获功能; 框图中间的时基单元 框图下面左右两部分分别是捕获输入模式和比较输出模式的框图,两者用的是同一引脚,不能同时使用。

STM32通用定时器学习

STM32通用定时器 STM32的定时器功能很强大,学习起来也很费劲儿. 其实手册讲的还是挺全面的,只是无奈TIMER的功能太复杂,所以显得手册很难懂,我就是通过这样看手册:while(!SUCCESS){看手册…}才搞明白的!所以接下来我以手册的顺序为主线,增加一些自己的理解,并通过11个例程对TIMER做个剖析。实验环境是STM103V100的实验板,MDK3.2 +Library2.东西都不怎么新,凑合用…… TIMER主要是由三部分组成: 1、时基单元。 2、输入捕获。 3、输出比较。 还有两种模式控制功能:从模式控制和主模式控制。 一、框图 让我们看下手册,一开始是定时器的框图,这里面几乎包含了所有定时器的信息,您要是能看明白,那么接下来就不用再看别的了… 为了方便的看图,我对里面出现的名词和符号做个注解: TIMx_ETR:TIMER外部触发引脚 ETR:外部触发输入 ETRP:分频后的外部触发输入 ETRF:滤波后的外部触发输入 ITRx:内部触发x(由另外的定时器触发) TI1F_ED:TI1的边沿检测器。 TI1FP1/2:滤波后定时器1/2的输入 TRGI:触发输入 TRGO:触发输出 CK_PSC:应该叫分频器时钟输入 CK_CNT:定时器时钟。(定时周期的计算就靠它) TIMx_CHx:TIMER的输入脚 TIx:应该叫做定时器输入信号x ICx:输入比较x ICxPS:分频后的ICx OCx:输出捕获x OCxREF:输出参考信号 关于框图还有以下几点要注意: 1、影子寄存器。 有阴影的寄存器,表示在物理上这个寄存器对应2个寄存器,一个是程序员可以写入或读出的寄存器,称为preload register(预 装载寄存器),另一个是程序员看不见的、但在操作中真正起作用的 寄存器,称为shadow register(影子寄存器);(详细请参考版主博客 https://www.wendangku.net/doc/a77287164.html,/STM32/401461/message.aspx) 2、输入滤波机制 在ETR何TIx输入端有个输入滤波器,它的作用是以采样频率 Fdts来采样N次进行滤波的。(具体也请参考版主博客 https://www.wendangku.net/doc/a77287164.html,/STM32/263170/message.aspx) 3、输入引脚和输出引脚是相同的。 二、时基单元 时基单元有三个部分:CNT、PSC、ARR。CNT的计数方式分三种:向上、

STM32F103通用定时器PWM应用例程--蜂鸣器演奏乐曲

STM32F103通用定时器PWM应用例程:蜂鸣器演奏乐曲 一.说明:本例程是将流明LM3SLib_Timer.pdf文档中的例程9及例程10(PWM应用:蜂鸣器演奏乐曲),移植到STM32F103上。 二.流明LM3SLib_Timer.pdf例程9及例程10的拷贝: 例程9.Timer PWM应用:蜂鸣器发声 如图1.1所示,为EasyARM1138开发板上的蜂鸣器驱动电路。蜂鸣器类型是交流蜂鸣器,也称无源蜂鸣器,需要输入一列方波才能鸣响,发声频率等于驱动方波的频率。 图1.1 蜂鸣器驱动电路 程序清单1.9是Timer模块16位PWM模式的一个应用,可以驱动交流蜂鸣器发声,运行后蜂鸣器以不同的频率叫两声。其中"buzzer.h"和"buzzer.c"是蜂鸣器的驱动程序,仅有3个驱动函数,用起来很简捷。 程序清单1.9 Timer PWM应用:蜂鸣器发声 文件:main.c #include "systemInit.h" #include "buzzer.h" // 主函数(程序入口) int main(void) { jtagWait(); // 防止JTAG失效,重要! clockInit(); // 时钟初始化:晶振,6MHz buzzerInit(); // 蜂鸣器初始化 buzzerSound(1500); // 蜂鸣器发出1500Hz声音 SysCtlDelay(400* (TheSysClock / 3000)); // 延时约400ms buzzerSound(2000); // 蜂鸣器发出2000Hz声音 SysCtlDelay(800* (TheSysClock / 3000)); // 延时约800ms buzzerQuiet( ); // 蜂鸣器静音 for (;;) { } } 文件:buzzer.h #ifndef __BUZZER_H__ #define __BUZZER_H__ // 蜂鸣器初始化 extern void buzzerInit(void); // 蜂鸣器发出指定频率的声音 extern void buzzerSound(unsigned short usFreq); // 蜂鸣器停止发声 extern void buzzerQuiet(void);

STM32通用定时器(TIM2-5)基本用法

STM32通用定时器(TIM2-5)基本用法 (2011-08-18 21:13:42) STM32的定时器是个强大的模块,定时器使用的频率也是很高的,定时器可以做一些基本的定时,还可以做PWM 输出或者输入捕获功能。从系统框架图下看,名为TIMx的有八个,其中TIM1和TIM8挂在APB2总线上,而TIM2-TIM7则挂在APB1总线上。其中TIM1&TIM8称为高级控制定时器(advanced control timer).他们所在的APB2总线也比APB1总线要好。APB2可以工作在72MHz下,而APB1最大是36MHz。 由上图可知,当APB1 的预分频系数为1 时,这个倍频器不起作用,定时器的时钟频率等于APB1 的频率;当APB1的预分频系数为其它数值(即预分频系数为2、4、8 或16)时,这个倍频器起作用,定时器的时钟频率等于APB1 的频率两倍。也就是,当APB1不分频,TIM3的时钟速度为36MHz,当2分频是,APB1变成18MHz,但是TIM 又会倍频,即TIM时钟等于18*2=36MHz。这里我们用向上计数的方式,即TIMx_CNT中的计数值达到TIMx_ARR 中的值时,产生中断,TIMx_CNT又从0开始计。 按以下步骤编程: 1.系统初始化,主要初始化时钟等。 2.GPIO初始化,用于LED,有了灯就便于观察了。 3.TIM3的配置。 4.NVIC的配置。 5.编写中断服务函数。 void GPIO_PA_Init() {//PA8管脚配置 GPIO_InitTypeDef GPIO_InitStructure; GPIO_DeInit(GPIOA); GPIO_InitStructure.GPIO_Pin=GPIO_Pin_8; GPIO_InitStructure.GPIO_Speed=GPIO_Speed_10MHz;

stm32通用定时器

stm32通用定时器 STM32 的定时器功能十分强大,有TIME1 和TIME8 等高级定时器,也有TIME2~TIME5 等通用定时器,还有TIME6 和TIME7 等基本定时器和看门狗定时器以及系统时基定时器。 基本定时器(TIM6,TIM7)的主要功能:只有最基本的定时功能,基本定时器TIM6和TIM7各包含一个16位自动装载计数器,由各自的可编程预分频器驱动。 通用定时器(TIM2~TIM5)的主要功能:除了基本的定时器的功能外,还具有测量输入信号的脉冲长度(输入捕获)或者产生输出波形(输出比较和PWM)。 高级定时器(TIM1,TIM8)的主要功能:高级定时器不但具有基本,通用定时器的所有的功能,还具有控制交直流电动机所有的功能,你比如它可以输出6路互补带死区的信号,刹车功能等等。 两个看门狗定时器:独立看门狗、窗口看门狗。 系统时基定时器:SysTick,24位递减计数器,自动重加载,常用于产生延时ms级、us 级。 1、STM32 通用定时器简介STM32 的通用定时器是一个通过可编程预分频器(PSC)驱动的16 位自动装载计数器(CNT)构成。STM32 的通用定时器可以被用于:测量输入信号的脉冲长度(输入捕获)或者产生输出波形(输出比较和PWM)等。STM32 的每个通用定时器都是完全独立的,没有互相共享的任何资源。 STM32 的通用定时器TIMx (TIM2、TIM3、TIM4 和TIM5)功能包括: 1)16 位向上、向下、向上/向下自动装载计数器(TIMx_CNT)。 2)16 位可编程(可以实时修改)预分频器(TIMx_PSC),计数器时钟频率的分频系数为1~65535 之间的任意数值。 3)4 个独立通道(TIMx_CH1~4),这些通道可以用来作为: A.输入捕获

STM32通用定时器原理及应用

一、通用定时器原理 STM32系列的CPU,有多达8个定时器,其中TIM1和TIM8是能够产生三对PWM 互补输出的高级定时器,常用于三相电机的驱动,它们的时钟由APB2的输出产生。其它6个为普通定时器,时钟由APB1的输出产生。 下图是STM32参考手册上时钟分配图中,有关定时器时钟部分的截图: 实际上STM32的CPU文档给出的图与这个图略有区别。但是我们还是想研究这个图。原因是这个图对我们思路的理解比较有帮助。从图中可以看出,定时器的时钟不是直接来自APB1或APB2,而是来自于输入为APB1或APB2的一个倍频器,图中的蓝色部分。 下面以通用定时器2的时钟说明这个倍频器的作用:当APB1的预分频系数为1时,这个倍频器不起作用,定时器的时钟频率等于APB1的频率;当APB1的预分频系数为其它数值(即预分频系数为2、4、8或16)时,这个倍频器起作用,定时器的时钟频率等于APB1的频率两倍。 可能有同学还是有点不理解,OK,我们举一个例子说明。假定AHB=36MHz,因为APB1允许的最大频率为36MHz,所以APB1的预分频系数可以取任意数值;当预分频系数=1时,APB1=36MHz,TIM2~7的时钟频率=36MHz(倍频器不起作用);当预分频系数=2时,APB1=18MHz,在倍频器的作用下,TIM2~7的时钟频率=36MHz。

有人会问,既然需要TIM2~7的时钟频率=36MHz,为什么不直接取APB1的预分频系数=1?答案是:APB1不但要为TIM2~7提供时钟,而且还要为其它外设提供时钟;设置这个倍频器可以在保证其它外设使用较低时钟频率时,TIM2~7仍能得到较高的时钟频率。 再举个例子:当AHB=72MHz时,APB1的预分频系数必须大于2,因为APB1的最大频率只能为36MHz。如果APB1的预分频系数=2,则因为这个倍频器,TIM2~7仍然能够得到72MHz 的时钟频率。能够使用更高的时钟频率,无疑提高了定时器的分辨率,这也正是设计这个倍频器的初衷。 二、通用定时器编程 实际上,一开始笔者就提到,定时器编程,就是中断的编程。因为使用定时器必定要使用到中断。由于之前已经详细讲述过中断编程,因此本期部分代码的解释会简略讲述,您可以参考芯达STM32入门系列配套教程《初试STM32中断》。 步骤一系统配置SystemInit();,包括时钟RCC的配置,倍频到72MHZ。 步骤二GPIO的配置,使用函数为GPIO_Config();,该函数的实现如下: {

stm32通用定时器详解

stm32通用定时器 STM32的定时器是个强大的模块,定时器使用的频率也是很高的,定时器可以做一些基本的定时,还可以做PWM输出或者输入捕获功能。 时钟源问题: 名为TIMx的有八个,其中TIM1和TIM8挂在APB2总线上,而TIM2-TIM7则挂在 APB1总线上。其中TIM1&TIM8称为高级控制定时器(advanced control timer).他们所在的APB2总线也比APB1总线要好。APB2可以工作在72MHz下,而APB1最大是36MHz。 定时器的时钟不是直接来自APB1或APB2,而是来自于输入为APB1或APB2的一个倍频器。 下面以定时器2~7的时钟说明这个倍频器的作用:当APB1的预分频系数为1时,这个倍频器不起作用,定时器的时钟频率等于APB1的频率;当APB1的预分频系数为其它数值(即预分频系数为2、4、8或16)时,这个倍频器起作用,定时器的时钟频率等于APB1的频率两倍。 假定AHB=36MHz,因为APB1允许的最大频率为36MHz,所以APB1的预分频系数可以取任意数值;当预分频系数=1时,APB1=36MHz,TIM2~7的时钟频率=36MHz(倍频器不起作用);当预分频系数=2时,APB1=18MHz,在倍频器的作用下,TIM2~7的时钟频率=36MHz。有人会问,既然需要TIM2~7的时钟频率=36MHz,为什么不直接取APB1的预分频系数=1?答案是:APB1不但要为TIM2~7提供时钟,而且还要为其它外设提供时钟;设置这个倍频器可以在保证其它外设使用较低时钟频率时,TIM2~7仍能得到较高的时钟频率。 再举个例子:当AHB=72MHz时,APB1的预分频系数必须大于2,因为APB1的最大频率只能为36MHz。如果APB1的预分频系数=2,则因为这个倍频器,TIM2~7仍然能够得到72MHz的时钟频率。能够使用更高的时钟频率,无疑提高了定时器的分辨率,这也正是设计这个倍频器的初衷。

STM32F1通用定时器示例详解--TimeBase

STM32F1通用定时器示例详解--TimeBase 前言 基于学习的目的,详细讲解关于标准外设库中的定时器的17个示例项目函数文件。本次介绍TimeBase的示例。 一、示例详解 基于硬件平台:STM32F100B-EVAL,MCU的型号是STM32F103VET6。 软件则是其标准外设库。 1、Time Base的寄存器配置 软件配置,运行程序可以发现,系统时钟设置为24MHz,定时器使用到的是TIM2 ; 根据时钟树的图谱及其程序,该示例选择的是内部时钟源作为定时器的时钟源; AHB 时钟 (HCLK)在RCC_CFGR寄存器中的分频系数HPRE的值为0,即SYSCLK not divided,所以HCLK就是24MHz;APB1的prescaler的系数是PPRE1:0x05,即分频4,APB1CLK为24/4 = 6M ;由于APB1的prescaler系数不为1,所以经过倍频器后就是x2,即为TIMxCLK = 6*2=12Mhz, 对于上述框图的倍频器,当APB1的预分频系数为1时,这个倍频器不起作用,定时器的时钟频率等于APB1的频率;当APB1的预分频系数为其它数值(即预分频系数为2、4、8或16)时,这个倍频器起作用,定时器的时钟频率等于APB1的频率两倍。APB1不但要为TIM2~7提供时钟,而且还要为其它外设提供时钟;设置这个倍频器可以在保证其它外设使用较低时钟频率时,TIM2~7可以工作在更高频率。

二、示例演练 该示例在达到计数值时,中断内翻转任意通用GPIO口,通过示波器观测其翻转的周期频率。这儿有一个小插曲,软件是直 接拷贝的库函数,理论上选择合适的单片机型号后,下载即可出波形结果;但是发现程序执行,示波器上出现不了波形,而且,在IAR中,寄存器调试观测窗口,发现TIM2寄存器的值初始化不了,TIM3(程序未涉及)反而出现了几个寄存器的初 始化,但是TIM3的初始化值和自己程序中的还是不一样的,另外全局变量的值,尤其SystemClock还有PrescalerValue的 值在检测窗口显示的时Error,是否因为TIM2的地址定义是否错了?查看头文件的定义以及Flash的Memory map,是对的。最终,发现可能出错的地方是在下图的配置,其中CPU clock原来的定义是72Mhz,查看手册,该颗MCU最大只有24Mh,

STM32F103的11个定时器详解

STM32F103系列的单片机一共有11个定时器,其中: 2个高级定时器 4个普通定时器 2个基本定时器 2个看门狗定时器 1个系统嘀嗒定时器 出去看门狗定时器和系统滴答定时器的八个定时器列表; 8个定时器分成3个组; TIM1和TIM8是高级定时器 TIM2-TIM5是通用定时器 TIM6和TIM7是基本的定时器 这8个定时器都是16位的,它们的计数器的类型除了基本定时器TIM6和TIM7都支持向上,向下,向上/向下这3种计数模式 计数器三种计数模式 向上计数模式:从0开始,计到arr预设值,产生溢出事件,返回重新计时 向下计数模式:从arr预设值开始,计到0,产生溢出事件,返回重新计时 中央对齐模式:从0开始向上计数,计到arr产生溢出事件,然后向下计数,计数到1以后,又产生溢出,然后再从0开始向上计数。(此种技术方法也可叫向上/向下计数) 基本定时器(TIM6,TIM7)的主要功能: 只有最基本的定时功能,。基本定时器TIM6和TIM7各包含一个16位自动装载计数器,由各自的可编程预分频器驱动 通用定时器(TIM2~TIM5)的主要功能: 除了基本的定时器的功能外,还具有测量输入信号的脉冲长度( 输入捕获) 或者产生输出波形( 输出比较和PWM) 高级定时器(TIM1,TIM8)的主要功能: 高级定时器不但具有基本,通用定时器的所有的功能,还具有控制交直流电动机所有的功能,你比如它可以输出6路互补带死区的信号,刹车功能等等 通用定时器的时钟来源; a:内部时钟(CK_INT) b:外部时钟模式1:外部输入脚(TIx)

c:外部时钟模式2:外部触发输入(ETR) d:内部触发输入(ITRx):使用一个定时器作为另一个定时器的预分频器 通用定时期内部时钟的产生: 从截图可以看到通用定时器(TIM2-7)的时钟不是直接来自APB1,而是通过APB1的预分频器以后才到达定时器模块。 当APB1的预分频器系数为1时,这个倍频器就不起作用了,定时器的时钟频率等于APB1的频率; 当APB1的预分频系数为其它数值(即预分频系数为2、4、8或16)时,这个倍频器起作用,定时器的时钟频率等于APB1时钟频率的两倍。 自动装在寄存器arr值的计算: Tout= ((arr+1)*(psc+1))/Tclk; Tclk:TIM3的输入时钟频率(单位为Mhz)。 Tout:TIM3溢出时间(单位为us)。 计时1S,输入时钟频率为72MHz,加入PSC预分频器的值为35999,那么: ((1+psc )/72M)*(1+arr )=((1+35999)/72M)*(1+arr)=1秒 则可计算得出自动窗装载寄存器arr=1999 通用定时器PWM工作原理 以PWM模式2,定时器3向上计数,有效电平是高电平,定时器3的第3个PWM通道为例: 定时器3的第3个PWM通道对应是PB0这引脚,三角顶点的值就是TIM3_ARR寄存器的值,上图这条红线的值就TIM3_CCR3 当定时器3的计数器(TIM3_CNT)刚开始计数的时候是小于捕获/比较寄存器(TIM3_CCR3)的值, 此时PB0输出低电平,随着计数器(TIM3_CNT)值慢慢的增加, 当计数器(TIM3_CNT)大于捕获/比较寄存器(TIM3_CCR3)的值时,这时PB0电平就会翻转,输出高电平,计数器(TIM3_CNT)的值继续增加, 当TIM3_CNT=TIM3_ARR的值时,TIM3_CNT重新回到0继续计数,PB0电平翻转,输出低电平,此时一个完整的PWM信号就诞生了。 PWM输出模式; STM32的PWM输出有两种模式: 模式1和模式2,由TIMx_CCMRx寄存器中的OCxM位确定的(“110”为模式1,“111”为模式2)。区别如下: 110:PWM模式1,在向上计数时,一旦TIMx_CNT 在向下计数时,一旦TIMx_CNT>TIMx_CCR1时通道1为无效电平(OC1REF=0),否则为有效电平(OC1REF=1)。 111:PWM模式2-在向上计数时,一旦TIMx_CNTTIMx_CCR1时通道1为有效电平,否则为无效电平。 由以上可知:

STM32F407通用定时器输入捕获

通用定时器输入捕获 通用定时器作为输入捕获的使用。我们用TIM5的通道1(PA0)来做输入捕获,捕获PA0上高电平的脉宽(用KEY_UP按键输入高电平),通过串口来打印高电平脉宽时间。 输入捕获模式可以用来测量脉冲宽度或者测量频率。我们以测量脉宽为例,用一个简图来说明输入捕获的原理: 如图所示,就是输入捕获测量高电平脉宽的原理,假定定时器工作在向上计数模式,图中t1~t2时间,就是我们需要测量的高电平时间。测量方法如下:首先设置定时器通道x为上升沿捕获,这样,t1时刻,就会捕获到当前的CNT值,然后立即清零CNT,并设置通道x为下降沿捕获,这样到t2时刻,又会发生捕获事件,得到此时的CNT值,记为CCRx2。这样,根据定时器的计数频率,我们就可以算出t1~t2的时间,从而得到高电平脉宽。在t1~t2之间,可能产生N次定时器溢出,这就要求我们对定时器溢出,做处理,防止高电平太长,导致数据不准确。如图所示,t1~t2之间,CNT计数的次数等于:N*ARR+CCRx2,有了这个计数次数,再乘以CNT的计数周期,即可得到t2-t1的时间长度,即高电平持续时间。 STM32F4的定时器,除了TIM6和TIM7,其他定时器都有输入捕获功能。STM32F4的输入捕获,简单的说就是通过检测TIMx_CHx上的边沿信号,在边沿信号发生跳变(比如上升沿/下降沿)的时候,将当前定时器的值(TIMx_CNT)存放到对应的通道的捕获/比较寄存器(TIMx_CCRx)里面,完成一次捕获。同时还可以配置捕获时是否触发中断/DMA等。这里我们用TIM5_CH1来捕获高电平脉宽。 =================================================================================== 捕获/比较通道(例如:通道 1 输入阶段) =================================================================================== 接下来介绍我们需要用到的一些寄存器配置,需要用到的寄存器:TIMx_ARR、TIMx_PSC、TIMx_CCMR1、TIMx_CCER、TIMx_DIER、TIMx_CR1、TIMx_CCR1 (这里的x=5)。 首先TIMx_ARR和TIMx_PSC,这两个寄存器用来设自动重装载值和TIMx的时钟分频。

STM32—通用定时器应用

我的第三个STM32程序,使用MDK 其中timer.c程序如下,其它使用keil自带的文件 #include "stm32f10x_lib.h" void RCC_cfg() //时钟系统初始化 { ErrorStatus HSEStartUpStatus; //定义错误状态变量 RCC_DeInit(); //将RCC寄存器重新设置为默认值 RCC_HSEConfig(RCC_HSE_ON); //打开外部高速时钟晶振 HSEStartUpStatus = RCC_WaitForHSEStartUp(); //等待外部高速时钟晶振工作 if(HSEStartUpStatus == SUCCESS) { RCC_HCLKConfig(RCC_SYSCLK_Div1); //设置AHB时钟(HCLK)为系统时钟 RCC_PCLK2Config(RCC_HCLK_Div1); //设置高速AHB时钟(APB2)为HCLK时钟 RCC_PCLK1Config(RCC_HCLK_Div2); //设置低速AHB时钟(APB1)为HCLK的2分频

FLASH_SetLatency(FLASH_Latency_2); //设置FLASH代码延时 FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable); //使能预取指缓存 RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9); //设置PLL时钟,为HSE的9倍频 8MHz * 9 = 72MHz RCC_PLLCmd(ENABLE); //使能PLL while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET) ; //等待PLL准备就绪 RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK); //设置PLL为系统时钟源 while(RCC_GetSYSCLKSource() != 0x08); //判断PLL是否是系统时钟 } RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE); //允许TIM2的时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); //允许GPIO的时钟

STM32高级定时器使用方法及注意事项

By 深圳市威睿晶科Felix 主要特性: 高级定时器与通用定时器的主要差别如下红色区域 ●16位向上、向下、向上/下自动装载计数器 ●16位可编程(可以实时修改)预分频器,计数器时钟频率的分频系数为1~65535之 间的任意数值 ●多达4个独立通道: ─ 输入捕获 ─ 输出比较 ─ PWM生成(边缘或中间对齐模式) ─ 单脉冲模式输出 ●死区时间可编程的互补输出 ●使用外部信号控制定时器和定时器互联的同步电路 ●允许在指定数目的计数器周期之后更新定时器寄存器的重复计数器 ●刹车输入信号可以将定时器输出信号置于复位状态或者一个已知状态 ●如下事件发生时产生中断/DMA:─ 更新:计数器向上溢出/向下溢出,计数器初始化(通过软件或者内部/外部触发) ─ 触发事件(计数器启动、停止、初始化或者由内部/外部触发计数) ─ 输入捕获─ 输出比较─ 刹车信号输入 ●支持针对定位的增量(正交)编码器和霍尔传感器电路 ●触发输入作为外部时钟或者按周期的电流管理 如上所示,对于一般地应用是体现不出来它高端的地方了。 使用心得: 由于V3.5库函数将定时器资源全部融合在一块了,所以显得stm32f10x_tim.c库特别庞大,找功能函数很是麻烦,还容易搞混乱。面对这种情况寄存器操作就显得很方便了,所以以下程序我是直接参考寄存器说明来逐步配置的,阅读起来不太方便,但写起来方便,而且不会重复混乱,更容易理解到定时器的工作过程。 1 首先是作为定时器的通用功能:定时 定时功能的实现,是通过设置定时时钟为内部时钟源来实现,如手册上介绍: “如果禁止了从模式控制器(SMS=000),则CEN、DIR(TIMx_CR1寄存器)和UG 位(TIMx_EGR寄存器)是事实上的控制位,并且只能被软件修改(UG位仍被自动清除)。只要CEN位被写成’1’,预分频器的时钟就由内部时钟CK_INT提供。” 配置步骤如下: void TIM1Timing(void){ RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1|RCC_APB2Periph_GPIOA,ENABLE); //打开TIM1时钟 TIM1->CR1 =0x380 ;//456bit=0,向上计数 TIM1->SMCR&=0xfff8;//sms=000,禁止从模式控制器 TIM1->PSC=7199;//设置预分频,公式fCK_PSC/( PSC[15:0]+1)= 0.1Mhz,100us/+1 TIM1->ARR=10000;//设置自动重装载值为10000,即溢出一次时间为1S TIM1->RCR=0;//重复计数寄存器为0,这个是设置事件(中断)频率的,为0即溢出1次中断标志置位 TIM1->EGR|=1;重新初始化计数器,即清空计数器(要是向上计数则清0,要是向下计数则

STM32——基本定时一秒闪烁LED

STM32通用定时器的基本定时器功能实现灯闪烁 /* Includes ------------------------------------------------------------------*/ #include "stm32f10x_lib.h" ErrorStatus HSEStartUpStatus; void RCC_Configuration(void); //void USART_Configuration(void); void GPIO_Configuration(void); void TIM_Configuration(void); void NVIC_Configuration(void); void delay(void); int main(void) { #ifdef DEBUG debug(); #endif RCC_Configuration(); GPIO_Configuration(); TIM_Configuration(); //USART_Configuration(); NVIC_Configuration(); /* Infinite loop */ while (1) { if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET) { } } }

/****************************************************************************** * * Function Name : assert_failed * Description : Reports the name of the source file and the source line number * where the assert_param error has occurred. * Input : - file: pointer to the source file name * - line: assert_param error line source number * Output : None * Return : None ******************************************************************************* / void RCC_Configuration(void) { /*将外设RCC寄存器重设为缺省值*/ RCC_DeInit(); /*设置外部高速晶振(HSE)*/ RCC_HSEConfig(RCC_HSE_ON); //RCC_HSE_ON——HSE晶振打开(ON) /*等待HSE起振*/ HSEStartUpStatus = RCC_WaitForHSEStartUp(); if(HSEStartUpStatus == SUCCESS) //SUCCESS:HSE晶振稳定且就绪 { /*设置AHB时钟(HCLK)*/ RCC_HCLKConfig(RCC_SYSCLK_Div1); //RCC_SYSCLK_Div1——AHB时钟= 系统时钟 /* 设置高速AHB时钟(PCLK2)*/ RCC_PCLK2Config(RCC_HCLK_Div1); //RCC_HCLK_Div1——APB2时钟= HCLK /*设置低速AHB时钟(PCLK1)*/ RCC_PCLK1Config(RCC_HCLK_Div2); //RCC_HCLK_Div2——APB1时钟= HCLK / 2 /*设置FLASH存储器延时时钟周期数*/ FLASH_SetLatency(FLASH_Latency_2); //FLASH_Latency_2 2延时周期 /*选择FLASH预取指缓存的模式*/ FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable); // 预取指缓存使能/*设置PLL时钟源及倍频系数*/ RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9); // PLL的输入时钟= HSE时钟频率;RCC_PLLMul_9——PLL输入时钟x 9 /*使能PLL */ RCC_PLLCmd(ENABLE); /*检查指定的RCC标志位(PLL准备好标志)设置与否*/ while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET) { }

相关文档