STM8S_003_TIM定时中断

发布者:数字奇迹最新更新时间:2019-09-18 来源: eefocus关键字:STM8S  TIM  定时中断 手机看文章 扫描二维码
随时随地手机看文章

Ⅱ、TIM基础知识

在上一篇文章中讲述了一些关于TIM的知识,本文说一下TIM中断相关知识。


TIM框图:

TIM4属于基本定时器,是8位计数的定时器,也就是说UP-COUNTER和Auto-reload register是8位的寄存器,最大值只能为255。


主系统时钟fMASTER进来,通过分频Prescaler给计数器UP-COUNTER计数,当计数器和Auto-reload register相等时,有一个事件更新(这就是上文的延时时间到),如果使能了事件更新中断,则会响应中断(UIF)。


这里再次强调一下,基本定时器的8位的定时器,最大值为255,如果不满足要求,可以使用16位的通用定时器。


Ⅲ、软件工程源代码

1、关于工程

本文提供的工程代码是基于前面软件工程“STM8S_Demo”增加TIM定时器修改而来。初学的朋友可以参看我前面对应的基础文章,那些文章讲的比较详细。


工程以简单、易理解为主,方便更多初学者快速理解,工程的大部分配置都是使用默认配置,具体配置可参看我的文章:IAR for STM8系列教程(一)_新建软件工程详细过程。


2.软件概要说明

坚持简单、基础、方便初学者理解为原则,本文提供软件工程中的源代码只添加了最简单的内容:


系统初始化:System_Initializes


v BSP_Initializes:时钟初始化CLK_Configuration和GPIO_Configuration初始化;


v TIMER_Initializes:定时器初始化,本文重点内容;


功能实现:while(1)


v TIMTiming_Nms和TIMTiming_Off:开启定时和关闭定时;


v TIM4_UPD_OVF_IRQHandler:定时器中断


3.代码分析说明

关于BSP_Initializes中的内容这里不再详细说明,请见前面相关的文章:STM8S_001_GPIO基础知识


本文重点讲述关于TIM相关的内容:


A.TIMER_Initializes定时器初始化


void TIMER_Initializes(void)

{

  TIM4_TimeBaseInit(TIM4_PRESCALER_128, 125-1);  //定时1ms (16M/128/125 = 1000)

  TIM4_ClearFlag(TIM4_FLAG_UPDATE);              //清除标志位



  TIM4_ITConfig(TIM4_IT_UPDATE, ENABLE);         //使能更新UPDATE中断

  enableInterrupts();                            //使能全局中断

}

我们提供的软件工程是实现1ms的延时,实现的公式为:16MHz / 128 / 125 = 1KHz(1ms)。


第一个参数TIM4_PRESCALER_128:即128分频,这个参数为枚举类型,具体为如下:


typedef enum


{


  TIM4_PRESCALER_1    = ((uint8_t)0x00),


  TIM4_PRESCALER_2    = ((uint8_t)0x01),


  TIM4_PRESCALER_4    = ((uint8_t)0x02),


  TIM4_PRESCALER_8    = ((uint8_t)0x03),


  TIM4_PRESCALER_16   = ((uint8_t)0x04),


  TIM4_PRESCALER_32   = ((uint8_t)0x05),


  TIM4_PRESCALER_64   = ((uint8_t)0x06),


  TIM4_PRESCALER_128  = ((uint8_t)0x07)


} TIM4_Prescaler_TypeDef;


第二个参数125-1:这个参数的值,实际上的自动重载寄存器(Auto-reload register)的值,也是定时的周期值。从公式中可以看出,它是得出1ms延时的来源。


很多人不理解为什么125-1,而不是125呢?


原因很简单:计数是从0开始的,0至124就是计数125个,因此这里是124。


语句TIM4_ClearFlag(TIM4_FLAG_UPDATE):


这条语句的意思很简单,清除UPDATE更新标志位。


TIM4_ITConfig(TIM4_IT_UPDATE, ENABLE);


enableInterrupts();


如果我们需要在定时的时间到了之后响应中断,只需要配置这两条语句即可。(在中断函数里面添加需要的内容)


B.启动和关闭定时:TIMTiming_Nms / TIMTiming_Off



void TIMTiming_Nms(uint16_t Times)

{

  gTIMTiming_Num = Times;                        //定时Nms

  gTIMTiming_Flag = 0;                           //清零标志



  TIM4_SetCounter(0);                            //计数值归零

  TIM4_Cmd(ENABLE);                              //启动定时器

}


void TIMTiming_Off(void)

{

  gTIMTiming_Flag = 0;

  TIM4_Cmd(DISABLE);                             //关闭定时器

}

 


本文提供代码中定义了两个全局变量:


gTIMTiming_Num:定时计数(定时多少ms)


gTIMTiming_Flag:定时标志(0-无效 1-有效),也就是我们定时的时间到,有效的标志。



TIM4_SetCounter(0);


每次启动定时器之前,将计数值归零,这样才能保证第一次计数(延时)准确。


C.定时中断


INTERRUPT_HANDLER(TIM4_UPD_OVF_IRQHandler, 23)

{

  TIM4_ClearITPendingBit(TIM4_IT_UPDATE);        //清除中断标志



  gTIMTiming_Num--;

  if(0 == gTIMTiming_Num)

  {

    TIM4_Cmd(DISABLE);                           //关闭定时器

    gTIMTiming_Flag = 1;                         //标志有效

  }

}

 


中断的入口INTERRUPT_HANDLER(TIM4_UPD_OVF_IRQHandler, 23),位于stm8s_it.c文件下面,由系统决定,我们不用去修改。


每次进入中断,需要添加语句TIM4_ClearITPendingBit(TIM4_IT_UPDATE);清除中断标志位。后面的由我们自己添加,我这里为了方便测试,使用gTIMTiming_Num变量,这样可以使定时时间为1ms的倍数。


D.具体实现功能


TIMTiming_Nms(500);                            //定时500ms


while(1)


{


  if(1 == gTIMTiming_Flag)


  {


    gTIMTiming_Flag = 0;                         //清除标志


    LED_REVERSE;                               //LED变化


    TIMTiming_Nms(500);                         //定时500ms


  }


  //添加处理语句


}


这里实现的功能比较简单,定时500ms改变LED的状态。在这里可以添加自己的处理语句(如检测某一IO状态···)。


关键字:STM8S  TIM  定时中断 引用地址:STM8S_003_TIM定时中断

上一篇:IAR for STM8系列教程(一)_新建软件工程详细过程
下一篇:STM8控制4位LED数码管显示数字

推荐阅读最新更新时间:2024-11-09 11:28

STC10F10XE定时中断输出10KHz的方波程序
//咱做硬件的也动手做点测试程序,为了测试新做的电机驱动板,找了个51的板子当10K信号发生器测试IGBT开关延时时间。 #include STC_NEW_8051.H #include intrins.h #define uchar unsigned char //这个T0定时器中断程序网上找的,改了下定义和计数器值,移植到STC10F10XE上。 sbit OUT=P2^7; //定义OUT输出端口 /*------------------------------------------------ 定时器初始化子程序 ------------------------------------------------*/ voi
[单片机]
stm32tim定时器AutoReload和pwm输出Pulse的关系
老是理不清定时器的自动重装载和PWM通道Pulse的关系 先说PSC和AutoReload的关系 PSC是预分频 ST32F103频率可以上到72M 举个例子: 72000000/72=1M 1/1M=1/1000000=0.000001秒 预分配会影响自动重装载的计数速度 比如上面计算的,他可以0.000001s计一个数 当计到AutoReload的值时,就会产生一个中断 /*中断回调函数*/ pwm的脉冲数Pulse: 在AutoReload的计数周期内,设置脉冲的多少。 比如说舵机 要20ms的周期,那么根据公式: 定时器时间=1/(时钟频率/预分频/计数周期) 20ms=1/(72000000/
[单片机]
stm32<font color='red'>tim</font><font color='red'>定时</font>器AutoReload和pwm输出Pulse的关系
s3c2440裸机-异常中断(五. irq之定时中断
之前讲过 s3c2440时钟体系 ,看了时钟体系再来看定时器中断会更好的结合运用所学知识点。 S3c2440共有2种定时器: 1.Watchdog看门狗定时器 2.PWM脉冲可调制定时器 下面详细介绍2种定时器的原理,来了解定时器是如何产生定时器中断的。 1. Watchdog看门狗定时器 1)Watchdog看门狗定时器原理 Watchdog定时器的原理很简单,寄存器很少,框图如下: 1.定时器,定时器那肯定是需要用到时钟的,从框图中可以看到Watchdog定时器采用的时钟源是PCLK,从 s3c2440时钟体系 中也可以体现出来,接的是APB总线。 2.然后到达一个8bit的分频器,可以通过配置WTCON 来设置分频器的预
[单片机]
s3c2440裸机-异常<font color='red'>中断</font>(五. irq之<font color='red'>定时</font>器<font color='red'>中断</font>)
MSP432笔记——TIM定时中断
使用driverlib库函数 以TA3为例 前期配置 时钟源 信号源 电压等级 flash //Flash FlashCtl_setWaitState(FLASH_BANK0,1); FlashCtl_setWaitState(FLASH_BANK1,1); //PCM state PCM_setPowerState(PCM_AM_LDO_VCORE1); //CS configure CS_setDCOCenteredFrequency(CS_DCO_FREQUENCY_48); 配置定时器 Config 参数配置结构体 config 开始定时器 start 使能定时器中断 (清空标志位、打开
[单片机]
51单片机学习笔记———6.中断法配置定时
#include reg52.h sbit LED P0^4; void main() { EA = 1;//打开总中断 TMOD&=0xFC; TMOD|=0x01; TH0 = (65535-2000)/256;//定时2ms TL0 = (65535-2000)/%256; ET0 = 1; TR0 = 1; while(1) { ... } void interruptTime() interrupt 1 { static unsigned int n = 0; TH0 = (65535-2000)/256; TL0 = (65535-200
[单片机]
基于MSP430F5529的三种点灯方式(基本、定时、外部中断
前言 好久没有更新一下MSP430F5529的博文了,发觉看的人有点少了,而且前段时间又因为电赛停了,就回归STM32f1的怀抱,毕竟32位的确实比16位的好,而且就用户而言,STM32肯定更占优势······今天就再次回归MSP430的怀抱,那么接下来就会先从基础的使用讲起,这里先是讲用三种方式来点亮LED。 一、msp430f5529三种点灯方式 在MSP430f5529中对于LED灯,均是高电平触发,输入高电平后就点亮,输入低电平就熄灭,这个不同于51和STM32,这是比较基础的。那么接下来就主要用三种方式让你快速点灯。 1、基本方式 基本方式就是直接设置一个延时,然后令它循环1点亮,这里我们点亮LED1(P1.
[单片机]
基于MSP430F5529的三种点灯方式(基本、<font color='red'>定时</font>、外部<font color='red'>中断</font>)
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

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

换一换 更多 相关热搜器件
随便看看

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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