基于STM8的TIM定时器操作

1. 综述

  STM8S提供三种类型的 TIM 定时器:高级控制型(TIM1)、通用型(TIM2/TIM3/TIM5)和基本型定时器(TIM4/TIM6)。它们虽有不同功能但都基于共同的架构。此共同的架构使得采用各个定时器设计应用变得非常容易与方便(相同的寄存器映射,相同的基本功能)。

  本文只针对STM8S103该芯片进行介绍,STM8S的定时器个数为3个,每个类型的定时器都一个,分别为高级控制型(TIM1)、通用型(TIM2)、基本型定时器(TIM4)。

2. 关于STM8S103手册的TIM简介

  每个定时器的功能都有详细介绍,大家可以认真看下。

3. TIMx详细讲解

3.1 TIM1解析

  TIM1_Prescaler          :即预分频系数,带有16位预分频的16位递增、递减和双向(递增/递减)自动重载计数器。

  TIM1_CounterMode      :即计数模式,共有3种计数模式,分别为是向上计数模式、向下计数模式、中央对齐模式(该模式又含有3种对齐模式)。

  TIM1_Period                 :自动重载值,此项可取1-65535任意数值。

  TIM1_RepetitionCounter :重复计数器值。

  假设我们的系统时钟是16Mhz,我们定时1秒钟,那我们初始化设置应该为:

    TIM1_TimeBaseInit(15,TIM1_COUNTERMODE_UP,1000,100);

  计算方法:定时器的频率fcnk = 16Mhz/(15+1) = 1Mhz,说明一次计数为1us,1000次计数为1ms,而重复计数100次,则一次中断计时时间为100ms,为了到达1s的效果,          我们还需要在中断函数里面,进行一个10次的判断。

  

3.2 TIM2解析

  TIM2_Prescaler          :15位的预分频系数,分频系数可调整为1~32768之间的2次幂数值。

  TIM2_Period       :自动重载值,此项可取1-65535任意数值。

  假设我们的系统时钟是16Mhz,我们定时1秒钟,那我们初始化设置应该为:

  TIM2_TimeBaseInit(TIM2_PRESCALER_16, 1000);

  计算方法:定时器的频率fcnk = 16Mhz/(16) = 1Mhz,说明一次计数为1us,1000次计数为1ms,重复计数默认1次,则中断一次时时间为1ms,为了到达1s的效果,我们还需          要载中断函数里面,进行一个1000次的判断。

3.3 TIM4解析

  TIM4_Prescaler     :8位自动装载可调整的预分频系数,分频系数可调整为1~128之间2次幂数值。

  TIM4_Period       :自动重载值,此项可取1-255任意数值。

  

  假设我们的系统时钟是16Mhz,我们定时1秒钟,那我们初始化设置应该为:

  TIM4_TimeBaseInit(TIM4_PRESCALER_128, 250);

  计算方法:定时器的频率fcnk = 16Mhz/(128) = 0.125Mhz,说明一次计数为8us,250次计数为2ms,重复计数默认1次,则中断一次时时间为2ms,为了到达1s的效果,我们            还需要载中断函数里面,进行一个500次的判断。

4. 代码

所有的参数配置和计算过程都有在3.TIMx中讲解,看官们可以认真看下。

4.1 TIM1

初始化:

 1 /*******************************************************************************
 2 * Function Name  : MX_TIM1_Init
 3 * Description    : TIM1 Init
 4 * Input          : None
 5 * Output         : None
 6 * Return         : None
 7 ********************************************************************************/
 8 void MX_TIM1_Init(void)
 9 {
10
11   TIM1_TimeBaseInit(15, TIM1_COUNTERMODE_UP, 1000, 100);
12
13   //Clear TIM1 update flag
14   TIM1_ClearFlag(TIM1_FLAG_UPDATE);
15
16   //Enable update interrupt
17   TIM1_ITConfig(TIM1_IT_UPDATE, ENABLE);
18   TIM1_Cmd(ENABLE);
19
20   //使能中断
21   enableInterrupts();
22 }

中断服务函数:

 1 INTERRUPT_HANDLER(TIM1_UPD_OVF_TRG_BRK_IRQHandler, 11)
 2 {
 3   /* In order to detect unexpected events during development,
 4      it is recommended to set a breakpoint on the following instruction.
 5   */
 6   static uint8_t count = 0;
 7
 8   if(count++ == 10)
 9   {
10     //翻转LED
11     GPIO_WriteReverse(Led_Opt_GPIO_Port, Led_Opt_Pin);
12
13     count = 0;
14   }
15   //定时器1的标志位清零
16   TIM1_ClearITPendingBit(TIM1_IT_UPDATE);
17 }

4.2 TIM2

初始化:

 1 /*******************************************************************************
 2 * Function Name  : MX_TIM2_Init
 3 * Description    : TIM1 Init
 4 * Input          : None
 5 * Output         : None
 6 * Return         : None
 7 ********************************************************************************/
 8 void MX_TIM2_Init(void)
 9 {
10   //TIM2 Init
11   TIM2_TimeBaseInit(TIM2_PRESCALER_16, 1000);
12
13   //Clear TIM1 update flag
14   TIM2_ClearFlag(TIM2_FLAG_UPDATE);
15
16   //Enable update interrupt
17   TIM2_ITConfig(TIM2_IT_UPDATE, ENABLE);
18   TIM2_Cmd(ENABLE);
19
20   //使能中断
21   enableInterrupts();
22 }

中断服务函数:

 1  INTERRUPT_HANDLER(TIM2_UPD_OVF_BRK_IRQHandler, 13)
 2  {
 3   /* In order to detect unexpected events during development,
 4      it is recommended to set a breakpoint on the following instruction.
 5   */
 6   uint16_t static count = 0;
 7
 8   if(count++ == 1000)
 9   {
10     //翻转LED
11     GPIO_WriteReverse(Led_Opt_GPIO_Port, Led_Opt_Pin);
12
13     count = 0;
14   }
15   //定时器2的标志位清零
16   TIM2_ClearITPendingBit(TIM2_IT_UPDATE);
17  }

4.3 TIM4

初始化:

 1 /*******************************************************************************
 2 * Function Name  : MX_TIM4_Init
 3 * Description    : TIM1 Init
 4 * Input          : None
 5 * Output         : None
 6 * Return         : None
 7 ********************************************************************************/
 8 void MX_TIM4_Init(void)
 9 {
10
11   //TIM4 Init
12   TIM4_TimeBaseInit(TIM4_PRESCALER_128, 250);
13
14   //Clear TIM4 update flag
15   TIM4_ClearFlag(TIM4_FLAG_UPDATE);
16
17   //Enable update interrupt
18   TIM4_ITConfig(TIM4_IT_UPDATE, ENABLE);
19   TIM4_Cmd(ENABLE);
20
21   //使能中断
22   enableInterrupts();
23 }

中断服务函数:

 1  INTERRUPT_HANDLER(TIM4_UPD_OVF_IRQHandler, 23)
 2  {
 3   /* In order to detect unexpected events during development,
 4      it is recommended to set a breakpoint on the following instruction.
 5   */
 6
 7   static uint16_t count = 0;
 8
 9   if(count++ == 500)
10   {
11     //翻转LED
12     GPIO_WriteReverse(Led_Opt_GPIO_Port, Led_Opt_Pin);
13
14     count = 0;
15   }
16   //定时器4的标志位清零
17   TIM4_ClearITPendingBit(TIM4_IT_UPDATE);
18
19  }

5. 结尾 

  本博客只介绍了如何控制LED翻转,但定时器的功能远不止于此,详情请大家自行去了解。

  相对来说,STM8的定时器功能还是比较有用的,希望该博客能够帮助到大家实现TIM功能。

  对STM8的GPIO的说明和引用到这里结束,感谢各位看官的点击。

  如果觉得有所收获请点下推荐,若认为该博客中存在错误的说明或者对博客中某方面有疑问请留言。

作 者:浩宇99?
出 处:https://www.cnblogs.com/zhenghaoyu/p/10704702.html版权声明:本文原创发表于 博客园,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则视为侵权。

原文地址:https://www.cnblogs.com/zhenghaoyu/p/10704702.html

时间: 2024-09-29 04:42:06

基于STM8的TIM定时器操作的相关文章

模拟串口--基于STM8普通IO口的模拟串口驱动程序

基于STM8普通IO口的模拟串口驱动程序 标准串口通讯数据的格式为:起始位(1) + 数据位(8) + 校验位(1) + 停止位(1) 串口通讯另外一个重要的的部分是设置波特率,波特率就是1秒钟内串口所传输的Bit(位)数. 关于采样频率:为了较小读取或者发送串行数据的误差,我们采取了在N(我用的是4次)次中断中,取固定位置的读取的数据. 我以stm8中9600波特率计算的过程为例:(1秒钟传输9600位) 可以计算出传输1位所需要的时间 T1 = 1/9600 约为104us 由此可知,发送一

基于OCILIB的oracle数据库操作总结及自动生成Model和Dao的工具

基于OCILIB的oracle数据库操作总结 1.       类图 2.       基类BaseOCIDao的设计与实现 BaseOCIDao.h头文件 #pragma once /* --------------------------------------------------------------------------------------------- * * INCLUDES * ----------------------------------------------

基于ip san的iscsi操作实现过程

SAN是storage area network(存储区域网络)的简写,早期的san采用的是光纤通道技术,后期当iscsi协议出现以后,为了区分两者,就划分了IP SAN和FC SAN.FC SAN由于其昂贵的价格让许多企业退避三舍,IP SAN作为一个很好的代替产品出现在了人们的视线中.现在大部分存储设备提供支持基于TOE技术的接口,可以在硬件基础上处理TCP/IP协议.这意味着ISCSI设备可以处理速度已接近GigE.约100MB/秒的数据传输速率来处理I/O进程,其速率可与FC SAN的相

四、基于文件指针的文件操作

基于文件指针的文件操作(缓冲) linux的文件和文件描述符 linux中对目录和设备的操作都是文件操作,文件分为普通文件,目录文件,链接文件和设备文件. 普通文件:也称磁盘文件,并且能够进行随机的数据存储(能够自由seek定位到某一个位置): 管道:是一个从一端发送数据,另一端接收数据的数据通道: 目录:也称为目录文件,它包含了保存在目录中文件列表的简单文件. 设备:该类型的文件提供了大多数物理设备的接口.它又分为两种类型:字符型设备和块设备. 字符型设备一次只能读出和写入一个字节的数据,包括

TIM定时器的应用

TIM定时器的应用   ①输入捕获的应用: 上一节,我已阐述TIM的输入捕获具体作用有两个(如下图):     对输入信号的测量:                                     测量信号周期或频率:              1)value1     当捕获通道 TIx上出现上升沿时,发生第一次捕获,计数器 CNT 的值会被锁存到捕获寄存器 CCR 中,而且还会进入捕获中断,在中断服务程序中记录一次捕获(可以用一个标志变量来记录),并把捕获寄存器中的值读取到 value

2017-3-31 操作属性 定时器 操作内容 操作相关元素 元素创建添加删除

(一)操作属性 1.对象.setAttribute('属性名','属性值');  --- 添加属性 例子:把所有class为div的,字体改为30px: var a document.getElementById('div'); for(var i=o;i<a.length;i++){ a[i].setAttribute('style','font-size=30px');或者用a[i].style.fontSize='30px'; } 2.对象.getAttribute('属性名'); - 获

【C#】分享基于Win32 API的服务操作类(解决ManagedInstallerClass.InstallHelper不能带参数安装的问题)

注:这里的服务是指Windows 服务. 市面上常见的安装一个服务的方法大概有这么几种: 用Process类调用sc.exe.Installutil.exe等外部工具进行安装.极不推荐,须知创建一个进程开销不小,并且依赖外部工具有损程序健壮性 使用TransactedInstaller和AssemblyInstaller安装类进行安装.不推荐,既然都用托管方法,何不用更好的方法呢 用ManagedInstallerClass.InstallHelper进行安装.这个我认为是托管方法中首选的方法,

Asp.net Core基于MVC框架实现PostgreSQL操作

简单介绍 Asp.net Core最大的价值在于跨平台.跨平台.跨平台.重要的事情说三遍.但是目前毕竟是在开发初期,虽然推出了1.0.0 正式版,但是其实好多功能还没有完善.比方说编译时的一些文件编码问题,辅助工具Tools的一些Bug,还有一些好用的模板和平台实现尚未完成等一些问题.但这毕竟是一个好的开始,并且在Github上,大家都还在积极的完善,你也可以参与进来.地址:https://github.com/aspnet Asp.net Core在学习的时候,首先你应该跟着微软官方的入门教材

基于Linux的I/O操作

Linux文件的I/O编程 Linux中文件及文件描述符简介 在Linux中对目录和涉笔的操作都等同于文件的操作 Linux中的文件主要有以下4种:普通文件.目录文件.连接文件和设备文件 在Linux下,所有对设备和文件的操作都使用文件描述符来进行的 一个进程的启动,一般伴随三个文件的打开:标准输入(STDIN_FILENO).标准输出(STDOUT_FILENO).标准错误(STDERR_FILENO) 基本I/O操作函数-->不带缓存: open.read.write.lseek以及clos