关于STM32F103单片机定时器的定时器问题

STM32F103的11个定时器详解_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
STM32F103的11个定时器详解
阅读已结束,下载文档到电脑
想免费下载更多文档?
定制HR最喜欢的简历
下载文档到电脑,方便使用
还剩2页未读,继续阅读
定制HR最喜欢的简历
你可能喜欢21ic官方微信-->
后使用快捷导航没有帐号?
ST MCU Finder
安装免费手机应用,
寻找理想的ST MCU
请完成以下验证码
查看: 2076|回复: 18
关于STM32F103高级定时器的问题
&&已结帖(10)
主题帖子积分
初级技术员, 积分 66, 距离下一级还需 34 积分
初级技术员, 积分 66, 距离下一级还需 34 积分
主题帖子积分
专家等级:结帖率:90%
主题帖子积分
初级技术员, 积分 66, 距离下一级还需 34 积分
初级技术员, 积分 66, 距离下一级还需 34 积分
本帖最后由 qizhying 于
10:26 编辑
最近在做直流无刷马达控制器要使用STM32F103C8T6的高级定时器功能,但是在测试高级定时器TIM1的时候发现了一些问题!STM32用户手册《RM0008_DocID13902 Rev 16》P354.Table 83描述如下:
CCxE和CCxNE是控制OCx和OCxN输出的控制位,当CCxE和CCxNE均为0时OCx和OCxN的输出功能被关闭,但是在实际测试的结果与手册描述并不相符,下面是测试结果:
测试分为4个步骤:
step1: 正常初始化TIM1,让OC1和OC1N正常输出波形
step2:复位CCxE和CCxNE,此时OC1和OC1N的波形输出被关闭,与手册描述相同
step3:在CCxE=0、CCxN=0的状态下,输入刹车信号(MOE=0),此时像鬼附身似的莫名其妙的OCx和OCxN又正常输出PWM信号了!!这是什么鬼?
step4:去除刹车信号(MOE=1),OCx和OCxN的PWM输出又停止了
step3的现象与手册描述不符,手册中描述在MOE=0,CCxE=0,CCxNE=0时OCx与OCxN的输出会被禁止,但是实际测试发现,此时是有PWM输出的,这是STM32存在的BUG吗?
本帖子中包含更多资源
才可以下载或查看,没有帐号?
主题帖子积分
助理工程师, 积分 1521, 距离下一级还需 479 积分
助理工程师, 积分 1521, 距离下一级还需 479 积分
主题帖子积分
专家等级:结帖率:0%打赏:0.00受赏:2.00
主题帖子积分
助理工程师, 积分 1521, 距离下一级还需 479 积分
助理工程师, 积分 1521, 距离下一级还需 479 积分
STM32高级定时器用了好多年了。肯定没你说的这个BUG.
不妨检查下你的代码,这个地方我之前对着这个表一步步也玩过。
主题帖子积分
初级技术员, 积分 66, 距离下一级还需 34 积分
初级技术员, 积分 66, 距离下一级还需 34 积分
主题帖子积分
专家等级:结帖率:90%
主题帖子积分
初级技术员, 积分 66, 距离下一级还需 34 积分
初级技术员, 积分 66, 距离下一级还需 34 积分
STM32高级定时器用了好多年了。肯定没你说的这个BUG.
不妨检查下你的代码,这个地方我之前对着这个表一步 ...
我把寄存器都对了一遍,正常情况下MOE=0,CCxE=0,CCxNE=0是不会有波形输出的,但是实际测试下来不是这样,不信你可以试试!
主题帖子积分
助理工程师, 积分 1521, 距离下一级还需 479 积分
助理工程师, 积分 1521, 距离下一级还需 479 积分
主题帖子积分
专家等级:结帖率:0%打赏:0.00受赏:2.00
主题帖子积分
助理工程师, 积分 1521, 距离下一级还需 479 积分
助理工程师, 积分 1521, 距离下一级还需 479 积分
呵呵 不要怀疑芯片BUG了,会把人带入死胡同。又不是啥新芯片或新功能。
如果确定定时器相关配置没问题,确认下管脚,会不会管脚弄错了。这个也经常发生的。
主题帖子积分
初级技术员, 积分 66, 距离下一级还需 34 积分
初级技术员, 积分 66, 距离下一级还需 34 积分
主题帖子积分
专家等级:结帖率:90%
主题帖子积分
初级技术员, 积分 66, 距离下一级还需 34 积分
初级技术员, 积分 66, 距离下一级还需 34 积分
本帖最后由 qizhying 于
15:39 编辑
呵呵 不要怀疑芯片BUG了,会把人带入死胡同。又不是啥新芯片或新功能。
如果确定定时器相关配置没问题,确 ...
你说的也有道理,不过最好是把问题搞清,免得后面出出问题都不知道是哪里!
我仔细看了数据手册
表格“Table 83. Output control bits for complementary OCx and OCxN channels with
break feature” 最下面有一个注意:
“1. When both outputs of a channel are not used (CCxE = CCxNE = 0), the OISx, OISxN, CCxP and CCxNP bits must be kept cleared.”
也就是说 CCxE = CCxNE = 0时, OISx, OISxN, CCxP and CCxNP也必须清零,否则为非法操作!
主题帖子积分
助理工程师, 积分 1521, 距离下一级还需 479 积分
助理工程师, 积分 1521, 距离下一级还需 479 积分
主题帖子积分
专家等级:结帖率:0%打赏:0.00受赏:2.00
主题帖子积分
助理工程师, 积分 1521, 距离下一级还需 479 积分
助理工程师, 积分 1521, 距离下一级还需 479 积分
你说的也有道理,不过最好是把问题搞清,免得后面出出问题都不知道是哪里!
我仔细看了数据手册
想起来了,表格最下方写了一句注释。
有印象,当时测试时没碰到这个现象,回头再验证下,不排除是这个原因。
主题帖子积分
助理工程师, 积分 1428, 距离下一级还需 572 积分
助理工程师, 积分 1428, 距离下一级还需 572 积分
主题帖子积分
专家等级:结帖率:100%
主题帖子积分
助理工程师, 积分 1428, 距离下一级还需 572 积分
助理工程师, 积分 1428, 距离下一级还需 572 积分
确认下管脚和相关寄存器配置有没有问题
主题帖子积分
资深技术员, 积分 362, 距离下一级还需 138 积分
资深技术员, 积分 362, 距离下一级还需 138 积分
主题帖子积分
专家等级:结帖率:0%
主题帖子积分
资深技术员, 积分 362, 距离下一级还需 138 积分
资深技术员, 积分 362, 距离下一级还需 138 积分
用103好多年呢,PWM有bug,没听说PWM也有bug的
主题帖子积分
资深技术员, 积分 341, 距离下一级还需 159 积分
资深技术员, 积分 341, 距离下一级还需 159 积分
主题帖子积分
专家等级:结帖率:0%
主题帖子积分
资深技术员, 积分 341, 距离下一级还需 159 积分
资深技术员, 积分 341, 距离下一级还需 159 积分
只用过普通定时器,没用过高级的,不过用着没什么问题
主题帖子积分
中级工程师, 积分 3643, 距离下一级还需 1357 积分
中级工程师, 积分 3643, 距离下一级还需 1357 积分
主题帖子积分
专家等级:结帖率:100%打赏:0.00受赏:0.01
主题帖子积分
中级工程师, 积分 3643, 距离下一级还需 1357 积分
中级工程师, 积分 3643, 距离下一级还需 1357 积分
要看手册上的那个图,别看表格,那个图上画的有怎么配置以及结构图。
主题帖子积分
高级工程师, 积分 5240, 距离下一级还需 2760 积分
高级工程师, 积分 5240, 距离下一级还需 2760 积分
主题帖子积分
专家等级:结帖率:100%
主题帖子积分
高级工程师, 积分 5240, 距离下一级还需 2760 积分
高级工程师, 积分 5240, 距离下一级还需 2760 积分
STM32 用高级定时器 T1 生成CH1&&CH4&&的PWM 的初始化程序,大家小走弯路
RCC-&APB2ENR|=1&&11;& && & //TIM1时钟使能& &
////////////////////////////////////////
GPIOA-&CRH&=0XFFFF0FF0;//PA8 11 输出
GPIOA-&CRH|=0X0000B00B;//复用功能输出& &
////////////////////////////////////////
TIM1-&BDTR |=0xC0;& &//ARPE使能
TIM1-&ARR=//设定计数器自动重装值
TIM1-&;PSC=//预分频器不分频
TIM1-&CCMR1|=6&&4;&&//CH2 PWM2模式 CH1/2&&
TIM1-&CCMR1|=1&&3; //CH2预装载使能 TIM1-&CCMR2|=6&&12;&&//CH2 PWM2模式 CH3/4& &
TIM1-&CCMR2|=1&&11; //CH2预装载使能
TIM1-&CCER|=1&&0;& &//OC2 输出使能
TIM1-&CCER|=1&&12;& &//OC2 输出使能
TIM1-&CR1 |=0x80;& &//ARPE使能
TIM1-&CR1|=0x01;& & //使能定时器1 TIM1-&BDTR|=0x8000;&&//使能定时器1输出
T1&&和其它的定时器不一样,T2&&T3&&T4 都不需要最后这一句,&&而调T1时,没有最后的这个BDTR,死活不出PWM。
主题帖子积分
初级技术员, 积分 66, 距离下一级还需 34 积分
初级技术员, 积分 66, 距离下一级还需 34 积分
主题帖子积分
专家等级:结帖率:90%
主题帖子积分
初级技术员, 积分 66, 距离下一级还需 34 积分
初级技术员, 积分 66, 距离下一级还需 34 积分
本帖最后由 qizhying 于
09:25 编辑
用103好多年呢,PWM有bug,没听说PWM也有bug的
嗯,严格按照STM32的手册来配置是没有问题的。可能是STM32设计的不够严谨,正常思维的情况下如果PWM输出控制位都禁能,无论其他控制寄存器的配置是否合法都不应该有波形输出,但STM32的片子会有波形输出,这就是设计不够严谨!
主题帖子积分
初级技术员, 积分 66, 距离下一级还需 34 积分
初级技术员, 积分 66, 距离下一级还需 34 积分
主题帖子积分
专家等级:结帖率:90%
主题帖子积分
初级技术员, 积分 66, 距离下一级还需 34 积分
初级技术员, 积分 66, 距离下一级还需 34 积分
想起来了,表格最下方写了一句注释。
有印象,当时测试时没碰到这个现象,回头再验证下,不排除是这个原 ...
我验证过了,严格按照STM32的规格书来配置,是没有问题的!
主题帖子积分
初级工程师, 积分 2201, 距离下一级还需 799 积分
初级工程师, 积分 2201, 距离下一级还需 799 积分
主题帖子积分
专家等级:结帖率:100%
主题帖子积分
初级工程师, 积分 2201, 距离下一级还需 799 积分
初级工程师, 积分 2201, 距离下一级还需 799 积分
定时器相关配置对吗
主题帖子积分
初级工程师, 积分 2226, 距离下一级还需 774 积分
初级工程师, 积分 2226, 距离下一级还需 774 积分
主题帖子积分
专家等级:结帖率:100%
主题帖子积分
初级工程师, 积分 2226, 距离下一级还需 774 积分
初级工程师, 积分 2226, 距离下一级还需 774 积分
仔细检查代码,芯片BUG应该不会的
主题帖子积分
初级技术员, 积分 66, 距离下一级还需 34 积分
初级技术员, 积分 66, 距离下一级还需 34 积分
主题帖子积分
专家等级:结帖率:90%
主题帖子积分
初级技术员, 积分 66, 距离下一级还需 34 积分
初级技术员, 积分 66, 距离下一级还需 34 积分
仔细检查代码,芯片BUG应该不会的
这应该不算BUG,严格按照STM32的手册来操作不会有问题,不过我还是认为是STM32设计的不够严谨,因为在PWM禁止输出的状态下,其他某些相关的控制位没有被初始化(这种不初始化的情况是非法的),此时PWM仍然会有波形输出,具体请看主题。
主题帖子积分
助理工程师, 积分 1521, 距离下一级还需 479 积分
助理工程师, 积分 1521, 距离下一级还需 479 积分
主题帖子积分
专家等级:结帖率:0%打赏:0.00受赏:2.00
主题帖子积分
助理工程师, 积分 1521, 距离下一级还需 479 积分
助理工程师, 积分 1521, 距离下一级还需 479 积分
STM32 用高级定时器 T1 生成CH1&&CH4&&的PWM 的初始化程序,大家小走弯路
RCC-&APB2ENR|=1CRH|=0X0000B0 ...
是的,STM32里的定时器众多,分好几类。
STM32 tim1、tim8与其它是不一样,二者称为高级定时器,又成马达定时器,带刹车和死区控制。
BDTR也只有高级定时器有,有个输出主控制位,默认是关闭的,需手动打开才能有OC输出。
主题帖子积分
助理工程师, 积分 1428, 距离下一级还需 572 积分
助理工程师, 积分 1428, 距离下一级还需 572 积分
主题帖子积分
专家等级:结帖率:100%
主题帖子积分
助理工程师, 积分 1428, 距离下一级还需 572 积分
助理工程师, 积分 1428, 距离下一级还需 572 积分
可能是STM32设计的不够严谨,有小的bug也不一定
主题帖子积分
高级工程师, 积分 5240, 距离下一级还需 2760 积分
高级工程师, 积分 5240, 距离下一级还需 2760 积分
主题帖子积分
专家等级:结帖率:100%
主题帖子积分
高级工程师, 积分 5240, 距离下一级还需 2760 积分
高级工程师, 积分 5240, 距离下一级还需 2760 积分
几个高手都说STM32做的很烂,BUG很多,只不过用的人多,软件上可以通过一定方法避免
技术新星奖章
人才类勋章STM32 学习笔记_TIME定时器详解1 - 【stm32/stm8】 -
电子工程世界-论坛
后使用快捷导航没有帐号?
请完成以下验证码
查看: 46091|回复: 21
STM32 学习笔记_TIME定时器详解1
在线时间244 小时
威望1992分
TA的帖子TA的资源
纯净的硅(高级), 积分 1992, 距离下一级还需 8 积分
纯净的硅(高级), 积分 1992, 距离下一级还需 8 积分
STM32 单片机的定时器的确很强大,参考说明书中就占了一百多页,占参考手册1/4 有多了。
STM32的定时器分了好几个类别,各个类别针对功能作用都不大相同。
分有: 一、高级定时器
& && & 二、通用定时器
& && & 三、基本定时器
& && & 四、看门狗定时器
& && & 五、SysTick定时器
& && &其中看门狗定时器和SysTick定时器本篇笔记阐述,这里主要记下对平时使用定时器作用的计时计数器的一些自己的理解。
按照参考手册中的定义 高级定时器 通用定时器 基本定时器,这三个定时器成上下级的关系,即基本定时器有的功能通用定时器都有,而且还增加了向下、向上/向下计数器、PWM生成、输出比较、输入捕获等等功能;而高级定时器又包含了通用定时器的所有功能,另外还增加了死区互补输出、刹车信号、加入重复计数器等等。(这里等等功能请参考《STM32参考手册》)
& && &所以学习STM32 定时器实际就是学习一下高级定时器,然后适当的删减后就是后面的两种定时器了。
假若不涉及输出输入,定时器的最基本用法就是计数定时作用了本篇笔记主要针对这部分的理解所写下的。
高级定时器中一共有20个寄存器:
TIMx_CR1、TIMx_CR2、TIMx_SMCR、TIMx_DIER、TIMx_SR、TIMx_EGR、TIMx_CCMR1、TIMx_CCMR2、
TIMx_CCER、TIMx_CNT、TIMx_PSC、TIMx_ARR、TIMx_RCR、TIMx_CCR1、TIMx_CCR2、TIMx_CCR3、
TIMx_CCR4、TIMx_BDTR、TIMx_DCR、TIMx_DMAR
好吧一堆寄存器光看都看到眼花缭乱了,当然不是所有寄存器都涉及到才能让定时器工作的,例如最基本的定时功能所涉及的只有几个与时基功能相关的寄存器,TIMx_CNT(计数器寄存器)、TIMx_PSC(预分频器寄存器)、TIMx_ARR(自动装载寄存器)、TIMx_RCR(重复次数寄存器)。参考手册中有那么 衣服定时器的框图。这几个寄存器的关系如图所示的:
st.jpg (24.62 KB, 下载次数: 2)
22:23 上传
CK_PSC这根时钟线上的时钟源的选择,即给定时器计数计时的时钟源的输入方式,有四种方式,分别是内部时钟,外部时钟模式1,外部时钟模式2,内部触发。这部分日后再说,这里暂且使用最常用的内部时钟方式,既是当内部时钟为72MHz 的内部时钟源。
如图所示的,时钟源首先进入预分频器,然后再进入预先装入自动重装载寄存器的计数器中,当计数器溢出时产生一次中断和一次事件更新。除了多了一个PSC,其他的基本和51单片机很相似,初次看参考手册中的功能描述中出现了好多次“更新事件(UEV)”。这究竟是怎么的一样东西呢? 在这里有个新概念叫“影子寄存器”,在上图中,可以看到PSC、ARR、REP(重复计数器中的低八位)这三个寄存器框框下都有个黑影,每次这三个寄存器就是影子寄存器,如果看到参考手册全图中还可以看到另外还有几个框框下也有阴影部分的,这几个寄存器也是影子寄存器。何谓影子寄存器呢,例如PSC寄存器可以理解为有两个,一个是用户可以访问到的寄存器,可读可写,另一部分就是客户访问不到的但其装载值和实际寄存器是密切关联的,当程序在运行中改写PSC 这时候影子寄存器的作用就体现了,因为立刻写入的值可能会大于或小于目前正在运行的寄存器中的数值,而真实在运行时候的正是这个影子寄存器中的值,而程序写入的是可访问的寄存器,只有当产生一个更新事件的时候影子寄存器才会读入访问寄存器中的值,这样就可以防止突然修改而产生的非正常中断或不会中断等异常问题。当然在控制器CR1中控制这个影子寄存器是否起作用,不起作用的话就是立即写入这个数值到寄存器中。下面两幅是参考手册中的相关时序图:
1.jpg (76.1 KB, 下载次数: 0)
22:23 上传
2.jpg (80.17 KB, 下载次数: 0)
22:23 上传
回头再说一下“更新事件(UEV)” ,当计数器溢出的时候产生一次UEV事件,另外还可以在事件寄存器TMx_EGR中的UG位软件写入产生一次事件更新,当UEV事件来临的时候所有影子寄存器均载入寄存器中的值,从而实现所有带影子寄存器的更新,而不启用影子寄存器的情况下只能实现,写那个寄存器更新那个寄存器而,这可能造成相关联的寄存器产生冲突矛盾,建议还是开启此功能,在下一个溢出周期后产生事件更新。
& && & (既然说到了影子寄存器也说点自己的猜测,了解了点STM32单片机的都知道几乎所有寄存器都是32位的,唯独TIM寄存器是16位的,是的如果是32位的计数器我们可能还能做更宽广的定时作用。但我们也还是发现即使加入了影子寄存器而整体的寄存器地址依然保持是连续的,这我猜测一种可能性寄存器本身其实还是32位的,但高位提供了影子寄存器的载入功能,所以依然能保持地址连续性,只要设定了高位禁止访问即可。官方资料和搜索中均未有任何确认说法,纯粹本人猜测未得到官方任何证实)
& &&&另外高级定时器中还有RCR重复次数寄存器这个,也是比较简单的事件更新(UEV) 都是在RCR为0的情况下产生计数器溢出而产生的,当RCR中不为0的时候计数器溢出只会使得重复次数寄存器递减而不会产生UEV,这样就可以使得定时器的定时情况得以延长,而相当于有16位的分频器,16位的计数器,再加入16位的重复次数,一共48位的计数定时器。详细看参考手册,这个很好理解。
& & 基本的基时单元就是上面提及的这几个,下面看看3.0库是如何实习的基本使用。
TIM_TimeBaseInitTypeDef TIM_TimeBaseS
& && &TIM_DeInit(TIM2);& && && && && && && && && && && && && && & //重新将Timer设置为缺省值
& && &TIM_InternalClockConfig(TIM2);& && && && && && && && && && &//采用内部时钟给TIM2提供时钟源& && &
& && &TIM_TimeBaseStructure.TIM_Prescaler = 36000 - 1;& && && && &//预分频系数为36000-1,这样计数器时钟为72MHz/36000 = 2kHz& && &
& && &TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;& &&&//设置时钟分割& && &
& && &TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //设置计数器模式为向上计数模式& && &
& && &TIM_TimeBaseStructure.TIM_Period = 2000 - 1;& && && &&&//设置计数溢出大小,每计2000个数就产生一个更新事件
& && &TIM_TimeBaseInit(TIM2,&TIM_TimeBaseStructure);& && && &//将配置应用到TIM2中
& && &TIM_ClearFlag(TIM2, TIM_FLAG_Update);& && && && && && &//清除溢出中断标志&&
& && &TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);& && && && && & //开启TIM2的中断
以上是一个最基本的定时器配置的代码,载自网上被转载无数次的地方……
中断函数自己按照需求写,这里不多说。
在库中的初始化函数和初始化数据类型有3类,TIM_TimeBaseInitTypeDef、TIM_OCInitTypeDef、TIM_ICInitTypeDef
与基时参数相关的数据类型是TIM_TimeBaseInitTypeDef
typedef struct
&&uint16_t TIM_P& && && &/*!& Specifies the prescaler value used to divide the TIM clock.
& && && && && && && && && && && && && &This parameter can be a number between 0x0000 and 0xFFFF */
&&uint16_t TIM_CounterM& && & /*!& Specifies the counter mode.
& && && && && && && && && && && && && &This parameter can be a value of @ref TIM_Counter_Mode */
&&uint16_t TIM_P& && && && &/*!& Specifies the period value to be loaded into the active
& && && && && && && && && && && && && &Auto-Reload Register at the next update event.
& && && && && && && && && && && && && &This parameter must be a number between 0x0000 and 0xFFFF.&&*/
&&uint16_t TIM_ClockD& &&&/*!& Specifies the clock division.
& && && && && && && && && && && && &&&This parameter can be a value of @ref TIM_Clock_Division_CKD */
&&uint8_t TIM_RepetitionC&&/*!& Specifies the repetition counter value. Each time the RCR downcounter
& && && && && && && && && && && && && &reaches zero, an update event is generated and counting restarts
& && && && && && && && && && && && && &from the RCR value (N).
& && && && && && && && && && && && && &This means in PWM mode that (N+1) corresponds to:
& && && && && && && && && && && && && && &- the number of PWM periods in edge-aligned mode
& && && && && && && && && && && && && && &- the number of half PWM period in center-aligned mode
& && && && && && && && && && && && &&&This parameter must be a number between 0x00 and 0xFF.
& && && && && && && && && && && && && &@note This parameter is valid only for TIM1 and TIM8. */
} TIM_TimeBaseInitTypeD
以上是从库stm32f10x_tim.h中 截取的代码,整体的数据结构可以中这段注释中得知,不懂E文的要么翻字典要么翻库函数中文翻译
版本(当然这个是2.0的库,有部分会和3.0后的版本很不相同),这部分的数据类型还是很一样的,不多说。
接着就是TIM_TimeBaseInit()这个函数了,在stm32f10x_tim.c的224行中
void TIM_TimeBaseInit(TIM_TypeDef* TIMx, TIM_TimeBaseInitTypeDef* TIM_TimeBaseInitStruct)
&&uint16_t tmpcr1 = 0;
&&/* Check the parameters */
&&assert_param(IS_TIM_ALL_PERIPH(TIMx));
&&assert_param(IS_TIM_COUNTER_MODE(TIM_TimeBaseInitStruct-&TIM_CounterMode));
&&assert_param(IS_TIM_CKD_DIV(TIM_TimeBaseInitStruct-&TIM_ClockDivision));
&&tmpcr1 = TIMx-&CR1;&&
&&if((TIMx == TIM1) || (TIMx == TIM8)|| (TIMx == TIM2) || (TIMx == TIM3)||
& &&&(TIMx == TIM4) || (TIMx == TIM5))
& & /* Select the Counter Mode */
& & tmpcr1 &= (uint16_t)(~((uint16_t)(TIM_CR1_DIR | TIM_CR1_CMS)));
& & tmpcr1 |= (uint32_t)TIM_TimeBaseInitStruct-&TIM_CounterM
&&if((TIMx != TIM6) && (TIMx != TIM7))
& & /* Set the clock division */
& & tmpcr1 &= (uint16_t)(~((uint16_t)TIM_CR1_CKD));
& & tmpcr1 |= (uint32_t)TIM_TimeBaseInitStruct-&TIM_ClockD
&&TIMx-&CR1 = tmpcr1;
&&/* Set the Autoreload value */
&&TIMx-&ARR = TIM_TimeBaseInitStruct-&TIM_P
&&/* Set the Prescaler value */
&&TIMx-&PSC = TIM_TimeBaseInitStruct-&TIM_P
&&if ((TIMx == TIM1) || (TIMx == TIM8)|| (TIMx == TIM15)|| (TIMx == TIM16) || (TIMx == TIM17))&&
& & /* Set the Repetition Counter value */
& & TIMx-&RCR = TIM_TimeBaseInitStruct-&TIM_RepetitionC
&&/* Generate an update event to reload the Prescaler and the Repetition counter
& &&&values immediately */
&&TIMx-&EGR = TIM_PSCReloadMode_I& && && &&&
可以看3.0后的函数里把所有的TIMx都加入一个函数里面做判断了,不需要和2.0的区分TIM1和TIM 两类函数,比较其基本操作都一样无非就是多了一个两个寄存器而已。
程序中可以看到这一段:
&&if((TIMx == TIM1) || (TIMx == TIM8)|| (TIMx == TIM2) || (TIMx == TIM3)||
& &&&(TIMx == TIM4) || (TIMx == TIM5))
& & /* Select the Counter Mode */​
& & tmpcr1 &= (uint16_t)(~((uint16_t)(TIM_CR1_DIR | TIM_CR1_CMS)));
& & tmpcr1 |= (uint32_t)TIM_TimeBaseInitStruct-&TIM_CounterM
if((TIMx != TIM6) && (TIMx != TIM7))
& & /* Set the clock division */& &
& & tmpcr1 &= (uint16_t)(~((uint16_t)TIM_CR1_CKD));& &&&
& & tmpcr1 |= (uint32_t)TIM_TimeBaseInitStruct-&TIM_ClockD& &
TIMx-&CR1 = tmpcr1;
& & 高级定时器和通用定时器拥有向上计数、向下技术、向上/向下模式,三种,而基本计时器只有向上计数一种,因此TIM6和TIM7木有的设置计数模式,tmpcr1首先装入了控制寄存器CR1d 值,然后把其中DIR(位4)和CMS(位6:5)清除,然后或运算上载入数据结构中的值,这里代码再跳转到stm32f10x_tim.h中第362行
#define TIM_CounterMode_Up& && && && && &&&((uint16_t)0x0000)
#define TIM_CounterMode_Down& && && && && &((uint16_t)0x0010)
#define TIM_CounterMode_CenterAligned1& &&&((uint16_t)0x0020)
#define TIM_CounterMode_CenterAligned2& &&&((uint16_t)0x0040)
#define TIM_CounterMode_CenterAligned3& &&&((uint16_t)0x0060) 定义的是TIM_CounterMode的几种情况,即控制计数器向上
技术或向下计数,或是向上向下交替计数,当设置的是交替计数的情况DIR位为只读。
TIM_ClockDivision为时钟分配因子,其中有 0、2x、4x ,在AHB低时钟时为提高定时精度而实用的倍频器,位于CR1寄存器中的位9:8。这段程序便配置好了CR1寄存器,然后再看下面的程序。 载入了PSC寄存器和ARR寄存器值,如果是高级定时器还有RCR寄存器值,在这一步便基本配置得差不多了,但还是发现函数最后还有一句 TIMx-&EGR = TIM_PSCReloadMode_I 这里在事件寄存器中做了一次软件的事件更新触发 使得其UG位置1。
#define TIM_PSCReloadMode_Immediate& && &&&((uint16_t)0x0001)
基本定时器的工作原理便如本文所述,如有错误非常感谢您的指出。
[ 本帖最后由 虚V界 于
22:23 编辑 ]
不错哦,最近正为学定时器发愁喃,谢谢!&
TIM_TimeBaseStructure.TIM_Prescaler = 0;
TIM_TimeBaseStructure.TIM_ClockDivision = 0;
请问下楼主要是这样配置的话计数时钟是多少啊?&
霸气 楼主mark&
&&&&&&&&&&
在线时间1632 小时
威望23656分
芯币12849枚
E金币214枚
TA的帖子TA的资源
丫的,为啥你不能弄stm8s呢?或者说我当初为啥不搞stm32
棍哥,你有啥想法??&
没有一件事情是容易的,所以,起念头时,一定要好好琢磨
在线时间244 小时
威望1992分
TA的帖子TA的资源
纯净的硅(高级), 积分 1992, 距离下一级还需 8 积分
纯净的硅(高级), 积分 1992, 距离下一级还需 8 积分
你快来搞STM32吧,哥再做一版的时候送你一块PCB
哥对它的成本纠结不已&
在线时间1632 小时
威望23656分
芯币12849枚
E金币214枚
TA的帖子TA的资源
回复 板凳 虚V界 的帖子
哥对它的成本纠结不已
没有一件事情是容易的,所以,起念头时,一定要好好琢磨
在线时间2 小时
TA的帖子TA的资源
一粒金砂(初级), 积分 0, 距离下一级还需 5 积分
一粒金砂(初级), 积分 0, 距离下一级还需 5 积分
回复 楼主 虚V界 的帖子
霸气 楼主mark
在线时间244 小时
威望1992分
TA的帖子TA的资源
纯净的硅(高级), 积分 1992, 距离下一级还需 8 积分
纯净的硅(高级), 积分 1992, 距离下一级还需 8 积分
是不是字太多没人看啊,呵呵
在线时间3 小时
TA的帖子TA的资源
一粒金砂(初级), 积分 0, 距离下一级还需 5 积分
一粒金砂(初级), 积分 0, 距离下一级还需 5 积分
在线时间46 小时
TA的帖子TA的资源
一粒金砂(中级), 积分 50, 距离下一级还需 150 积分
一粒金砂(中级), 积分 50, 距离下一级还需 150 积分
回复 楼主 虚V界 的帖子
TIM_TimeBaseStructure.TIM_Prescaler = 0;& && && && && &
& &TIM_TimeBaseStructure.TIM_ClockDivision = 0;
请问下楼主要是这样配置的话计数时钟是多少啊?
如果TIM_Period=0,就是无分频状态,当前系统频率如果是72M的就是72M,&
在线时间244 小时
威望1992分
TA的帖子TA的资源
纯净的硅(高级), 积分 1992, 距离下一级还需 8 积分
纯净的硅(高级), 积分 1992, 距离下一级还需 8 积分
回复 8楼 倚天看海 的帖子
如果TIM_Period=0,就是无分频状态,当前系统频率如果是72M的就是72M,
在线时间1 小时
TA的帖子TA的资源
一粒金砂(中级), 积分 10, 距离下一级还需 190 积分
一粒金砂(中级), 积分 10, 距离下一级还需 190 积分
影子寄存器
& && &自动转载寄存器和影子寄存器是两个相互关联的寄存器,影子寄存器是用来计数用的,它的值在程序运行中是变化的;自动转载寄存器是用来保存预装载值的。当然这也纯属我个人猜想,不一定正确。
在线时间32 小时
TA的帖子TA的资源
一粒金砂(中级), 积分 160, 距离下一级还需 40 积分
一粒金砂(中级), 积分 160, 距离下一级还需 40 积分
回复 楼主 虚V界 的帖子
不错哦,最近正为学定时器发愁喃,谢谢!
在线时间4 小时
TA的帖子TA的资源
一粒金砂(中级), 积分 10, 距离下一级还需 190 积分
一粒金砂(中级), 积分 10, 距离下一级还需 190 积分
在线时间3 小时
TA的帖子TA的资源
一粒金砂(初级), 积分 0, 距离下一级还需 5 积分
一粒金砂(初级), 积分 0, 距离下一级还需 5 积分
在线时间0 小时
TA的帖子TA的资源
一粒金砂(初级), 积分 0, 距离下一级还需 5 积分
一粒金砂(初级), 积分 0, 距离下一级还需 5 积分
不错,很有用,谢谢!
在线时间15 小时
TA的帖子TA的资源
宇宙尘埃, 积分 -2, 距离下一级还需 2 积分
宇宙尘埃, 积分 -2, 距离下一级还需 2 积分
在线时间6 小时
TA的帖子TA的资源
一粒金砂(中级), 积分 10, 距离下一级还需 190 积分
一粒金砂(中级), 积分 10, 距离下一级还需 190 积分
丫的,为啥你不能弄stm8s呢?或者说我当初为啥不搞stm32
棍哥,你有啥想法??
在线时间41 小时
TA的帖子TA的资源
一粒金砂(中级), 积分 34, 距离下一级还需 166 积分
一粒金砂(中级), 积分 34, 距离下一级还需 166 积分
好东西,谢谢楼主,解决我的大问题,在定时器上犯难好几天了
在线时间0 小时
TA的帖子TA的资源
一粒金砂(初级), 积分 0, 距离下一级还需 5 积分
一粒金砂(初级), 积分 0, 距离下一级还需 5 积分
楼主我可以加你qq吗?
现在定时器遇到了很大的问题
直接发你的问题即可,论坛很多人都可以帮忙的&
在线时间9534 小时
威望185611分
芯币17584枚
TA的帖子TA的资源
楼主我可以加你qq吗?
现在定时器遇到了很大的问题
直接发你的问题即可,论坛很多人都可以帮忙的
2017,加油!继续为中国电子行业做出小小的贡献吧!
在线时间7 小时
TA的帖子TA的资源
一粒金砂(初级), 积分 0, 距离下一级还需 5 积分
一粒金砂(初级), 积分 0, 距离下一级还需 5 积分
月度明星人物:发布原创文章且得到网友好评
EEWORLD 官方微信
EE福利 唾手可得
Powered by}

我要回帖

更多关于 单片机定时器中断程序 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信