当前位置:首页 > 单片机 > 单片机
[导读]Ⅰ、写在前面上一篇文章讲述了TIM精确延时(阻塞式),它主要的特点是延时精确,而阻塞式延时在这一延时过程中不能做其它事情,只能等待延时结束。在某些场合下,我们需要在延时的过程中也要进行其它操作,如在延时过

Ⅰ、写在前面

上一篇文章讲述了TIM精确延时(阻塞式),它主要的特点是延时精确,而阻塞式延时在这一延时过程中不能做其它事情,只能等待延时结束。

在某些场合下,我们需要在延时的过程中也要进行其它操作,如在延时过程中需要检测某一个IO口的电平状态、检测某一按键是否处于按下状态等。这个时候我们简单的处理方法就是使用定时中断,一旦这个延时时间到就进行下一个操作。

本文将简单讲述如何实现TIM定时和中断,提供简单的例程源代码。



为方便大家阅读,本文内容已经整理成PDF文件:

http://pan.baidu.com/s/1i5uWhJR


作者:strongerHuang

版权所有,未经允许,禁止用于其它商业用途!!!

Ⅱ、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

vBSP_Initializes:时钟初始化CLK_Configuration和GPIO_Configuration初始化;

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

功能实现:while(1)

vTIMTiming_Nms和TIMTiming_Off:开启定时和关闭定时;

vTIM4_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资料:

http://pan.baidu.com/s/1o7Tb9Yq

软件源代码工程(STM8S-A03_TIM定时中断):

http://pan.baidu.com/s/1c2EcRo0


本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

近日,爱立信、意大利电信(TIM)和都灵市政府携手展示了一系列5G创新成果,有望重塑意大利北部城市的生活方式。 此项活动于10月26至27日在都灵玛德玛宫举行,展示了5G无人驾驶汽车、无

关键字: 5g天线 tim 爱立信

巴西电信运营商TIM ParTIcipacoes SA(下称TIM)表示,将使用华为提供的设备,在巴西南部城市弗洛里亚诺波利斯(Florianopolis)进行5G无线技术测试。

关键字: 5G tim 华为

芬兰,埃斯波——诺基亚携手意大利电信(TIM),利用诺基亚第三代光子业务引擎(诺基亚PSE-3),在长350多公里的罗马-佛罗伦萨段骨干网上,实现了高达550Gb/s的数据传输速率,创下欧洲最高

关键字: tim 数据传输 诺基亚

意大利最大的通信公司意大利电信(TIM)计划在年底前将5G服务扩展到6个意大利城市,以及数十个旅游景点和商业中心。 作为之前垄断的公司,意大利电信上周五公布了其5G移动服务计划。它还与竞

关键字: 5G tim

7月23日消息,意大利电信(TIM)选用了爱立信的商用硬件、软件及解决方案,在意大利开启5G网络,其中包括无线接入网 (RAN) 与核心网,将用于新技术的初步部署。 TIM 已经在罗马、

关键字: 4g 5G tim 爱立信

西班牙电信(Telefonica)Vivo与意大利电信巴西公司(TIM Brasil)就共享2G和4G基础设施开启谈判,随着双方都着眼于削减运营成本。   在一份声明中,意

关键字: 4g telefonica tim

意大利电信(TIM)选用了爱立信的商用硬件、软件及解决方案,在意大利开启5G网络,其中包括无线接入网 (RAN) 与核心网,将用于新技术的初步部署。 TIM 已经在罗马、都灵和那不勒斯等

关键字: 5G tim 爱立信

据路透社报道,最大电信集团意大利电信(TIM)与其竞争对手沃达丰(Vodafone)上周五达成协议,同意合并其移动铁塔业务,共同部署5G。 根据协议,沃达丰将其意大利铁塔资产转移至INW

关键字: 5G tim 沃达丰

Sweeney在拉斯维加斯举行的活动呼吁建立一个更加开放的游戏产业,并摆脱了Google和Apple等平台所有者的垄断。 Epic Games对其独家策略引发了很多争议,他被指控虚伪。

关键字: Android google tim sweeney

2019 年 10 月 5 日,正逢我国 70 周年国庆假日,同时也是苹果公司创始人乔布斯逝世 8 周年的纪念日。这一天,苹果 CEO Tim Cook 也在 Twitter 上表达了对乔布斯的怀念之

关键字: cook jobs steve tim 苹果公司 万亿市值 开放务实
关闭
关闭