1. 综述

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

  本文只针对STM8S103该芯片进行介绍,该芯片的定时器个数为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次的判断。(1MHZ = 1000KHZ = 1000000HZ, 相当于 1/1000000 = 1us)

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. 例程

4.1 编译环境

  我的编译环境是IAR,这款软件是现在STM8的主流平台,比较推荐。不过我打算等到STCubeMX更新出比较方便的版本后再去使用Keil5,因为在用STM32的时候就是利用Keil5编译代码,的确很方便。

4.2 主芯片

  我的主芯片是STM8S系列中的103,其中STM8S的003、005、和103、105,配置一样(外设和CPU频率,FLASH),在代码相同的情况下均可进行烧写。

4.3 库文件的添加

  我们的工程可以在IAR中的官方例程中复制,操作过程:打开STM8S_StdPeriph_Lib(这是一个官方的库文件,下载IAR STM8包的时候就携带,里面有库文件和相对应的例程),将Libraries文件复制到你工程所在的文件下,并将有关于ADC的库文件添加到你的工程列表当中。添加完成后,就可以开始编写代码了(如果你将全部的库文件都添加进来的话,编译程序后库文件还有红点报错的话,这是因为你选的芯片上没有该功能,你需要将其删掉才能不报错。)如图。

4.4 代码

4.4.1 TIM1

初始化:

 /*******************************************************************************
* Function Name : MX_TIM1_Init
* Description : TIM1 Init
* Input : None
* Output : None
* Return : None
********************************************************************************/
void MX_TIM1_Init(void)
{
//定时器1参数初始化 (15分频,向上计数,计数次数,重复次数)
TIM1_TimeBaseInit(, TIM1_COUNTERMODE_UP, , ); //Clear TIM1 update flag
TIM1_ClearFlag(TIM1_FLAG_UPDATE); //Enable update interrupt
TIM1_ITConfig(TIM1_IT_UPDATE, ENABLE);
TIM1_Cmd(ENABLE); //使能中断
enableInterrupts();
}

中断服务函数:

由于IAR中库函数工程模板的中断都写在 stm8s_it.c 库文件中,所以此段代码需要写在stm8s_it.c库文件相对应的芯片中才能进行中断处理。

通过初始化所配置的参数,加上count 10次的累加,达到1S翻转一次LED的效果,每一次进行中断后都需要对定时器的标志位进行清零处理。

 INTERRUPT_HANDLER(TIM1_UPD_OVF_TRG_BRK_IRQHandler, )
{
/* In order to detect unexpected events during development,
it is recommended to set a breakpoint on the following instruction.
*/
static uint8_t count = ; if(count++ == )
{
//翻转LED
GPIO_WriteReverse(Led_Opt_GPIO_Port, Led_Opt_Pin); count = ;
}
//定时器1的标志位清零
TIM1_ClearITPendingBit(TIM1_IT_UPDATE);
}

4.4.2 TIM2

初始化:

 /*******************************************************************************
* Function Name : MX_TIM2_Init
* Description : TIM1 Init
* Input : None
* Output : None
* Return : None
********************************************************************************/
void MX_TIM2_Init(void)
{
//定时器2参数初始化 (16分频,计数次数)
TIM2_TimeBaseInit(TIM2_PRESCALER_16, ); //Clear TIM2 update flag
TIM2_ClearFlag(TIM2_FLAG_UPDATE); //Enable update interrupt
TIM2_ITConfig(TIM2_IT_UPDATE, ENABLE);
TIM2_Cmd(ENABLE); //使能中断
enableInterrupts();
}

中断服务函数:

由于IAR中库函数工程模板的中断都写在 stm8s_it.c 库文件中,所以此段代码需要写在stm8s_it.c库文件相对应的芯片中才能进行中断处理。

通过初始化所配置的参数,加上count 1000次的累加,达到1S翻转一次LED的效果,每一次进行中断后都需要对定时器的标志位进行清零处理。

  INTERRUPT_HANDLER(TIM2_UPD_OVF_BRK_IRQHandler, )
{
/* In order to detect unexpected events during development,
it is recommended to set a breakpoint on the following instruction.
*/
static uint16_t count = ; if(count++ == )
{
//翻转LED
GPIO_WriteReverse(Led_Opt_GPIO_Port, Led_Opt_Pin); count = ;
}
//定时器2的标志位清零
TIM2_ClearITPendingBit(TIM2_IT_UPDATE);
}

4.4.3 TIM4

初始化:

 /*******************************************************************************
* Function Name : MX_TIM4_Init
* Description : TIM1 Init
* Input : None
* Output : None
* Return : None
********************************************************************************/
void MX_TIM4_Init(void)
{ //定数4初始化   (128分频,计数次数)
TIM4_TimeBaseInit(TIM4_PRESCALER_128, ); //Clear TIM4 update flag
TIM4_ClearFlag(TIM4_FLAG_UPDATE); //Enable update interrupt
TIM4_ITConfig(TIM4_IT_UPDATE, ENABLE);
TIM4_Cmd(ENABLE); //使能中断
enableInterrupts();
}

中断服务函数:

由于IAR中库函数工程模板的中断都写在 stm8s_it.c 库文件中,所以此段代码需要写在stm8s_it.c库文件相对应的芯片中才能进行中断处理。

通过初始化所配置的参数,加上count 500次的累加,达到1S翻转一次LED的效果,每一次进行中断后都需要对定时器的标志位进行清零处理。

  INTERRUPT_HANDLER(TIM4_UPD_OVF_IRQHandler, )
{
/* In order to detect unexpected events during development,
it is recommended to set a breakpoint on the following instruction.
*/ static uint16_t count = ; if(count++ == )
{
//翻转LED
GPIO_WriteReverse(Led_Opt_GPIO_Port, Led_Opt_Pin); count = ;
}
//定时器4的标志位清零
TIM4_ClearITPendingBit(TIM4_IT_UPDATE); }

5. 结尾 

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

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

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

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

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

基于STM8的TIM定时器操作---STM8-第三章的更多相关文章

  1. 正则表达式引擎的构建——基于编译原理DFA(龙书第三章)——3 计算4个函数

    整个引擎代码在github上,地址为:https://github.com/sun2043430/RegularExpression_Engine.git nullable, firstpos, la ...

  2. 【STM32H7教程】第32章 STM32H7的TIM定时器基础知识和HAL库API

    完整教程下载地址:http://www.armbbs.cn/forum.php?mod=viewthread&tid=86980 第32章       STM32H7的TIM定时器基础知识和H ...

  3. 多媒体(3):基于WindowsAPI的视频捕捉卡操作

    目录 多媒体(1):MCI接口编程 多媒体(2):WAVE文件格式分析 多媒体(3):基于WindowsAPI的视频捕捉卡操作 多媒体(4):JPEG图像压缩编码 多媒体(3):基于WindowsAP ...

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

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

  5. JAVAEE——BOS物流项目10:权限概述、常见的权限控制方式、apache shiro框架简介、基于shiro框架进行认证操作

    1 学习计划 1.演示权限demo 2.权限概述 n 认证 n 授权 3.常见的权限控制方式 n url拦截权限控制 n 方法注解权限控制 4.创建权限数据模型 n 权限表 n 角色表 n 用户表 n ...

  6. TIM定时器的应用

    TIM定时器的应用   ①输入捕获的应用: 上一节,我已阐述TIM的输入捕获具体作用有两个(如下图):     对输入信号的测量:                                    ...

  7. Mybatis基于代理Dao实现CRUD操作 及 Mybatis的参数深入

    Mybatis基于代理Dao实现CRUD操作 使用要求: 1.持久层接口和持久层接口的映射配置必须在相同的包下 2.持久层映射配置中mapper标签的namespace属性取值必须是持久层接口的全限定 ...

  8. 从基于 SQL 的 CURD 操作转移到基于语义 Web 的 CURD 操作

    中文名称 CURD 含义 数据库技术中的缩写词 操作对象 一般的项目开发的各种参数 作用 用于处理数据的基本原子操作     它代表创建(Create).更新(Update).读取(Retrieve) ...

  9. GIT → 10:基于IntelliJ IDEA的Git 操作

    GIT → 10:基于IntelliJ IDEA的Git 操作

随机推荐

  1. 路径R

    定义文件路径时前面加个r 例如 firstfolder = r"C:\Users\1261\Desktop\" 不对其中的符号进行转义

  2. Jquery easyUI datagrid遇到空行做判断

    点击[上月]按钮直到没有数据,上月按钮禁用.并提示无数据. 最直接的思路就是datagrid('reload',{month:-1}); 可是这样,想了很多办法无法获取加载的数据. 最简单的办法: $ ...

  3. linux学习笔记2 - linux常用命令

    转载请标注原链接:http://www.cnblogs.com/xczyd/p/5543731.html 第一篇博客:linux学习笔记1-ubuntu的安装与基本设置 之中,已经介绍了如何安装lin ...

  4. 卷积神经网络 CNN

    卷积神经网络与普通的神经网络十分相似:他们都由神经元构成,这些神经元拥有可学习的权重和偏差.每一个神经元接收一些输入,执行点积运算并以非线性可选择地跟随它.整个网络仍然表征一个单个可微分的分数函数:从 ...

  5. 时间Date.js

    <span style="line-height: 25.2px;">/** * 日期解析,字符串转日期 * @param dateString 可以为2017-02- ...

  6. JavaScript作用域(第七天)

    我们都知道js代码是由自上而下的执行,但我们来看看下面的代码: test(); function test(){ console.log("hello world"); }; 如果 ...

  7. Android Studio学习之 日志工具

    Log.v()   低级日志 Log.d(' ',' ')  debug调试信息 第一个参数tag,当前类名 第二个参数msg,打印具体内容 Log.i()  info数据 Log.w() warn警 ...

  8. 反向Ajax:WebSocket

    郭晨 软件151 1531610114 WebSocket 在HTML5中出现的WebSocket是一种比Comet还要新的反向Ajax技术,WebSocket启用了双向的全双工通信信道,许多浏览器( ...

  9. 【转载】【原创】华硕F8TR笔记本更换主板及喇叭教程

    转载地址:http://blog.sina.com.cn/s/blog_6241aaed0102w4e6.html [原创]华硕F8TR笔记本更换主板及喇叭教程     华硕AUSU F8TR笔记本 ...

  10. linux下软件安装的几种方式

    linux下软件安装的几种方式(主要有源码安装, rpm安装, yum安装). 一:源码安装 几乎所有的开源软件都支持在Linux下运行,而这些软件一般都以源码形式发放,只需要Linux安装了gcc. ...