STM32F103 ——TIMx

简介

在stm32f103一共有8个定时器,其中两个高级定时器TIM1、TIM8,四个通用定时器TIM2~TIM5,两个基本定时器TIM6、TIM7。
其中高级定时器功能最多(参考手册中给了共21条功能描述),通用定时器次子(16条功能描述),基本定时器功能最少(4条功能描述,只用来进行最基本的计数器工作)。
在使用时根据需求选用对应的定时器。按需选择


通用定时器TIM2~TIM5

通用定时器功能丰富,总结一下就是——一计数器,四通道,两模式+其他功能


  • 影子寄存器(ARR、PSC、CCRx),统称存有装载值的寄存器。待更新事件UEV产生后会被更新
  • 计时器时钟CK_CNT等于输入时钟CK_INT\预分频系数。通用定时器全挂载在APB1上,默认输入时钟CK_INT=36MHZ*2。 若相应的APB预分频系数是1,定时器的时钟频率与所在APB总线频率一致。否则,定时器的时钟频率被设为与其相连的APB总线频率的2倍。

计数器(TIMx_CNT)

计数器最基本的功能

stm32中定时器的定时功能是由计数器为基础实现的。在使能定时器(TIMx_CR1->0x01,控制器寄存器1第0位置1)后,计数器便开始按照一个时钟频率(分频后的时钟CK_CNT)减或加1的方式进行自动的计数,直到减至零或加至预先设置的值(TIM_ARR的值)时。此时若设置允许更新事件产生(TIMx_CR1->UDIS->0),定时器产生一个更新事件(TIMx_SR->UIF->1)。通过捕获更新事件实现基本定时。

在设置TIMx_ARR(装载器)的值时,若TIMx_CR1寄存器中的自动装载预装载使能位(ARPE)置1,TIMx_ARR先被装入缓存器,等待更新事件UEV后生效;若ARPE置0,设置ARR寄存器后直接生效。

计数器的三种工作模式——向上,向下,双向计数

向上
计数器从0计数到装载器(TIMx_ARR)的值,溢出后产生更新事件UEV。若不是单脉冲模式,将计数器清零,重新开始新一轮计数。

ARR->0x36,时钟预分频系数为1参考手册

向下
在向下模式中,计数器从自动装入的值(TIMx_ARR计数器的值)开始向下计数到0,然后从自动装入的值重新开始并且产生一个计数器向下溢出事件。

ARR->0x36,预分频系数为1参考手册

双向
计数器从0开始计数到自动加载的值(TIMx_ARR寄存器)-1,产生一个计数器溢出事件,然后向下计数到1并且产生一个计数器下溢事件;然后再从0开始重新计数。

ARR->0x06,预分频1参考手册


//keil5配置定时器
	TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);
	
	TIM_TimeBaseStructure.TIM_Period = arr;		//配置ARR寄存器
	TIM_TimeBaseStructure.TIM_Prescaler = psc;		//预分频系数
	TIM_TimeBaseStructure.TIM_ClockDivision = 0;		//定义在定时器时钟(CK_INT)频率与数字滤波器(ETR,TIx)使用的采样频率之间的分频比例
	TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;		//向上计数模式
	TIM_TimeBaseInit(TIM2,&TIM_TimeBaseStructure);		//寄存器配置
	TIM_Cmd(TIM2,ENABLE);		//使能定时器

四通道CCR1~4,两模式——输入、输出

通用定时器有四个通道,每个通道可以配置为输入输出两种模式。可以用于PWM输出,测量输入方波频率,等。
四个通道功能的实现需要基于计数器的,故对通道进行配置前需要先对计数器进行配置

输出/比较模式

相关名词
名称意义、作用
TIMx_CCMRx->OCxM定义通道输出模式
TIMx_CCMRx->OCxPE预装载使能位
OCxREF表示输出引脚电平的有效与无效状态
TIMx_CCER->CCxP输入/捕获x输出极性 (Capture/Compare 1 output polarity)
TIMx_CCER->CCxE输入/捕获x输出使能 (Capture/Compare 1 output enable)

配置步骤

输出比较模式的配置步骤:
1. 选择计数器时钟(内部,外部,预分频器)
2. 将相应的数据写入TIMx_ARR和TIMx_CCRx寄存器中
3. 如果要产生一个中断请求和/或一个DMA请求,设置CCxIE位和/或CCxDE位。
4. 选择输出模式,例如当计数器CNT与CCRx匹配时翻转OCx的输出引脚,CCRx预装载 未用,开启OCx输出且高电平有效,则必须设置OCxM=’011’、OCxPE=’0’、CCxP=’0’和
CCxE=’1’。
5. 设置TIMx_CR1寄存器的CEN位启动计数器

	TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //选择定时器模式:TIM脉冲宽度调制模式2	PWM模式2- 在向上计数时,一旦TIMx_CNT<TIMx_CCR1时通道1为无效电平,
 	TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
	TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //输出极性:TIM输出比较极性高
    //TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Reset;
    //TIM_OCInitStructure.TIM_Pulse = ChannelPulse;
	TIM_OC1Init(TIM1, &TIM_OCInitStructure);  //根据T指定的参数初始化外设TIM3 OC2
	TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Enable);  //使能TIM3在CCR2上的预装载寄存器
	TIM_SetCompare1(TIM1,0);		//调整输出PWM波的占空比(基于计数器的arr进行调节)

  • 输出模式中,写入TIMx_CCRx中的值不断与计数器CNT的值进行比较,当两者匹配(相等时),对应OCxREF标志被改变。通过计数器的来回计数,实现引脚规律的电平输出变化和控制

TIMx_CCRx也是影子寄存器,通过TIMx_CCMRx寄存器OCxPE位进行预装载控制,预装载作用跟ARR预装载相同。若OCxPE=1使能预装载,当计数器更新事件UEV产生后写入CCRx的值被装入;不使能预装载,写入的值立即生效

  • TIMx_CCMRx寄存器中的OCxM[2:0]位用于配置输出模式,用于控制当TIMx_CCRx>TIMx_CNT时的OC1REF(有效电平值为1,无效电平值为0),其值取如下。

000:冻结。输出比较寄存器TIMx_CCR1与计数器TIMx_CNT间的比较对OC1REF不起作用;
001 :匹配时设置通道 1 为有效电平。当计数器 TIMx_CNT 的值与捕获 / 比较寄存器 1
(TIMx_CCR1)相同时,强制OC1REF为高。
010 :匹配时设置通道 1 为无效电平。当计数器 TIMx_CNT 的值与捕获 / 比较寄存器 1
(TIMx_CCR1)相同时,强制OC1REF为低。
011:翻转。当TIMx_CCR1=TIMx_CNT时,翻转OC1REF的电平。
100:强制为无效电平。强制OC1REF为低。
101:强制为有效电平。强制OC1REF为高。
110:PWM模式1- 在向上计数时,一旦TIMx_CNT<TIMx_CCR1时通道1为有效电平,否则为无效电平;在向下计数时,一旦TIMx_CNT>TIMx_CCR1时通道1为无效电平(OC1REF=0),否则为有效电平(OC1REF=1)。
111:PWM模式2- 在向上计数时,一旦TIMx_CNT<TIMx_CCR1时通道1为无效电平,否则为有效电平;在向下计数时,一旦TIMx_CNT>TIMx_CCR1时通道1为有效电平,否则为无效电平。

  • TIMx_CCER寄存器中的CCxP位定义输出极性
    – 置0:有效电平为高电平,输出引脚高电平;当OCxREF=1,输出高电平
    – 置1:有效电平为低电平,输出引脚低电平。当OCxREF=1,输出低电平

即根据输出模式和输出极性的配置,用以控制引脚的输出变化


触发输出信号TRGO
名称意义、作用
TIMx_CR2->MMS[2:0]选择触发输出(TRGO)
ADC_CR2->EXTSEL[2:0]选择启动规则通道组转换的外部事件
ADC_CR2->EXTTRIG规则通道的外部触发转换模式 (使能位)

  • TIMx_CR2->MMS[2:0]->100,此时OC1REF信号被用于作为触发输出(TRGO)。
TIM_SelectOutputTrigger(TIM_TypeDef* TIMx, uint16_t TIM_TRGOSource);		//配置对应定时器的触发输出信号,一个定时器只能选择一种作为触发输出

MMS[2:0]:主模式选择 (Master mode selection) 位6:4
这3位用于选择在主模式下送到从定时器的同步信息(TRGO)。可能的组合如下:
000:复位 – TIMx_EGR寄存器的UG位被用于作为触发输出(TRGO)。如果是触发输入产生的
复位(从模式控制器处于复位模式),则TRGO上的信号相对实际的复位会有一个延迟。
001:使能 – 计数器使能信号CNT_EN被用于作为触发输出(TRGO)。有时需要在同一时间启动
多个定时器或控制在一段时间内使能从定时器。计数器使能信号是通过CEN控制位和门控模式
下的触发输入信号的逻辑或产生。
当计数器使能信号受控于触发输入时,TRGO上会有一个延迟,除非选择了主/从模式(见
TIMx_SMCR寄存器中MSM位的描述)。
010:更新 – 更新事件被选为触发输入(TRGO)。例如,一个主定时器的时钟可以被用作一个从
定时器的预分频器。
011:比较脉冲 – 在发生一次捕获或一次比较成功时,当要设置CC1IF标志时(即使它已经为
高),触发输出送出一个正脉冲(TRGO)。
100:比较 – OC1REF信号被用于作为触发输出(TRGO)。
101:比较 – OC2REF信号被用于作为触发输出(TRGO)。
110:比较 – OC3REF信号被用于作为触发输出(TRGO)。
111:比较 – OC4REF信号被用于作为触发输出(TRGO)。


  • 触发输出信号根据自己的配置可用于控制其他外设的工作,例如:ADC(ADC1,ADC2)

ADC1和ADC2用于规则通道的外部触发配置

ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;	//配置adc的触发

ADC_CR2->EXTSEL[2:0]:选择启动规则通道组转换的外部事件 (External event select for regular group) 位19:17
这些位选择用于启动规则通道组转换的外部事件
ADC1和ADC2的触发配置如下
000:定时器1的CC1事件 100:定时器3的TRGO事件
001:定时器1的CC2事件 101:定时器4的CC4事件
110:EXTI线11/ TIM8_TRGO事件,仅大容量产
品具有TIM8_TRGO功能
010:定时器1的CC3事件
011:定时器2的CC2事件 111:SWSTART
ADC3的触发配置如下
000:定时器3的CC1事件 100:定时器8的TRGO事件
001:定时器2的CC3事件 101:定时器5的CC1事件
010:定时器1的CC3事件 110:定时器5的CC3事件
011:定时器8的CC1事件 111:SWSTART


  • 同时需要配置ADC_CR2->EXTTRIG使能位使能外部触发
ADC_SoftwareStartConvCmd(ADC_TypeDef* ADCx, FunctionalState NewState);

ADC_CR2->EXTTRIG:规则通道的外部触发转换模式 (External trigger conversion mode for regular channels) 位20
该位由软件设置和清除,用于开启或禁止可以启动规则通道组转换的外部触发事件。
0:不用外部事件启动转换;
1:使用外部事件启动转换


通道输出模式功能1——PWM波输出(OCxM=110/111)

PWM基于计数器实现。事先在TIMx_CCRx(通道寄存器)中存入数值,此值会不断与计数器TIMx_CNT中的值进行比较,根据PWM模式和输出极性的配置(在TIMx_CCMRx寄存器中的OCxM位写入’110’(PWM模式1)或’111’(PWM模式2))输出对应引脚电平。

故应有CCRx和ARR中的值之比即为PWM波的占空比

OCxREF信号只能在下述条件下产生:
● 当比较的结果改变,或当输出比较模式(TIMx_CCMRx寄存器中的OCxM位)从“冻结”(无比较,OCxM=’000’)切换到某个PWM模式(OCxM=’110’或’111’)。这样在运行中可以通过软件强置PWM输出。
根据TIMx_CR1寄存器中CMS位的状态,定时器能够产生边沿对齐的PWM信号或中央对齐的PWM信号。

CMS[1:0]:选择中央对齐模式 (Center-aligned mode selection) 位6:5
00:边沿对齐模式。计数器依据方向位(DIR)向上或向下计数。
01:中央对齐模式1。计数器交替地向上和向下计数。配置为输出的通道(TIMx_CCMRx寄存器中CCxS=00)的输出比较中断标志位,只在计数器向下计数时被设置。
10:中央对齐模式2。计数器交替地向上和向下计数。配置为输出的通道(TIMx_CCMRx寄存器中CCxS=00)的输出比较中断标志位,只在计数器向上计数时被设置。
11:中央对齐模式3。计数器交替地向上和向下计数。配置为输出的通道(TIMx_CCMRx寄存器中CCxS=00)的输出比较中断标志位,在计数器向上和向下计数时均被设置。
注:在计数器开启时(CEN=1),不允许从边沿对齐模式转换到中央对齐模式

即PWM波的输出也有向上、向下、中央对齐三种模式,而此三种模式是基于计数器的三种模式实现的


配置PWM输出模式:

TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //选择定时器模式:TIM脉冲宽度调制模式2	PWM模式2- 在向上计数时,一旦TIMx_CNT<TIMx_CCR1时通道1为无效电平,
 	TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
	TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //输出极性:TIM输出比较极性高
    //TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Reset;
    //TIM_OCInitStructure.TIM_Pulse = ChannelPulse;
	TIM_OC1Init(TIM1, &TIM_OCInitStructure);  //根据T指定的参数初始化外设TIM3 OC2
	TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Enable);  //使能TIM3在CCR2上的预装载寄存器
	TIM_SetCompare1(TIM1,0);		//调整输出PWM波的占空比(基于计数器的arr进行调节)

  • 2
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值