当前位置:首页 > 单片机 > 单片机
[导读]Ⅰ、写在前面在某些特定场合,需要精确的延时(us级),特别是底层驱动。如果使用软件延时,延时会随系统时钟改变及各种因素影响而改变。因此,就需要使用TIM精确延时。阻塞式延时:从延时开始至结束,程序一直阻塞在

Ⅰ、写在前面

在某些特定场合,需要精确的延时(us级),特别是底层驱动。如果使用软件延时,延时会随系统时钟改变及各种因素影响而改变。因此,就需要使用TIM精确延时。

阻塞式延时:从延时开始至结束,程序一直阻塞在那里,不会跳转到其他地方(除中断)执行程序。不理解的朋友可以自己网上搜索答案。

TIM的种类和功能很多,本文是基础的知识,讲的比较简单,关于定时器更加强大和实用的功能可以关注我后面的文章。

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

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

作者:strongerHuang

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

Ⅱ、TIM基础知识

STM8S的定时器(TIMER)类型有三类:基本定时器、通用定时器和高级定时器。基本定时器是8位计数的定时器,通用和高级定时器是16位计数的定时器。

定时器因类型不同,其功能和复杂程度不同,适用的场合也不同。本文以最基础、最简单的8位基础定时器来讲述TIM的延时。

强调一点:8位计数定时器,最大计数值为256。


TIM4基础定时器功能:

?8位向上计数(UP-COUNTER)的自动重载计数器;

?3位可编程的预分配器Prescaler(可在运行中修改),提供1, 2, 4, 8, 16, 32, 64 和128这8种分频比例。

?中断产生:若使能了中断,在计数器更新时(计数器溢出)产生中断,本文未开启中断。

Ⅲ、软件工程源代码1、关于工程

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

软件工程源代码实现功能:通过阻塞式延时(500ms)改变LED亮灭状态来观察延时的大小。若要测量延时的精确性,可以将TIMDelay_Nms(500)改为其他TIMDelay_N10us(10)(延时100us),通过示波器测量LED引脚的频率为5KHz(周期为200us)。

2.软件概要说明

本文提供软件工程中包含的内容比较简单:

系统初始化:System_Initializes

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

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

功能实现:while(1)

3.代码分析说明

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

本文重点讲述bsp_timer.c文件的内容:

A.TIMER_Initializes定时器初始化

voidTIMER_Initializes(void)

{

TIM4_TimeBaseInit(TIM4_PRESCALER_2, 79);

TIM4_ClearFlag(TIM4_FLAG_UPDATE);

}

我们提供的软件工程是实现10us的延时,实现的公式为:16MHz / 2/ (79+1) = 0.1MHz(100KHz)。

第一个参数TIM4_PRESCALER_2:即2分频,这个参数具体为如下:

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;

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

很多人不理解为什么不是80,而是79呢?

原因是计数是从0开始的,0至79就是计数80个,因此这里是79。

语句TIM4_ClearFlag(TIM4_FLAG_UPDATE):

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

B.延时N个10us:void TIMDelay_N10us(uint16_t Times)

voidTIMDelay_N10us(uint16_t Times)

{

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

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

while(Times--)

{

while(RESET == TIM4_GetFlagStatus(TIM4_FLAG_UPDATE));

TIM4_ClearFlag(TIM4_FLAG_UPDATE);

}

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

}

为什么是N个10us?

从上面定时器初始化可以知道,一个计数的过程(延时)是10us,参数Times代表要执行延时10us的次数。

TIM4_SetCounter(0);

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

while(RESET == TIM4_GetFlagStatus(TIM4_FLAG_UPDATE));

这一条语句代表程序在这里不停地读取更新标志位TIM4_FLAG_UPDATE(阻塞),直到读取标志位有效(计数满),则跳出这个while循环。

TIM4_ClearFlag(TIM4_FLAG_UPDATE);

清除更新标志位TIM4_FLAG_UPDATE。在上面标志位有效之后,需要清除,清除之后有进行下一个计数过程。

这里的启动和关闭定时器相信都能理解,从执行TIMDelay_N10us这一个函数开始到结束操作过程的开关。这里提醒一点:计数的过程的一个循环的过程,过程中尽量避免重复开关定时器(会有一定的耗时),我提供的TIMDelay_Nms其实严格来说不是很准确,该函数就是重复了开关。

C.具体实现功能

在main函数中的while里面就是本文源代码实现的具体功能,将一个LED灯(IO)高低交替输出,中间使用定时器比较精确的延时500ms,达到LED亮灭的效果。

代码:

while(1)

{

LED_ON; //LED亮

TIMDelay_Nms(500);

LED_OFF; //LED灭

TIMDelay_Nms(500);

}

这里TIMDelay_Nms函数严格来说存在一定的偏差,从上面的讲述,相信都知道如何修改来避免这样的误差。

Ⅳ、下载

STM8S资料:

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

软件源代码工程(STM8S-A02_TIM精确延时(阻塞式)):

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


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

在与传感器或者模块的总线进行通信的时候,常常需要使用到精确延时,一般我们会封装几个常用延时函数, 下面我们以STM32F103芯片为例,详细介绍一下STM32下一种精确延时函数的实现: 时钟树 下图中紫色的 to Cor...

关键字: STM32 函数 精确延时

近日,爱立信、意大利电信(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
关闭