0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

STM8S_002_TIM精确延时 (阻塞式)

黄工的嵌入式技术圈 来源:黄工的嵌入式技术圈 2020-03-20 10:51 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

建议下载PDF和Demo软件工程学习

写在前面 Ⅰ

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

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

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

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

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

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

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

--TIMER_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

提示:如果网盘链接失效,可以微信公众号“底部菜单”查看更新链接。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • PDF
    PDF
    +关注

    关注

    1

    文章

    177

    浏览量

    35297
  • Tim
    Tim
    +关注

    关注

    0

    文章

    84

    浏览量

    18885
  • STM8S
    +关注

    关注

    16

    文章

    149

    浏览量

    32519
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    飞凌嵌入ElfBoard-文件I/O的深入学习之阻塞I/O与非阻塞I/O

    1.4.1.1 概念 阻塞I/O顾名思义就是对文件的I/O操作是阻塞的,即假如对某些类型文件(管道文件、网络设备文件和字符设备文件)进行读操作时,如果数据未准备好、文件当前无数据可读,那么读操作
    发表于 12-01 13:07

    Cortex-M内核中的精确延时的方法

    。很多裸机教程使用延时函数又是基于SysTick的,这样一来又难免产生冲突。 很多人会说,不是还有定时器吗,定时器的计时是超级精确的。这点我不否认,但是假设,如果一个系统,总是进入定时器中断(10us
    发表于 11-21 07:51

    使用系统定时器SysTick来实现精确延时微秒和毫秒函数

    精确延时函数的实现 在core_cm3.h文件中,有这样一个SysTickConfig函数: __STATIC_INLINE uint32_t SysTick_Config(uint32_t
    发表于 11-20 07:12

    如何利用蜂鸟HbirdV2-SoC自带外设PWM进行毫秒级的延时和计时

    1 队伍介绍 本篇主要介绍如何利用蜂鸟HbirdV2-SoC自带外设PWM进行毫秒级的延时和计时。 2 TIM0配置 在上一个帖子中,介绍了HbirdV2-SoC自带外设PWM的寄存器
    发表于 10-30 07:47

    第二十二章 TIM——高级定时器

    本章介绍了W55MH32的高级定时器(TIM1和TIM8),其含时基单元等,具备输入捕获、输出比较、PWM生成等功能,还支持互补输出、死区插入等,适用于工业电机控制,也提及相关配置结构体。
    的头像 发表于 06-20 13:58 1390次阅读
    第二十二章 <b class='flag-5'>TIM</b>——高级定时器

    第二十章 TIM——基本定时器

    本章介绍了W55H32基本定时器TIM6、TIM7,16位向上计数,含时钟源、预分频器等,讲解定时计算及初始化结构体。
    的头像 发表于 06-20 13:51 895次阅读
    第二十章 <b class='flag-5'>TIM</b>——基本定时器

    一文读懂热界面材料:TIM1与TIM2的奇妙世界

    TIM1:芯片的“贴身保镖”2025ThermalLink在热界面材料的世界里,TIM1堪称芯片的“贴身保镖”。它通常紧紧地贴附在芯片(如CPU、GPU等核心芯片)与均热板(IHS)之间,就像给芯片
    的头像 发表于 05-11 06:41 1966次阅读
    一文读懂热界面材料:<b class='flag-5'>TIM</b>1与<b class='flag-5'>TIM</b>2的奇妙世界

    在testbench中如何使用阻塞赋值和非阻塞赋值

    本文详细阐述了在一个testbench中,应该如何使用阻塞赋值与非阻塞赋值。首先说结论,建议在testbench中,对时钟信号(包括分频时钟)使用阻塞赋值,对其他同步信号使用非阻塞赋值
    的头像 发表于 04-15 09:34 998次阅读
    在testbench中如何使用<b class='flag-5'>阻塞</b>赋值和非<b class='flag-5'>阻塞</b>赋值

    DS1124 5.0V、8位可编程延时电路技术手册

    DS1124是一款功能与DS1021-25类似的8位可编程定时元件。可以通过3线串行接口编程256级延时间隔。DS1124具有0.25ns的步进,可以提供20ns至高达84ns延时,积分非线性为±3ns。
    的头像 发表于 04-15 09:28 1009次阅读
    DS1124 5.0V、<b class='flag-5'>8</b>位可编程<b class='flag-5'>延时</b>电路技术手册

    S32DS上使用JLINK调试S32K341,被阻塞了,怎么处理?

    我正在尝试使用 S32K341 在新板上刷写程序,但在 S32K3X4EVB 上运行并为 S32K341配置的相同代码出现错误。具体来说,当我使用 S32DS 的 J-Link 探针运
    发表于 04-03 08:13

    FA8-220S05D2 FA8-220S05D2

    电子发烧友网为你提供AIPULNION(AIPULNION)FA8-220S05D2相关产品参数、数据手册,更有FA8-220S05D2的引脚图、接线图、封装手册、中文资料、英文资料,FA8-220S05D2真值表,FA
    发表于 03-18 18:45
    FA<b class='flag-5'>8-220S</b>05D2 FA<b class='flag-5'>8-220S</b>05D2

    普冉PY32F002AF15P6单片机概述

    AF15P6采用TSSOP20封装,批量价目前在5毛左右,很适合低成本消费电子使用。PY32F002A不仅提供了TSSOP20封装选项,还支持其他多种封装类型,如SOP8、SOP16、ESSOP10以及QFN16。
    的头像 发表于 02-24 10:52 4371次阅读
    普冉PY32F<b class='flag-5'>002</b>AF15P6单片机概述

    “串口阻塞”你真的会用吗?

    导读在串口通信开发中,数据错乱是常见问题。本文将快速介绍串口标志位的作用及配置方法,帮助解决数据传输错误。这是一个真实案例,用户反馈“串口向另外的设备发送数据,发现运行一段时间后,发送的消息会阻塞
    的头像 发表于 02-13 11:42 1197次阅读
    “串口<b class='flag-5'>阻塞</b>”你真的会用吗?

    延时继电器的工作原理和接线方法

    延时继电器作为一种在电气系统中广泛应用的控制元件,具有在电路中实现定时闭合或断开控制的重要功能。通过引入延时功能,对电路系统的精确控制和管理,适应不同的应用场景和需求,提高生产效率、降低
    的头像 发表于 02-07 16:09 2828次阅读

    延时继电器应用场景

    延时继电器是一种在电气系统中广泛应用的控制元件,通过引入延时功能,实现了在电路中定时闭合或断开控制的重要任务。 延时继电器的工作原理,基于一个或多个可调的计时器电路,2路/4路/8路电
    的头像 发表于 01-16 16:27 1100次阅读