8. 加强型定时器 (TIMER)
8.1. 概述
SWM221系列所有型号TIMER操作均相同, 不同型号具备TIMER数量可能不同。使用前需使能TIMER模块时钟。
每个TIMER模块均具备定时器功能和计数器功能、输出比较及输入捕获功能,每个TIMER时钟为系统时钟,计数器是统计外部触发信号的上升沿个数。
备注
只有 TIMER0 支持 Hall 功能及连续脉宽捕捉功能。
8.2. 特性
3路32位通用定时器
24位计数器
8位预分频
可单独配置计时触发条件为内部时钟或者外部输入
支持脉冲捕获及宽度测量,检测脉冲极性可配
支持脉冲发送功能,可作为PWM使用
TIMER0支持HALL功能,可采集霍尔传感器
TIMER0~1输出可作为外部触发事件信号
定时器溢出脉冲输出,可用于触发ADC
8.3. 功能描述
8.3.1. 模块结构框图
图 7 TIMER模块结构框图
8.3.2. 定时器
使用TIMERx作为定时器时,为递减计数。流程如下:
将控制寄存器(CRx)中MODEx位配置为定时器,CLKSRCx位配置计数源选择,配置为使用系统时钟作为计数源。
通过装载值寄存器(LOADx)设置计数起始值。
使能寄存器(EN)对应位使能为1。
对应TIMERx开始递减计数,计数到0时,产生中断,同时重新装载计数值,进行下一周期计数。
在计数过程中,可通过对当前值寄存器(VALUEx)进行读取,获取当前计数值。
定时器计数过程中改变装载值寄存器(LOADx)值,将在下个计数周期(计数到0重新装载)生效,不会改变本周期计数值。
定时器计数过程中,可以通过HALT寄存器控制位置1暂停指定通道计数,置0后继续计数。
如 图 8 所示。
图 8 定时器工作示意图
8.3.3. 计数器
使用TIMERx作为计数器时,为递减计数。流程如下:
将控制寄存器(CRx)中MODEx位配置为计数器,CLKSRCx位计数源选择配置为外部的触发信号的上升沿。此时,对应TIMER将以配置为CNT引脚外部输入的上升沿作为计数目标。
针对外部信号输入引脚进行如下操作:
配置PORTCON模块中INEN寄存器使能引脚输入功能。
通过PORTX_FUNC寄存器将引脚切换为指定数字功能。
通过装载值寄存器(LOADx)设置计数目标值。
使能寄存器(EN)对应位使能为1,对应TIMERx开始递减计数,计数到0时,产生中断,同时重新装载计数值,进行下一周期计数。
在计数过程中,可通过对当前值寄存器(VALUEx)进行读取,获取当前计数值。
定时器计数过程中改变装载值寄存器(LOADx)值,将在下个计数周期(计数到0重新装载)生效,不会改变本周期计数值。
计数器使用过程中,可以通过HALT寄存器控制位置1暂停指定通道计数,置0后继续计数。
示意图如 图 9 所示。
图 9 计数器工作示意图
8.3.4. 级联
当TIMER无法满足计数宽度或时间长度时,可以通过级联方式,使计数周期为TIMER位宽相乘的关系。最高支持两级级联。
使用方式如下:
TIMERn根据需要设置为定时器或计数器模式
TIMERn+1设置为级联模式(CLKSRCx位配置为使用上一路计数器的进位标志)
LOADn = 目标计数值A
LOADn+1 = 目标计数值B,总计数周期为A*B
使能TIMERn+1中断
使能TIMERn+1
使能TIMERn
TIMERn+1中断产生,在中断程序中使能TIMERn中断
TIMERn中断产生,计数周期完成
示意图如 图 10 所示:
图 10 级联模式工作示意图
8.3.5. 脉冲发送
所有TIMER模块均支持脉冲发送功能,可发送指定脉宽的方波。该计数器为向下计数。使用方式如下:
针对外部信号输入引脚进行如下操作
配置PORTCON模块中使能引脚输出功能
通过PORTX_FUNC寄存器将引脚切换为TIMER对应数字功能
TIMER初始化
指定要被设置的定时器
设置TIMER的工作模式为OC(输出比较)模式
设置定时周期
输出比较功能初始化
指定要被设置的定时器
设置当计数器的值递减到MATCH时引脚输出电平翻转
设置初始输出电平
启动定时器
每次周期结束时,会更新翻转电平配置
示意图如 图 11 所示:
图 11 脉冲发送示意图
8.3.6. 脉冲捕捉
所有TIMER模块均支持用于捕捉外部脉宽,可记录外部单个脉冲宽度。
使用方式如下:
针对外部信号输入引脚进行如下操作
配置PORTCON模块中INEN寄存器使能引脚输入功能
通过PORTX_FUNC寄存器将引脚切换为TIMER对应数字功能
设置中断使能寄存器(IEx),使能中断
使能寄存器(EN)对应位使能,启动捕捉功能
当指定引脚出现变化沿时,开始记录宽度,再次出现沿时,将对应种类的脉宽长度记录于ICLOWx或ICHIGHx寄存器,并产生中断。
进入中断,读取脉冲长度寄存器,获取指定种类的脉冲宽度
如果不操作EN位,则持续记录电平宽度,直至EN位关闭。
捕捉高电平示意图如 图 12 所示。
图 12 单次高电平捕捉示意图
低电平示意图如 图 13 所示。
图 13 单次低电平捕捉示意图
8.3.7. 霍尔接口
TIMER0模块提供了HALL接口功能,能够自动记录脉冲变化间隔,并产生中断。
使用方式如下:
HALL功能为指定引脚,且不同封装可能有所差异,具体引脚详见管脚排布:
配置PORTCON模块中INEN寄存器使能引脚输入功能
通过PORTX_FUNC寄存器将引脚切换为HALL功能
配置HALLSR寄存器,设置对应HALL输入信号的原状态
配置TIMER0装载值寄存器(LOADx)
使能HALL模式控制寄存器中输入HALL信号触发使能位(HALLEN)
清除输入HALL信号触发中断的状态(HALLIF)
使能HALL中断(HALLIE)
TIMER0使能(EN)
当外部HALLX引脚产生指定电平变化时,将(计数器加载值-计数器当前值)的结果保存到寄存器HALLDR中,计数器复位到加载值重新计数,并产生TIMER中断。同时HALLIF寄存器IFx将产生对应标示位,标识对应引脚产生电平变化。
记录示意图如 图 14 所示。
图 14 HALL记录值
HALL0、HALL1、HALL2是HALL功能的三个输入引脚,任意一个HALL引脚上出现跳变沿时,将(计数器加载值-计数器当前值)的结果保存到寄存器HALLDR中,并且计数器复位到加载值重新计数。
HALL0~2信号输入同时支持连接至CMP0~2,可通过ACMPCR2寄存器HALLx位配置,可选择为CMPxOUT引脚或者HALL IO引脚。
图 15 HALL对应关系图
8.3.8. 中断配置与清除
每路TIMER均具备独立中断,通过中断使能寄存器IE进行各TIMER中断使能。通过中断状态寄存器IF进行中断查询及清除。
TIMER中断
可通过配置中断使能寄存器IEx相应位使能中断。当检测到中断触发条件时,中断标志寄存器IFx相应位中置1。如需清除此标志,需在相应标志位中写1清零(R/W1C),否则中断在开启状态下会一直进入。
HALL中断
可通过配置HALL模式控制寄存器对应位设置输入HALLx信号触发中断的条件:上升沿、下降沿、上升沿和下降沿。可通过配置HALL中断使能寄存器HALLIE相应位使能中断。当检测到中断触发条件时,HALL中断标志寄存器HALLIF相应位中置1。如需清除此标志,需在相应标志位中写1清零(R/W1C),否则中断在开启状态下会一直进入。
8.4. 寄存器映射
名称 |
偏移 |
复位值 |
---|---|---|
TIMER0 BASE:0x40043800 TIMER1 BASE:0x40043840 TIMER2 BASE:0x40043880 |
||
LOAD |
0x00 |
0x00000000 |
VALUE |
0x04 |
0x00FFFFFF |
CR |
0x08 |
0x00000000 |
IE |
0x10 |
0x00000000 |
IF |
0x14 |
0x00000000 |
HALT |
0x18 |
0x00000000 |
OCCR |
0x1C |
0x00000000 |
OCMAT |
0x20 |
0x00000000 |
ICLOW |
0x28 |
0x00000000 |
ICHIGH |
0x2C |
0x00000000 |
PREDIV |
0x30 |
0x00000000 |
HALLIE |
0x400 |
0x00000000 |
HALLIF |
0x408 |
0x00000000 |
HALLEN |
0x40C |
0x00000000 |
HALLDR |
0x410 |
0x00000000 |
HALLSR |
0x41C |
0x00000000 |
ICSR |
0x420 |
0x00000000 |
EN |
0x440 |
0x00000000 |
8.5. 寄存器描述
8.5.1. LOAD寄存器
偏移: 0x00 |
复位值: 0x00000000 |
31 |
30 |
29 |
28 |
27 |
26 |
25 |
24 |
23 |
22 |
21 |
20 |
19 |
18 |
17 |
16 |
DATA |
|||||||
15 |
14 |
13 |
12 |
11 |
10 |
9 |
8 |
DATA |
|||||||
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
DATA |
位域 |
名称 |
类型 |
描述 |
---|---|---|---|
31:24 |
RO |
保留位 |
|
23:0 |
DATA |
R/W |
CNTUx的初始值 |
8.5.2. VALUE寄存器
偏移: 0x04 |
复位值: 0x00FFFFFF |
31 |
30 |
29 |
28 |
27 |
26 |
25 |
24 |
23 |
22 |
21 |
20 |
19 |
18 |
17 |
16 |
CNTU |
|||||||
15 |
14 |
13 |
12 |
11 |
10 |
9 |
8 |
CNTU |
|||||||
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
CNTD |
位域 |
名称 |
类型 |
描述 |
---|---|---|---|
31:24 |
RO |
保留位 |
|
23:8 |
CNTU |
RO |
计数器的当前值 |
7:0 |
CNTD |
RO |
计数器的当前值。CNTD每次记到0时,CNTU才翻转一次 |
8.5.3. 控制寄存器CTRL
偏移: 0x08 |
复位值: 0x00000000 |
31 |
30 |
29 |
28 |
27 |
26 |
25 |
24 |
23 |
22 |
21 |
20 |
19 |
18 |
17 |
16 |
15 |
14 |
13 |
12 |
11 |
10 |
9 |
8 |
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
EDGESEL |
MODE |
SRCSEL |
位域 |
名称 |
类型 |
描述 |
---|---|---|---|
31:6 |
RO |
保留位 |
|
5:4 |
EDGESEL |
R/W |
输入脉冲测量模式下,选择启动计数的沿。 00:检测到上升沿或者下降沿后开始计数 01:检测到上升沿开始计数 10:检测到下降沿开始计数 |
3:2 |
MODE |
R/W |
定时器工作模式。 00:普通定时器模式 01:输入脉冲测量模式(仅当PINO>x时才可以配置为这个值) 10:输出PWM模式(仅当PONO>x时才可以配置为这个值) |
1:0 |
SRCSEL |
R/W |
定时器计数触发选择 00:使用内部系统时钟上升沿 |
8.5.4. IE寄存器
偏移: 0x10 |
复位值: 0x00000000 |
31 |
30 |
29 |
28 |
27 |
26 |
25 |
24 |
23 |
22 |
21 |
20 |
19 |
18 |
17 |
16 |
15 |
14 |
13 |
12 |
11 |
10 |
9 |
8 |
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
PIFINTMSK |
PIRINTMSK |
POT0INTMSK |
TOINTMSK |
位域 |
名称 |
类型 |
描述 |
---|---|---|---|
31:5 |
RO |
保留位 |
|
4 |
PIFINTMSK |
R/W |
输入脉冲下降沿中断屏蔽(当PINO>x时,配置此位才生效) 0:屏蔽 1:不屏蔽 |
3 |
PIRINTMSK |
R/W |
输入脉冲上升沿中断屏蔽(当PINO>x时,配置此位才生效) 0:屏蔽 1:不屏蔽 |
2 |
RO |
保留位 |
|
1 |
POT0INTMSK |
R/W |
输出PWM翻转点0中断屏蔽(当PONO>x时,配置此位才生效) 0:屏蔽 1:不屏蔽 |
0 |
TOINTMSK |
R/W |
计数器溢出中断屏蔽 0:屏蔽 1:不屏蔽 |
8.5.5. IF寄存器
偏移: 0x14 |
复位值: 0x00000000 |
31 |
30 |
29 |
28 |
27 |
26 |
25 |
24 |
23 |
22 |
21 |
20 |
19 |
18 |
17 |
16 |
15 |
14 |
13 |
12 |
11 |
10 |
9 |
8 |
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
PIFINTST |
PIRINTST |
POT0INTST |
TOINTST |
位域 |
名称 |
类型 |
描述 |
---|---|---|---|
31:5 |
RO |
保留位 |
|
4 |
PIFINTST |
R,W1C |
输入脉冲下降沿中断状态(当PINO>x时,配置此位才生效) 1:中断发生 0:中断未发生 |
3 |
PIRINTST |
R,W1C |
输入脉冲上升沿中断状态(当PINO>x时,配置此位才生效) 1:中断发生 0:中断未发生 |
2 |
RO |
||
1 |
POT0INTST |
R,W1C |
输出PWM翻转点0中断状态(当PONO>x时,配置此位才生效) 1:中断发生 0:中断未发生 |
0 |
TOINTST |
R,W1C |
计数器溢出中断状态 1:中断发生 0:中断未发生 |
8.5.6. HALT寄存器
偏移: 0x18 |
复位值: 0x00000000 |
31 |
30 |
29 |
28 |
27 |
26 |
25 |
24 |
23 |
22 |
21 |
20 |
19 |
18 |
17 |
16 |
15 |
14 |
13 |
12 |
11 |
10 |
9 |
8 |
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
Halt |
位域 |
名称 |
类型 |
描述 |
---|---|---|---|
31:1 |
RO |
保留位 |
|
0 |
halt |
R/W |
定时器暂停控制 1:暂停当前定时器的计数 0:当前定时器正常减计数 |
8.5.7. OCCR寄存器
偏移: 0x1C |
复位值: 0x00000000 |
31 |
30 |
29 |
28 |
27 |
26 |
25 |
24 |
23 |
22 |
21 |
20 |
19 |
18 |
17 |
16 |
15 |
14 |
13 |
12 |
11 |
10 |
9 |
8 |
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
POMSK |
POINITVAL |
POMSKVAL |
位域 |
名称 |
类型 |
描述 |
---|---|---|---|
31:3 |
RO |
保留位 |
|
2 |
POMSK |
R/W |
PWM输出屏蔽位。将PWM的输出屏蔽到POMSKVALx指定的值。当PONO>x时才有效。 |
1 |
POINITVAL |
R/W |
PWM输出的起始值。当PONO>x时才有效。 |
0 |
POMSKVAL |
R/W |
PWM输出屏蔽值。当PONO>x时才有效。 |
8.5.8. OCMAT控制寄存器
偏移: 0x20 |
复位值: 0x00000000 |
31 |
30 |
29 |
28 |
27 |
26 |
25 |
24 |
23 |
22 |
21 |
20 |
19 |
18 |
17 |
16 |
POTVAL |
|||||||
15 |
14 |
13 |
12 |
11 |
10 |
9 |
8 |
POTVAL |
|||||||
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
POTVAL |
位域 |
名称 |
类型 |
描述 |
---|---|---|---|
31:24 |
RO |
保留位 |
|
23:0 |
POTVAL |
R/W |
PWM输出高电平宽度。当POTVAL==0时,占空比为0;当POTVAL>CNTU时,占空比为100%。 |
8.5.9. ICLOW寄存器
偏移: 0x28 |
复位值: 0x00000000 |
31 |
30 |
29 |
28 |
27 |
26 |
25 |
24 |
23 |
22 |
21 |
20 |
19 |
18 |
17 |
16 |
PLOW |
|||||||
15 |
14 |
13 |
12 |
11 |
10 |
9 |
8 |
PLOW |
|||||||
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
PLOW |
位域 |
名称 |
类型 |
描述 |
---|---|---|---|
31:24 |
RO |
保留位 |
|
23:0 |
PLOW |
R/W |
输入脉冲的低电平长度。当PINO>x时才有效,否则为常0。当输入脉冲的上升沿来到时,自动更新。 |
8.5.10. ICHIGH寄存器
偏移: 0x2C |
复位值: 0x00000000 |
31 |
30 |
29 |
28 |
27 |
26 |
25 |
24 |
23 |
22 |
21 |
20 |
19 |
18 |
17 |
16 |
PHIGH |
|||||||
15 |
14 |
13 |
12 |
11 |
10 |
9 |
8 |
PHIGH |
|||||||
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
PHIGH |
位域 |
名称 |
类型 |
描述 |
---|---|---|---|
31:24 |
RO |
||
23:0 |
PHIGH |
RO |
输入脉冲的高电平长度。当PINO>x时才有效,否则为常0。当输入脉冲的下降沿来到时,自动更新。 |
8.5.11. PREDIV寄存器
偏移: 0x30 |
复位值: 0x00000000 |
31 |
30 |
29 |
28 |
27 |
26 |
25 |
24 |
23 |
22 |
21 |
20 |
19 |
18 |
17 |
16 |
15 |
14 |
13 |
12 |
11 |
10 |
9 |
8 |
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
LDVALD |
位域 |
名称 |
类型 |
描述 |
---|---|---|---|
31:24 |
RO |
||
23:0 |
LDVALD |
R/W |
计数器 CNTDx计数初始值,也是定时器x计数低八位的初值 |
8.5.12. HALLIE寄存器
偏移: 0x400 |
复位值: 0x00000000 |
31 |
30 |
29 |
28 |
27 |
26 |
25 |
24 |
23 |
22 |
21 |
20 |
19 |
18 |
17 |
16 |
15 |
14 |
13 |
12 |
11 |
10 |
9 |
8 |
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
HALLIE |
位域 |
名称 |
类型 |
描述 |
---|---|---|---|
31:2 |
RO |
RESERVED |
|
1:0 |
HALLIE |
R/W |
HALL中断使能。仅当定义HALL时有效,否则为只读,且为常0。 1:HALL中断使能 0:HALL中断不使能 |
8.5.13. HALLIF寄存器
偏移: 0x408 |
复位值: 0x00000000 |
31 |
30 |
29 |
28 |
27 |
26 |
25 |
24 |
23 |
22 |
21 |
20 |
19 |
18 |
17 |
16 |
15 |
14 |
13 |
12 |
11 |
10 |
9 |
8 |
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
HALLINTST2 |
HALLINTST1 |
HALLINTST0 |
位域 |
名称 |
类型 |
描述 |
---|---|---|---|
31:6 |
RO |
RESERVED |
|
2 |
HALLINTST2 |
R/W |
输入HALL信号2触发中断的状态 |
1 |
HALLINTST1 |
R/W |
输入HALL信号1触发中断的状态 |
0 |
HALLINTST0 |
R/W |
输入HALL信号0触发中断的状态 |
8.5.14. HALLEN寄存器
偏移: 0x40C |
复位值: 0x00000000 |
31 |
30 |
29 |
28 |
27 |
26 |
25 |
24 |
23 |
22 |
21 |
20 |
19 |
18 |
17 |
16 |
15 |
14 |
13 |
12 |
11 |
10 |
9 |
8 |
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
HALLMD |
位域 |
名称 |
类型 |
描述 |
---|---|---|---|
31:2 |
RO |
RESERVED |
|
1:0 |
HALLEN |
R/W |
输入HALL信号触发使能 1’b0:不触发 1’b1:触发 |
8.5.15. HALLDR寄存器
偏移: 0x410 |
复位值: 0x00000000 |
31 |
30 |
29 |
28 |
27 |
26 |
25 |
24 |
23 |
22 |
21 |
20 |
19 |
18 |
17 |
16 |
HALLDR |
|||||||
15 |
14 |
13 |
12 |
11 |
10 |
9 |
8 |
HALLDR |
|||||||
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
HALLDR |
位域 |
名称 |
类型 |
描述 |
---|---|---|---|
31:24 |
RO |
RESERVED |
|
23:0 |
HALLDR |
R/W |
HALL组1触发时,通道0计数器的计数值。仅当定义HALL时有效,否则为只读,且为常0。 由于本模块为减计数,通道0计数器作为HALL功能使用时,该计数值=(计数器加载值-触发HALL沿时计数器当前值) |
8.5.16. HALLSR寄存器
偏移: 0x41C |
复位值: 0x00000000 |
31 |
30 |
29 |
28 |
27 |
26 |
25 |
24 |
23 |
22 |
21 |
20 |
19 |
18 |
17 |
16 |
15 |
14 |
13 |
12 |
11 |
10 |
9 |
8 |
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
HALLSR2 |
HALLSR1 |
HALLSR0 |
位域 |
名称 |
类型 |
描述 |
---|---|---|---|
31:3 |
RO |
RESERVED |
|
2 |
HALLSR2 |
R/W |
输入HALL信号2的状态 |
1 |
HALLSR1 |
R/W |
输入HALL信号1的状态 |
0 |
HALLSR0 |
R/W |
输入HALL信号0的状态 |
8.5.17. ICSR寄存器
偏移: 0x420 |
复位值: 0x00000000 |
31 |
30 |
29 |
28 |
27 |
26 |
25 |
24 |
23 |
22 |
21 |
20 |
19 |
18 |
17 |
16 |
15 |
14 |
13 |
12 |
11 |
10 |
9 |
8 |
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
IC_TIMER2 |
IC_TIMER1 |
IC_TIMER0 |
位域 |
名称 |
类型 |
描述 |
---|---|---|---|
31:3 |
RO |
||
2 |
IC_TIMER2 |
RO |
Timer2输入捕获信号状态 |
1 |
IC_TIMER1 |
RO |
Timer1输入捕获信号状态 |
0 |
IC_TIMER0 |
RO |
Timer0输入捕获信号状态 |
8.5.18. EN寄存器
偏移: 0x440 |
复位值: 0x00000000 |
31 |
30 |
29 |
28 |
27 |
26 |
25 |
24 |
23 |
22 |
21 |
20 |
19 |
18 |
17 |
16 |
15 |
14 |
13 |
12 |
11 |
10 |
9 |
8 |
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
TIMER2_EN |
TIMER1_EN |
TIMER0_EN |
位域 |
名称 |
类型 |
描述 |
---|---|---|---|
31: 3 |
RO |
RESERVED |
|
2 |
TIMER2_EN |
R/W |
定时器timer2使能。 |
1 |
TIMER1_EN |
R/W |
定时器timer1使能。 |
0 |
TIMER0_EN |
R/W |
定时器timer0使能。 |