blob: 50a5ec34084060d6dbdab9b3d96a5a8f4db700bb [file] [log] [blame]
.. raw:: html
<!---
# SPDX-FileCopyrightText: 2020 Efabless Corporation
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
# SPDX-License-Identifier: Apache-2.0
-->
Counter-Timers
==============
The counter/timer is a general-purpose 32-bit adder and subtractor that can be configured for a variety of timing functions including one-shot counts, continuous timing and interval interrupts.
At a core clock rate of 80 MHz, the longest single time interval is 26.84 seconds.
Functionality
-------------
When enabled, the counter counts up or down from the value set in ``reg_timerX_value`` (X is replaced by 0 or 1) at the time the counter is enabled.
If counting up, the count continues until the counter reaches ``reg_timerX_data``.
If counting down, the count continues until the counter reaches zero.
In continuous mode, the counter resets to zero if counting up, and resets to the value in ``reg_timerX_data`` if counting down, and the count continues immediately.
If the interrupt is enabled, the counter will generate an interrupt on every cycle.
In one-shot mode, the counter triggers an interrupt (:doc:`IRQ channels 10 and 11 <irq>` for Timer 0 and 1, respectively), when it reaches the value of ``reg_timerX_data`` (up count) or zero (down count) and stops.
.. note::
When the counter/timer is disabled, the ``reg_timerX_value`` remains unchanged, which puts the timer in a hold state.
When reenabled, counting resumes.
To reset the timer, write zero to the ``reg_timerX_value`` register.
Counter-Timer 0
---------------
The counter triggers an interrupt on IRQ channel 10.
.. _reg_timer0_config:
``reg_timer0_config``
~~~~~~~~~~~~~~~~~~~~~
Base address: ``0x22000000``
.. wavedrom::
{ "reg": [
{"name": "Timer config", "bits": 8},
{"name": "(undefined, reads zero)", "bits": 24, "type": 1}]
}
.. list-table:: Timer 0 configuration bit definitions
:name: reg_timer0_configuration_bit_definitions
:header-rows: 1
:widths: auto
* - Bit
- Name
- Values
* - 3
- Counter/timer enable
- 0 - counter/timer disabled
1 - counter/timer enabled
* - 2
- One-shot mode
- 0 - continuous mode
1 - one-shot mode
* - 1
- Updown
- 0 - count down
1 - count up
* - 0
- Interrupt enable
- 0 - interrupt disabled
1 - interrupt enabled
.. _reg_timer0_value:
``reg_timer0_value``
~~~~~~~~~~~~~~~~~~~~
Base address: ``0x22000004``
.. wavedrom::
{ "reg": [
{"name": "Timer value", "bits": 32}]
}
|
The value in this register is the current value of the counter.
Value is 32 bits.
The register is read-write and can be used to reset the timer.
.. _reg_timer0_data:
``reg_timer0_data``
~~~~~~~~~~~~~~~~~~~~
Base address: ``0x22000008``
.. wavedrom::
{ "reg": [
{"name": "Timer data", "bits": 32}]
}
|
The value in this register is the reset value for the comparator.
Counter-Timer 1
---------------
The counter triggers an interrupt on IRQ channel 11.
.. _reg_timer1_config:
``reg_timer1_config``
~~~~~~~~~~~~~~~~~~~~~
Base address: ``0x23000000``
.. wavedrom::
{ "reg": [
{"name": "Timer config", "bits": 8},
{"name": "(undefined, reads zero)", "bits": 24, "type": 1}]
}
.. list-table:: Timer 1 configuration bit definitions
:name: reg_timer1_configuration_bit_definitions
:header-rows: 1
:widths: auto
* - Bit
- Name
- Values
* - 3
- Counter/timer enable
- 0 - counter/timer disabled
1 - counter/timer enabled
* - 2
- One-shot mode
- 0 - continuous mode
1 - one-shot mode
* - 1
- Updown
- 0 - count down
1 - count up
* - 0
- Interrupt enable
- 0 - interrupt disabled
1 - interrupt enabled
.. _reg_timer1_value:
``reg_timer1_value``
~~~~~~~~~~~~~~~~~~~~
Base address: ``0x23000004``
.. wavedrom::
{ "reg": [
{"name": "Timer value", "bits": 32}]
}
|
The value in this register is the current value of the counter.
Value is 32 bits.
The register is read-write and can be used to reset the timer.
.. _reg_timer1_data:
``reg_timer1_data``
~~~~~~~~~~~~~~~~~~~~
Base address: ``0x23000008``
.. wavedrom::
{ "reg": [
{"name": "Timer data", "bits": 32}]
}
|
The value in this register is the reset value for the comparator.