基于STM8的TIM定时器操作---STM8-第三章

2019-12-04来源: eefocus关键字:STM8  TIM  定时器操作

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(15, TIM1_COUNTERMODE_UP, 1000, 100);

 

  //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, 11)

{

  /* In order to detect unexpected events during development,

     it is recommended to set a breakpoint on the following instruction.

  */

  static uint8_t count = 0;

  

  if(count++ == 10)

  {

    //翻转LED

    GPIO_WriteReverse(Led_Opt_GPIO_Port, Led_Opt_Pin);

    

    count = 0;

  }

  //定时器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, 1000);

 

  //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, 13)

 {

  /* In order to detect unexpected events during development,

     it is recommended to set a breakpoint on the following instruction.

  */

  static uint16_t count = 0;

  

  if(count++ == 1000)

  {

    //翻转LED

    GPIO_WriteReverse(Led_Opt_GPIO_Port, Led_Opt_Pin);

    

    count = 0;

  }

  //定时器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, 250);

 

  //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, 23)

 {

  /* In order to detect unexpected events during development,

     it is recommended to set a breakpoint on the following instruction.

  */

   

  static uint16_t count = 0;

  

  if(count++ == 500)

  {

    //翻转LED

    GPIO_WriteReverse(Led_Opt_GPIO_Port, Led_Opt_Pin);

    

    count = 0;

  }

  //定时器4的标志位清零

  TIM4_ClearITPendingBit(TIM4_IT_UPDATE);

  

 }

 

5. 结尾 


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

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

关键字:STM8  TIM  定时器操作 编辑:什么鱼 引用地址:http://news.eeworld.com.cn/mcu/ic481980.html 本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:基于STM8的IIC协议--实例篇--时钟模块(DS3231)读取
下一篇:基于STM8的ADC读取---STM8-第四章

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

简析stm32启动过程
说明:本文是杰杰以前保存下来的,出处已经不知道在哪了,应该是各大论坛中,当然转这种文章,到处都有。今天我就把它重写一遍。基于原作者的内容添加一些内容(源码)讲解。杰杰水平有限,出错在所难免,还望各位大神指点一二。startup_stm32f10x_cl.s互联型的STM32F105xx,STM32F107xxstartup_stm32f10x_hd.s 大容量的STM32F101xx,STM32F102xx,STM32F103xxstartup_stm32f10x_hd_vl.s 大容量的STM32F100xxstartup_stm32f10x_ld.s 小容量的STM32F101xx,STM
发表于 2019-12-14
简析stm32启动过程
【干货】老外的GitHub整理的stm32f4驱动库
昨晚在github发现了一个老外自己整理的封装库,有很多,比如一些通讯啊啥的,一些显示屏驱动等等目录STM32F4Libraries and projectsHere are listed all libraries for STM32F4 devices.Libraries are designed to work with STM32F4xx series of MCU. Every project hereis created with Keil uVision, but tested with GCC compiler too (Coocox). Eachproject includes 4 targets
发表于 2019-12-14
【干货】老外的GitHub整理的stm32f4驱动库
基于Linux的kfifo移植到STM32(支持os的互斥访问)
关于kfifokfifo是内核里面的一个First In First Out数据结构,它采用环形循环队列的数据结构来实现;它提供一个无边界的字节流服务,最重要的一点是,它使用并行无锁编程技术,即当它用于只有一个入队线程和一个出队线程的场情时,两个线程可以并发操作,而不需要任何加锁行为,就可以保证kfifo的线程安全。具体什么是环形缓冲区,请看我以前的文章说明关于kfifo的相关概念我不会介绍,有兴趣可以看他的相关文档,我只将其实现过程移植重写,移植到适用stm32开发板上,并且按照我个人习惯重新命名,RingBuff->意为环形缓冲区RingBuff_t环形缓冲区的结构体成员变量,具体含义看注释。buffer: 用于存放
发表于 2019-12-14
STM32之重定向printf
学习stm32,打交道最多的莫过于串口通讯了,但是官方的串口发送库太恶心了,完全不好用甚是还念C语言的printf,想输出什么就有什么,现在,一步步来做个重定向,让你的stm32可以跟C语言一样能想看什么就看什么:首先:添加printf的头文件 :#include <stdio.h>    //当时学C语言最熟悉的stdio.h其次:改写int fputc(int ch, FILE *f)函数int fputc(int ch, FILE *f);int fputc(int ch, FILE *f){USART_SendData(USARTx, (uint8_t) ch);while
发表于 2019-12-14
STM8L051F3_02_EXTI应用
本章介绍STM8L051F3的EXTI相关知识,内容分为以下几部分:EXTI简介KEY外部中断检测1、EXTI简介EXTI也是属于GPIO的知识点,应用比较广泛。STM8L051F3每个I/O口在输入模式下都能配置为中断,在这个配置下,一个信号沿或电平输入到I/O口上将产生一个中断请求。外部中断只有在端口的输入模式下才有效。可通过配置寄存器Px_CR2相应的位来独立地使能或禁能某个端口的外部中断功能。另外,可通过ADC_TDRH和ADC_TDRL寄存器来禁用施密特触发器节省功耗。2、KEY外部中断检测2.1 KEY的外部中断配置本小节介绍将GPIO配置为外部中断输入模式,并通过KEY(PC4)来触发一个外部中断信号,然后产生中
发表于 2019-12-14
STM8L051之通过ADC1与DMA读取内部参考电压
stm8L051芯片内部的参考电压与电源电压有一定的关系这在芯片供电电压变化的情况下,测量外部ADC电压输入提供一个确定的参考电压。这里提前厘清下:该内部参考电压VREFINT 并非ADC 的参考电压,ADC 的参考电压依然是VDD。即使VDD 有所波动,这个VREFINT 电压恒定不变,对于ADC 电路而言,它只是个测试点。 对于某固定的ADC 参考电压情况下,所有被测电压点的AD转换值与该点电压值保持同一比例关系,换句话说,对于ADC参考电压固定情况下,各点的电压与ADC值与成线性关系。下面图形是芯片分别在3个不同参考电压的示意图,这里参考电压接VDD。下面三根斜线分别是VDD 为2.8V、3.2V、3.6V 时的
发表于 2019-12-14
STM8L051之通过ADC1与DMA读取内部参考电压
小广播
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2019 EEWORLD.com.cn, Inc. All rights reserved