引言
华芯微特公司SWM系列单片机提供的TIMER个数和功能有些微差别,为了让您更加简单的使用这一功能,下面小编将以SWM190为例,我们今天详细讲解一下TIMER的输入捕获功能。
TIMER输入捕获
一、TIMER定时器之输入捕获功能
我们今天详细讲解一下TIMER的输入捕获功能。
SWM190提供了一个用于捕捉外部脉宽的模块,可记录外部单个脉冲宽度,可通过读取相应寄存器获得脉冲高低电平的宽度。
每一个TIMER都可以配置中断。使能中断后,脉冲捕获完成会触发中断操作,如果不操作使能位,则持续记录电平宽度,直至使能位关闭。
二、SWM190 TIMER脉冲捕获功能配置库函数
下面我们以脉冲捕获为例,使用加强型定时器,使用TIMR0的Input Capture功能测量输入PWM的占空比。在此例程中,我们将使用PWM产生PWM波来产生测试信号供Input Capture功能测量;使用B6作为TIMER0的输入捕获IO口,并将测量的高电平脉冲和低电平脉冲通过串口打印。
我们之前有讲到PORT的配置方法,在这里就不在做赘述,将B6引脚通过PORT_Init设置为TIMER的输入功能引脚(PORTB_PIN6_TIMR0_IN)。
在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,为中断使能。
我们的函数配置为:
TIMR_Init(TIMR0, TIMR_MODE_IC, 1, 0xFFFFFFFF, 0);
在TIMR_Init函数中,使用TIMER0;模式选择输入捕获;不分频;计数周期为0xFFFFFFFF;不使能中断(此中断在TIMR_IC_Init函数中使能)。
我们接下来看TIMR_IC_Init(TIMR_TypeDef * TIMRx, uint32_t captureH_int_en, uint32_t captureL_int_en)函数。
函数的第一个参数为TIMR_TypeDe,它是一个结构体类型,该类型在SWM190.h中被定义。具体参数为指定TIMER模块,有效值包括TIMR0,TIMR1,TIMR2,TIMR3;
第二个参数为captureH_int_en,为测量高电平长度完成中断使能;
第三个参数为captureL_int_en,为测量低电平长度完成中断使能;
我们的函数配置为:
TIMR_IC_Init(TIMR0, 1, 1);
TIMR_IC_Init函数中配置为使用TIMER0;高电平捕获完成中断使能;低电平捕获完成中断使能;
值得一提的是,在TIMR_IC_Init库函数中,默认如果使能了高/低电平捕获完成中断使能,则就使能对应TIMER的中断。
我们使用加强型定时器0实现timer获取B1引脚上的PWM波形的高低电平,当捕获完成则进入TIMER中断,在中断中读取高电平脉冲和低电平脉冲宽度,并通过串口打印数据。
具体配置函数如下图所示:
接下来我们看下中断服务子函数,在加强型定时器的中断服务函数中,实现每完成一次高/低电平捕获,则通过串口打印脉冲的高/低电平宽度。
三、实验现象
下载好程序后,将B1脚和B6脚物理连接,并通过串口线将单片机与电脑连接,可在电脑端通过串口助手得到B1脚的PWM波形的高/低电平宽度。