BASIC_TIMER #################### .. toctree:: :maxdepth: 3 :caption: 目录: 简介 ---- Nuclei 基础定时器由一个32位自动重载计数器组成,该计数器由可编程预分频器驱动。 它完全独立,可用作通用定时器用于时基生成。 主要特性 -------- 基础定时器的主要特性如下: - 32位自动重载递增计数器 - 16位可编程预分频器,用于分频计数器时钟频率 - 通过两个更新事件源生成中断/DMA请求: - 计数器溢出 - 软件生成的事件 基础定时器的框图如图 5.1: 基础定时器框图所示。 .. figur/assets/images/ip/nuclei_basic_timer_doc/images/basic_timer_top.jpg :alt: 基础定时器框图 :align: center 图 5.1: 基础定时器框图 功能描述 -------- 时基单元 -------- 可编程定时器的主要模块是32位递增计数器及其相关的自动重载寄存器。计数器时钟可以通过预分频器分频。 计数器、自动重载寄存器和预分频器寄存器可以由软件写入或读取。即使在计数器运行时也是如此。 时基单元包括: - 计数器寄存器 (TIME_CNT) - 预分频器寄存器 (TIME_PSC) - 自动重载寄存器 (TIME_ARR) 自动重载寄存器是预加载的。每次尝试写入或读取自动重载寄存器时都会访问预加载寄存器。预加载寄存器的内容永久传输到影子寄存器中,或在每个更新事件UEV时传输,这取决于TIME_CR1寄存器中的AUTO_BUFFER_EN位。当计数器达到溢出值且TIME_CR1寄存器中的UPD_EVT_DIS位等于0时,会发送更新事件。它也可以由软件生成。每种配置的更新事件生成都有详细描述。 只有当TIME_CR1寄存器中的计数器使能位(CEN)设置时,计数器才由预分频器输出CK_CNT提供时钟。 预分频器描述 ~~~~~~~~~~~~ 预分频器可以将计数器时钟频率除以1到65536之间的任何因子。它基于一个由16位寄存器(在TIME_PSC寄存器中)控制的16位计数器。它可以在运行中更改,因为TIME_PSC控制寄存器是缓冲的。新的预分频比在下一个更新事件时生效。 图6.1 Counter timing diagram with prescaler division is 2 (第9页)给出了当预分频比在运行中更改时计数器行为的示例。 .. figur/assets/images/ip/nuclei_basic_timer_doc/images/prescaler_division.drawio.png :alt: 预分频器分频为2的计数器时序图 :align: center 图 6.1: 预分频器分频为2的计数器时序图 计数模式 -------- 计数器从0计数到自动重载值(TIME_ARR寄存器的内容),然后从0重新开始并生成计数器溢出事件。 更新事件可以在每次计数器溢出时生成,或通过在TIME_EGR寄存器中设置UPD_EVT_SW位(通过软件)生成。 UEV事件可以通过在TIME_CR1寄存器中设置UPD_EVT_DIS位由软件禁用。这避免了在向预加载寄存器写入新值时更新影子寄存器。这样,在UPD_EVT_DIS位被写入0之前不会发生更新事件,但是计数器和预分频器计数器都从0重新开始(但预分频率不会改变)。此外,如果TIME_CR1寄存器中的UPD_EVT_SEL(更新请求选择)位被设置,设置UG位会生成更新事件UEV,但EVT_STATUS位不会被设置(因此不会发送中断或DMA请求)。 当更新事件发生时,所有寄存器都会更新,并且更新标志(TIME_SR寄存器中的EVT_STATUS位)被设置(取决于UPD_EVT_SEL位): - 预分频器的缓冲区重新加载预加载值(TIME_PSC寄存器的内容) - 自动重载影子寄存器使用预加载值(TIME_ARR)更新 以下图显示了当TIME_ARR = 0x3时不同时钟频率下计数器行为的一些示例。 .. figur/assets/images/ip/nuclei_basic_timer_doc/images/wave.drawio.png :alt: 计数器时序图,内部时钟除以2 :align: center 图 6.2: 计数器时序图,内部时钟除以2 时钟源 ------ 计数器时钟由内部时钟(icb_clk)源提供。 CEN(在TIME_CR1寄存器中)和UPD_EVT_SW位(在TIME_EGR寄存器中)是实际控制位,只能由软件更改(除了UPD_EVT_SW保持自动清除)。一旦CEN位被写入1,预分频器就由内部时钟提供时钟。 调试模式 -------- 当子系统进入调试模式时,基础定时器计数器要么继续正常工作,要么停止,这取决于接口的状态(dbg_stop_i)。 中断 ----- 表 7.1: 基础定时器中断请求 呈现了基础定时器中断请求。 .. list-table:: 表 7.1: 基础定时器中断请求 :header-rows: 1 :widths: auto * - 中断事件 - 使能控制位 * - bsc_tim_sr_r - int_en 中断映射如图 7.1: 基础定时器中断映射图所示。 .. figur/assets/images/ip/nuclei_basic_timer_doc/images/Basic_timer_Interrupt_Mapping_Diagram.jpg :alt: 基础定时器中断映射图 :align: center 图 7.1: 基础定时器中断映射图 寄存器 ------- 寄存器描述 ~~~~~~~~~~~~ BASIC_TIMER 寄存器 ^^^^^^^^^^^^^^^^^^^ BASIC_TIMER中的寄存器及其相应的偏移量如表 8.1: BASIC_TIMER中寄存器的偏移地址所示。 .. list-table:: 表 8.1: BASIC_TIMER中寄存器的偏移地址 :header-rows: 1 :widths: auto * - 偏移量 - 寄存器名称 - 功能描述 * - 0x0 - CR1 - 定时器控制寄存器1 * - 0x4 - CR2 - 定时器控制寄存器2 * - 0xC - DIER - DMA/中断使能寄存器 * - 0x10 - SR - 状态寄存器 * - 0x14 - EGR - 事件生成寄存器 * - 0x24 - CNT - 计数器寄存器 * - 0x28 - PSC - 预分频器寄存器 * - 0x2C - ARR - 自动重载寄存器 * - 0x30 - IP_VERSION - IP版本 CR1 ^^^^^^^^^^^^^^^^^^^ 地址偏移:0x0 .. list-table:: 表 8.2: CR1的格式 :header-rows: 1 :widths: 12 10 10 10 58 * - 字段 - 位 - 访问 - 复位值 - 描述 * - CEN - 0 - R/W - 0x0 - 计数器使能 - 1'b0:计数器禁用 - 1'b1:计数器使能 注意:当更新事件发生时,在单脉冲模式下此位被自动清除 * - UPD_EVT_DIS - 1 - R/W - 0x0 - 更新事件禁用 - 1'b0:更新事件使能。更新事件由以下事件之一生成: a. 事件1:计数器溢出 b. 事件2:设置UG位 - 缓冲寄存器然后加载其预加载值 - 1'b1:更新事件禁用。不生成更新事件,影子寄存器(ARR/PSC)保持其值。 注意: - 1.time_counter被溢出或UG位复位 - 2.预分频器计数器被UG位复位 * - UPD_EVT_SEL - 2 - R/W - 0x0 - 更新事件源选择 - 1'b0:以下任何事件都会生成更新中断或DMA请求(如果使能): a. 事件1:计数器溢出 b. 事件2:通过软件设置UG位 - 1'b1:只有计数器溢出生成更新中断或DMA请求(如果使能) * - OPM - 3 - R/W - 0x0 - 单脉冲模式 - 1'b0:计数器在更新事件时不停止 - 1'b1:计数器在下一个更新事件时停止计数,同时清除CEN位 * - 保留 - 6:4 - / - 0x0 - / * - AUTO_BUFFER_EN - 7 - R/W - 0x0 - 自动缓冲使能 - 1'b0:TIMx_ARR寄存器未缓冲 - 1'b1:TIMx_ARR寄存器被缓冲 * - 保留 - 31:8 - / - 0x0 - / CR2 ^^^^^^^^^^^^^^^^^^^ 地址偏移:0x4 .. list-table:: 表 8.3: CR2的格式 :header-rows: 1 :widths: 12 10 10 10 58 * - 字段 - 位 - 访问 - 复位值 - 描述 * - 保留 - 3:0 - / - 0x0 - / * - MMS - 6:4 - R/W - 0x0 - 主模式选择 这些位用于选择要在主模式下发送到从定时器以进行同步的信息(TRGO)。 组合如下: - 3'b000:复位 - TIME_EGR寄存器的UG位用作触发输出(TRGO) - 3'b001:使能 - TIEM_CR1[0]的CEN位用作触发输出(TRGO) - 3'b010:更新 - 更新事件被选择为触发输出(TRGO) * - 保留 - 31:7 - / - 0x0 - / DIER ^^^^^^^^^^^^^^^^^^^ 地址偏移:0xC .. list-table:: 表 8.4: DIER的格式 :header-rows: 1 :widths: 12 10 10 10 58 * - 字段 - 位 - 访问 - 复位值 - 描述 * - UIE - 0 - R/W - 0x0 - 使能更新事件用作basic_timer中断 - 1'b0:当更新事件设置时,不发送中断 - 1'b1:当更新事件设置时,发送中断 * - 保留 - 7:1 - / - 0x0 - / * - UDE - 8 - R/W - 0x0 - 使能更新事件用作dma请求 - 1'b0:当更新事件设置时,不发送中断 - 1'b1:当更新事件设置时,发送中断 * - 保留 - 31:9 - / - 0x0 - / SR ^^^^^^^^^^^^^^^^^^^ 地址偏移:0x10 .. list-table:: 表 8.5: SR的格式 :header-rows: 1 :widths: 12 10 10 10 58 * - 字段 - 位 - 访问 - 复位值 - 描述 * - EVT_STATUS - 0 - W0C - 0x0 - 更新事件状态 - 1'b0:没有更新事件发生 - 1'b1:更新事件中断挂起。当更新事件设置时,此位由硬件设置 注意:此位在更新事件时由硬件设置。它由软件清除。 * - 保留 - 31:1 - / - 0x0 - / EGR ^^^^^^^^^^^^^^^^^^^ 地址偏移:0x14 .. list-table:: 表 8.6: EGR的格式 :header-rows: 1 :widths: 12 10 10 10 58 * - 字段 - 位 - 访问 - 复位值 - 描述 * - UG - 0 - WO - 0x0 - 更新生成 此位可以由软件设置,它被硬件自动清除。 - 1'b0:无动作 - 1'b1:由软件生成更新事件 * - 保留 - 31:1 - / - 0x0 - / CNT ^^^^^^^^^^^^^^^^^^^ 地址偏移:0x24 .. list-table:: 表 8.7: CNT的格式 :header-rows: 1 :widths: 12 10 10 10 58 * - 字段 - 位 - 访问 - 复位值 - 描述 * - CNT - 31:0 - R/W - 0x0 - 配置定时器计数值 PSC ^^^^^^^^^^^^^^^^^^^ 地址偏移:0x28 .. list-table:: 表 8.8: PSC的格式 :header-rows: 1 :widths: 12 10 10 10 58 * - 字段 - 位 - 访问 - 复位值 - 描述 * - PSC - 15:0 - R/W - 0x0 - 预分频器值 计数器时钟频率CK_CNT等于 fclk / (PSC[15:0] + 1)。 PSC包含在每个更新事件后要加载到活动预分频器寄存器中的值。 * - 保留 - 31:16 - / - 0x0 - / ARR ^^^^^^^^^^^^^^^^^^^ 地址偏移:0x2C .. list-table:: 表 8.9: ARR的格式 :header-rows: 1 :widths: 12 10 10 10 58 * - 字段 - 位 - 访问 - 复位值 - 描述 * - ARR - 31:0 - R/W - 0xffff_ffff - 自动重载值 ARR是在每个更新事件后要加载到影子寄存器中的值 (TIME_CR1[7]==1)或在时间内用icb总线更改 (TIME_CR1[7]==0)。 注意:当ARR为零时,time_counter将挂起;当ARR的值更改时,time_counter将继续计数。 IP_VERSION ^^^^^^^^^^^^^^^^^^^ 地址偏移:0x30 .. list-table:: 表 8.10: IP_VERSION的格式 :header-rows: 1 :widths: 12 10 10 10 58 * - 字段 - 位 - 访问 - 复位值 - 描述 * - VERSION_NUM - 31:0 - RO - 0x0001_0201 - BASIC_TIMER的IP版本