找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 11025|回复: 1
收起左侧

STM8L的TIM4定时功能详解 含例程

[复制链接]
ID:140343 发表于 2016-10-10 00:45 | 显示全部楼层 |阅读模式
TIM4是STM8最简单的定时器,忽略掉级联同步的功能,TIM4就只具有定时功能.非常适合刚刚接触STM8定时器的初学者学习.
从上图可以看到,TIM4由一个分频器,自动重装寄存器和计数器组成,结构非常简单.
系统主时钟fsysclk经TIM4分频器分频后,提供给TIM4作为计数时钟.
TIM4是一个向上计数的定时器.从0开始计数,当计数到与自动重载寄存器的值相等时,产生溢出,重新从0开始计数.

定时器溢出时,如果TIM4_CR1中的UDIS位为0,则产生一个更新事件,若此时打开了TIM4的中断,则进入中断.如果溢出时,UDIS为1,则不会进入中断.


本文利用TIM4的定时功能,实现LED闪烁.TIM4周期性的进入中断,翻转LED控制IO,控制LED闪烁.
在程序中有对定时时间计算的过程,这里再重复一遍.
系统时钟频率默认为:16M/ 2^3 =2M
本例程中TIM4的分频器分频值为10,则最终提供给TIM4的频率为:2M/2^10=2M/1024=1953.125Hz.
本例程TIM4的重装值为200,所以TIM4的溢出频率为:1953.125Hz/200=9.76Hz.
溢出周期为:1000ms/9.76=102.4ms
所以每隔102ms,会进入一次定时器中断.
下图是,使用逻辑分析仪,测到的LED的控制IO的输出波形,可以看到,LED亮和灭的时间都为102.8ms.与理论计算值一致,误差是由于使用的是内部时钟,这个时钟不准.




  1. /*硬件连接*/

  2. // PC7---->LED

  3. /****************************************************************************************

  4. *开发环境:IAR for stm8 v6.5.3

  5. *硬件平台:STM8L-DISCOVERY

  6. *功能说明:配置TIM4定时器,实现定时进入TIM4中断,反转LED电平,测量LED的IO得到频率,与理论计算时间比对,验证定时功能

  7. *作    者:茗风

  8. ****************************************************************************************/

  9. #include"iostm8l152c6.h"

  10. #include"stdint.h"

  11. /******************************************************************************************************

  12. *  名    称:void GPIO_Init(void)

  13. *  功    能:初始化PC7为高速推挽输出

  14. *  入口参数:无

  15. *  出口参数:无

  16. *  说    明:测量系统时钟频率的IO,测量到的频率有定时器配置决定

  17. *  范    例:无

  18. ******************************************************************************************************/

  19. void GPIO_Init(void)

  20. {

  21.    PC_CR1_C17  =1;//推挽输出

  22.    PC_CR2_C27  =1;//高速输出

  23.    PC_DDR_DDR7 =1;//PC4输出

  24. //   PC_ODR_ODR7 =0;//输出低电平

  25. }

  26. /******************************************************************************************************

  27. *  名    称:void TIMER4_Init(void)

  28. *  功    能:stm8的TIM4定时器初始化

  29. *  入口参数:无

  30. *  出口参数:无

  31. *  说    明:TIM4被此函数配置为204ms进入一次TIM4中断,由于使用的是内部RC时钟,实际时间会有一定偏差

  32. *  范    例:无

  33. ******************************************************************************************************/

  34. void TIMER4_Init(void)

  35. {

  36.   //-------打开TIM4外设时钟-------

  37.   CLK_PCKENR1_PCKEN12=1;//打开定时器1时钟

  38.   

  39.   //----禁用预装载寄存器----

  40.   TIM4_CR1_ARPE =0;//不经过缓存,分频值和重装值立即被写入.

  41.   //除非需要频繁的在定时器运行时,改变分频值和重装值,否则没必要使用预装载寄存器

  42.   

  43.   //------设置TIM4时钟分频值------

  44.   TIM4_PSCR_PSC=10;//分频值  2M/2^10=2M/1024=1953.125Hz


  45.   

  46.   //-重装值,TIM4从0计数到此值,发生溢出-

  47.   TIM4_ARR=200;//自动重装值    1953.125Hz/200=9.76HZ

  48.   //1000ms/9.76=102ms

  49.   //TIM4定时器每隔102ms进入一次中断

  50.   //本程序,每次进入中断后会反转接LED的IO电平,所以LED闪烁周期为2*102ms=204ms

  51.   //LED闪烁频率为 1000ms/204ms=4.9Hz

  52.   

  53.   //读者可以改变ARR值和PSC值,根据上面计算过程,验证定时器的这种功能

  54.   

  55.   TIM4_CR1_URS=1;//仅当计数器溢出时才发生中断请求

  56.   TIM4_CR1_UDIS=0;//允许更新中断


  57.   TIM4_CR1_CEN=1;//开启计数器

  58.   TIM4_IER_UIE=1;// update interrupt enable

  59. }

  60. /******************************************************************************************************

  61. *  名    称:int main(void)

  62. *  功    能:通过PC4输出选择的时钟

  63. *  入口参数:无

  64. *  出口参数:无

  65. *  说    明:因为STM8l discovery没有接外部高速晶振,所以没办法输出HSE,不要

  66. *  范    例:无

  67. ******************************************************************************************************/

  68. void main( void )

  69. {

  70.   GPIO_Init();

  71.   TIMER4_Init();

  72.   asm("rim");               //开启全局中断

  73.   while(1)

  74.   {

  75.   //   asm("wfi");

  76.   }

  77. }

  78. #pragma vector=TIM4_UIF_vector

  79. __interrupt void TIM4_UIF_ISR (void)

  80. {

  81.    PC_ODR_ODR7 ^=1;//控制LED1的亮灭

  82.    TIM4_SR1_UIF=0;//清除中断标志位

  83. }
复制代码




回复

使用道具 举报

ID:18591 发表于 2019-2-4 15:01 | 显示全部楼层
感謝分享!!!!!!!!!!!!!!!!!!!!!!!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表