芯课堂 | MCU之TIMER精准延时

发布时间:2024年01月04日

引言

华芯微特公司SWM系列单片机提供的TIMER个数和功能有些微差别,为了让您更加简单的使用这一功能,下面小编将以SWM190为例,给大家展示如何使用SWM系列产品的TIMER功能。

TIMER精准延时

一、TIMER简介

TIMER是一种定时器工具,用来在一个后台线程计划执行指定任务。它可以计划执行一个任务一次或反复多次。

华芯微特公司SWM系列单片机提供的TIMER个数和功能有些微差别,为了让您更加简单的使用这一功能,下面小编将以SWM190为例,给大家展示如何使用SWM系列产品的TIMER功能。

SWM190系列有4路32位加强定时器,4路24位基础定时器。加强型定时器支持支持定时器、计数器、捕获、脉冲发送、HALL功能及ADC触发功能等功能。基础定时器具备定时器功能,并具备一个8位分频器,每个定时器具备独立中断源。

二、TIMER定时器之精准延时功能

我们今天详细讲解一下TIMER的定时器功能。

定时器功能使用片内时钟作为计数基准,以SWM190加强型定时器为例,有4个32 bit向下计数的TIMER,脉冲每一次下降沿,计数寄存器数值将减1。

每一个TIMER都可以配置定时器溢出中断。使能溢出中断,定时器溢出会触发中断操作,达到精准定时功能。

三、SWM190 TIMER延时功能配置库函数

下面我们以最简单的定时器为例,使用加强型定时器和基础定时器,用定时器的方法实现1S的精准延时。在此例程中,我们将A4设为每2秒翻转一次IO,A5设为每0.5秒翻转一次IO,通过翻转LED的状态来观察现象。

我们之前有讲到GPIO的配置方法,在这里就不在做赘述,将LED输出引脚通过GPIO_Init设置为输出,与外部LED引脚相连。

在SWM190固件库中对TIMER的配置进行了说明,下面将根据库函数对SWM190的TIMER配置,首先来看一下TIMR_Init函数的原型void TIMR_Init(TIMR_TypeDef * TIMRx, uint32_t mode, uint32_t prediv, uint32_t period, uint32_t int_en)。这个函数的实现是在SWM190_timr.c文件中,若要使用该函数在相应的应用程序的前面包含SWM190_ timr.h头文件。

函数的第一个参数为TIMR_TypeDe,它是一个结构体类型,该类型在SWM190.h中被定义。具体参数为指定TIMER模块,有效值包括TIMR0,TIMR1,TIMR2,TIMR3,BTIMR0,BTIMR1,BTIMR2,BTIMR3;

第二个参数为uint32_t mode,为TIMER模式配置,有效值包括TIMR_MODE_TIMER(定时器)、TIMR_MODE_COUNTER(计数器上升沿)、TIMR_MODE_OC(输出比较)、TIMR_MODE_IC(输入捕获);其中基础定时器只支持TIMR_MODE_TIMER(定时器);

第三个参数为uint32_t prediv,为TIMER分频配置,其中加强型定时器无分频只能为1;基本定时器可取值1-256;

第四个参数为uint32_t period,为计数周期,其中加强型定时器为32bit,基础定时器为24bit。

第五个参数为uint32_t int_en,为中断使能。

我们加强型定时器实现0.1S触发一次,2S实现LED灯的翻转;基础定时器实现0.5S实现LED灯的翻转。

具体配置函数如下图所示:

图片

接下来我们看下中断服务子函数,在加强型定时器的中断服务函数中,实现每0.1S进一次中断。定义一个全局变量TimerNum,每当进一次中断的时候,让TimerNum来记录进入中断的次数。我们实现2S的定时,我们只需要判断TimerNum是否等于20,然后把TimerNum清0,执行对应的操作并重新计数,以此循环往复。

图片

在基础定时器的中断服务函数中,实现每0.5S进行LED灯的一次翻转。

图片

四、实验现象

下载好程序后,LED实现分别2S翻转一次和0.5s翻转一次。

文章来源:https://blog.csdn.net/SYNWIT/article/details/135355070
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。