基本定时器

简介

基本定时器 (Basic Timer) 为一款简洁高效的 32 位定时外设,采用纯 32 位计数器架构,不包含预分频功能。定时器在使能后从 0 开始向上计数,当计数值达到用户配置的重载值时,自动产生更新事件,并将计数器清零重新开始计数,以此实现自动重载、连续循环计时功能。

特性

  • 分辨率为 32 位

  • 计数模式为向上计数

  • 支持中断

  • 支持自动重载

RTL8721Dx:

名称

LS: TIM0 ~ TIM7

HP: TIM10 ~ TIM13

时钟源

SDM 32kHz

XTAL 40MHz

备注

TIM10 ~ TIM13 的时钟源源自 XTAL 40MHz,经过 40 分频。

框图

基本定时器主要由 32 位计数器和自动重载寄存器构成,框图如下所示。

../../_images/block_diagram1.svg

框图中各模块的作用如下:

  • CK_CNT:计数时钟。基本定时器不含预分频器,该时钟直接驱动计数器。

  • CNT counter:32 位计数器,每个 CK_CNT 周期计数值加 1。

  • Auto-reload register:自动重载寄存器,用于保存重载值,决定计数周期。

功能描述

向上计数模式

该定时器为 32 位计数器,并配有自动重载寄存器。软件可读写计数器和自动重载寄存器,计数器运行期间同样可以读写。

时基单元包括:

  • 计数器寄存器 (TIMx_CNT)

  • 自动重载寄存器 (TIMx_ARR)

基本定时器工作在向上计数模式,计数器从 0 计数到重载值(TIMx_ARR 寄存器的内容)。当计数器达到自动重载值时,会产生计数器溢出事件。

预加载自动重载寄存器

自动重载寄存器 TIMx_ARR 支持预加载机制,内部由预加载寄存器和影子寄存器两级构成。软件读写 TIMx_ARR 时访问预加载寄存器,计数器实际比较影子寄存器。TIMx_CR 中的自动重载预加载使能位 ARPE 控制预加载值何时传输至影子寄存器:

  • ARPE 置位:预加载值仅在 UEV 发生时传输至影子寄存器;

  • ARPE 清零:预加载值立即写入影子寄存器。

UEV 是定时器内部的同步时刻:发生时,定时器相关寄存器完成更新,计数器进入新一轮计数,同时置位 TIMx_SR 中的 UIF 标志。

更新事件有以下两种触发方式,前提是 TIMx_CR 中的更新禁止位 UDIS 为 0:

  1. 硬件触发:计数器向上计数溢出时,硬件自动产生更新事件;

  2. 软件触发:软件置位 TIMx_EGR 中的更新产生位 UG,同时会重新初始化计数器。该方式要求 TIMx_CR 中的更新请求源位 URS 为 0。

置位 UDIS 可禁止产生更新事件,此时影子寄存器保持原值,在 UDIS 清零之前任何触发方式均不会产生更新事件。ARPE 置位时,向预加载寄存器写入新的重载值前可先置位 UDIS,避免影子寄存器被同步更新,保证配置写入的稳定性。

中断事件

定时器仅有一种中断源:UEV。更新事件发生时(触发方式及条件参见 预加载自动重载寄存器),若 TIMx_DIER 中的更新中断使能位 UIE 为 1,将触发系统中断。

更新中断的状态可通过 TIMx_SR 中的 UIF 位查看,也可通过写 UIF 位清除。

安全属性

多个基本定时器共用同一外设端口,对应同一个 PPC (Peripheral Protection Controller)。由于共用端口的安全属性由 PPC 统一配置,无法实现单个定时器安全属性的独立配置。为支持单个基本定时器安全属性的灵活配置,每个基本定时器均集成专用的安全控制寄存器。 该安全控制寄存器 TIMx_SEC (REG_TIM_SEC) 中的 SEC 位为安全使能位,用于独立配置对应定时器的安全属性,且仅允许安全域访问,非安全域无法对其执行读写操作。

TIMx_SEC (REG_TIM_SEC) 的 SEC 位置位时,该定时器为安全定时器,其所有寄存器仅可通过安全地址访问,禁止非安全地址访问。

SEC 位清零时,该定时器为非安全定时器。除 TIMx_SEC 外,其余所有寄存器均可通过安全地址与非安全地址访问。

寄存器

RTL8721Dx:

Base Address:

  • TIMER0_REG : 0x41017000

  • TIMER1_REG : 0x41017200

  • TIMER2_REG : 0x41017400

  • TIMER3_REG : 0x41017600

  • TIMER4_REG : 0x41017800

  • TIMER5_REG : 0x41017A00

  • TIMER6_REG : 0x41017C00

  • TIMER7_REG : 0x41017E00

  • TIMER10_REG : 0x41100400

  • TIMER11_REG : 0x41100600

Name

Address offset

Access

Description

REG_TIM_EN

000h

R/W

Users can configure and observe the counter operation.

REG_TIM_CR

004h

R/W

This register is about the update operation.

REG_TIM_DIER

008h

R/W

This is the interrupt enable register.

REG_TIM_SR

00Ch

R/W

This register is about timer interrupt and update status.

REG_TIM_EGR

010h

R/W

This register is about update generation, and is user defined.

REG_TIM_CNT

014h

R

This is the timer count register.

REG_TIM_ARR

01Ch

R/W

This is the auto-reload value register.

REG_TIM_SEC

020h

R/W

This register is about security status.

REG_TIM_BASIC_DUMMY

024h

R/W

REG_TIM_EN

  • Name: TIM enable register

  • Size: 32

  • Address offset: 000h

  • Read/write access: R/W

Users can configure and observe the counter operation.

31:17 RSVD 16 CNT_EN 15:9 RSVD 8 CNT_RUN 7:2 RSVD 1 CNT_STOP 0 CNT_START

Bit

Symbol

Access

INI

Description

31:17

RSVD

R

-

Reserved

16

CNT_EN

R

0x0

Counter working status

  • 0: Counter is stopped

  • 1: Counter is working

15:9

RSVD

R

-

Reserved

8

CNT_RUN

R

0x0

Counter run status

  • 0: Counter is disabled

  • 1: Counter is enabled

7:2

RSVD

R

-

Reserved

1

CNT_STOP

R/W

0x0

Disable the counter

Poll CNT_RUN to see the counter status. If CNT_RUN is 0, it means that the counter has been disabled internally.

0

CNT_START

R/W

0x0

Enable the counter

Poll CNT_RUN to see the counter status. If CNT_RUN is 1, it means that the counter has been enabled internally.

REG_TIM_CR

  • Name: TIM control register

  • Size: 32

  • Address offset: 004h

  • Read/write access: R/W

This register is about the update operation.

31:5 RSVD 4 ARPE 3 RSVD 2 URS 1 UDIS 0 RSVD

Bit

Symbol

Access

INI

Description

31:5

RSVD

R

-

Reserved

4

ARPE

R/W

0x0

Enable auto-reload preloading

  • 0: TIM_ARR register is not buffered.

  • 1: TIM_ARR register is buffered.

3

RSVD

R

-

Reserved

2

URS

R/W

0x0

Update request source

  • 0: Counter overflow and setting the UG bit

  • 1: Counter overflow

1

UDIS

R/W

0x0

Disable UEV

Shadow registers keep their values. Otherwise, buffered registers are then loaded with their preload values when UEV happens.

0

RSVD

R

-

Reserved

REG_TIM_DIER

  • Name: TIM interrupt enable register

  • Size: 32

  • Address offset: 008h

  • Read/write access: R/W

This is the interrupt enable register.

31:1 RSVD 0 UIE

Bit

Symbol

Access

INI

Description

31:1

RSVD

R

-

Reserved

0

UIE

R/W

0x0

Enable update interrupt

REG_TIM_SR

  • Name: TIM status register

  • Size: 32

  • Address offset: 00Ch

  • Read/write access: R/W

This register is about timer interrupt and update status.

31 UG_DONE 30:1 RSVD 0 UIF

Bit

Symbol

Access

INI

Description

31

UG_DONE

R

0x1

UG operation status

This bit is cleared by hardware when the UG bit in the TIMx_EGR register is set. When the UG operation is done, hardware set this bit to '1'. So, software can poll this bit to see the UG operation status.

30:1

RSVD

R

-

Reserved

0

UIF

R/W

0x0

Update interrupt flag

REG_TIM_EGR

  • Name: TIM event generation register

  • Size: 32

  • Address offset: 010h

  • Read/write access: R/W

This register is about update generation, and is user defined.

31:1 RSVD 0 UG

Bit

Symbol

Access

INI

Description

31:1

RSVD

R

-

Reserved

0

UG

R/W

0x0

Update generation

Re-initialize the counter and generate an update of registers. Note that the prescaler counter is cleared too. (anyway the prescaler ratio is not affected)

REG_TIM_CNT

  • Name: TIM counter register

  • Size: 32

  • Address offset: 014h

  • Read/write access: R

This is the timer count register.

31:0 CNT

Bit

Symbol

Access

INI

Description

31:0

CNT

R

0x0

Counter value

REG_TIM_ARR

  • Name: TIM auto-reload register

  • Size: 32

  • Address offset: 01Ch

  • Read/write access: R/W

This is the auto-reload value register.

31:0 ARR

Bit

Symbol

Access

INI

Description

31:0

ARR

R/W

0xFFFFFFFF

The value to be loaded in the actual auto-reload register. It can be preloaded by setting ARPE bit in TIM_CR.

REG_TIM_SEC

  • Name: TIM security control register

  • Size: 32

  • Address offset: 020h

  • Read/write access: R/W

This register is about security status.

31:1 RSVD 0 SEC

Bit

Symbol

Access

INI

Description

31:1

RSVD

R

-

Reserved

0

SEC

R/W

0x0

Secure timer enable

  • 0: This is a non-secure timer. All its registers except TIMx_SEC can be accessed from both secure and non-secure address. As a result, both secure and non-secure code can access it.

  • 1: This is a secure timer. All its registers can only be accessed from secure address. As a result, only secure code can access it. Non-secure code can't access it through non-secure address.

REG_TIM_BASIC_DUMMY

  • Name: Timer Basic Dummy Register

  • Size: 32

  • Address offset: 024h

  • Read/write access: R/W

31:0 DUMMY

Bit

Symbol

Access

INI

Description

31:0

DUMMY

R/W

ffffh

Dummy register