打印
[信息]

【实战经验】STM32F1通用定时器示例详解--TimeBase

[复制链接]
1952|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 香水城 于 2017-8-17 14:39 编辑

【实战经验】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,

修改过来,然后发现程序就运行正常了,但是当自己再次想复现该现象时,修改回 72Mhz,发现原来的现象再也不复现了。
由于是超频使用了,不符合手册规范,所以这种情况是有可能的;在此,仅是提醒各位,配置时,这一块也要注意,否则可能会出现错误。



综合上述,本案例中,Timer 的时钟源选择的是 Internal clock,CK_PSC 的时钟频率其实就是时钟树图中的输出 TIMxCLK,然后 TIMxCLK 或 CK_PSC 经过预分频器,才是最终用于计数的时钟基本单位(clock input,输入时钟)。另外,


配置的模式为 TIM_OCMode_Timing (值为 0x00),即是冻结 Forzen,适用于产生一个基准时钟;TIM_OutputState_Enable 输出使能;TIM_OCPolarity_High 的值为零,代表的是高电平有效;TIM_OCPreload_Disable 不允许预装载;最后TIM_Cmd(TIM2, ENABLE);,使能定时器;


这时会发现,它的周期变为了上述的约一半。示波器测试是 :45.9 Hz,50%PWM ;这是怎么回事呢 ?怎么解释?上述是update rate,所以周期是其一半。缩小 CCR 的值试试看是什么在影响,其实如果了解其定时机理,就不难了解,
该示例中,CCR1_Val 中的值定义为 40961,周期值 TIM_Period 定义为 65535;定时器是向上计数模式,计到 ARR 会变为0 重新计数;
所以,对于中断的第一个截图,有函数 capture = TIM_GetCapture1(TIM2),通过变量观测 capture 的值总是 = CCR1_Val =
CCR1 = 40961,然后再利用 TIM_SetComparel 的函数重新设置 CCR1 的值,在这里,CCR1_Val 的值可以理解为步长,每
隔 CCR1_Val 个计数时间,GPIO 口翻转一次,所以 :CC1 update rate = TIM2 counter clock/ CCR1_Val = 6000000 / 40961 = 146.48Hz,从而 PWM 的频率为 146.48/2 = 73Hz。
对于中断的第二个截图,它一开始是计数到 CCR1_Val 进入中断,GPIO 翻转一次(由于 GPIO 初始定义为 0,所以用示波器,触发模式,从波形上看不出来,如果设置初始值为高电平,则会看到一次宽度不一样的翻转),然后其实是每隔 65535 个计数时间,GPIO 口翻转一次,此时与 CCR1_Val 无关,所以 :CC1 update rate = TIM2 counter clock/ CCR1_Val = 6000000 / 65535= 91.5Hz,从而 PWM 的频率为 91.5/2 = 45.7Hz。符合描述。




对应的pdf:STM32F1通用定时器示例详解_TimeBase
更多实战经验请看:【ST MCU实战经验汇总贴】





沙发
豆腐块| | 2015-6-30 15:51 | 只看该作者
这东西真是学不完啊,谢谢版主

使用特权

评论回复
板凳
冰河w| | 2015-6-30 22:09 | 只看该作者
CPU clock 原来的定义是 72Mhz,查看手册,该颗 MCU 最大只有 24Mh,貌似这里是关键

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

认证:意法半导体(中国)投资有限公司
简介:STM32技术专家

596

主题

17106

帖子

287

粉丝