Руководство пользователя Allwinner H616


  Описание      Система      Графика    Память    Ethernet    Видео    Аудио    Интерфейсы    Безопасность  

3. Система (System)

3.1. Отображение памяти

3.10. Контроллер термодатчика

3.11. Подключение периферийной системы PSI

3.12. Модуль управления памятью ввода-вывода IOMMU

3.13. Часы реального времени RTC

3.2. Конфигурация CPUX

3.3. Контроллер синхрогенератора

3.4. Загрузочное ПЗУ (BROM)

3.5. Конфигурация системы

3.6. Таймер

  3.7. Таймер высокой скорости  

3.8. Универсальный контроллер прерываний

3.9. Прямой доступ к памяти



Глава 3. Система - System
Раздел 3.7. Таймер высокой скорости - High Speed Timer

3.7. Таймер высокой скорости


3.7.1. Обзор

Модуль высокоскоростного таймера (HSTimer) реализует более точные функции отсчета времени и подсчета.

HSTimer имеет следующие особенности:
  • Часы синхронизации - AHB1, которые могут обеспечить более точные часы синхронизации
  • Настраиваемый коэффициент предварительного масштабирования 5
  • Настраиваемый 56-битный таймер отключения
  • Поддерживает 2 режима работы: непрерывный режим и одиночный режим
  • Поддерживает тестовый режим
  • Создает прерывание при уменьшении счетчика до 0


    3.7.2. Блок-схема

    На рисунке 3-14 показана блок-схема HSTimer.

    Рисунок 3-14. Блок-схема таймера HSTimer.


    3.7.3. Операции и функциональные описания


    3.7.3.1

    Формула HSTimer

    (((HS_TMR_INTV_HI_REG 32 + HS_TMR_INTV_LO_REG)-(HS_TMR_CURNT_HI_REG << 32 + HS_TMR_CURNT_LO_REG)) / AHB1CLK)*HS_TMR_CLK HS_TMR_INTV_HI_REG: Начальное значение старшего бита счетчика HS_TMR_INTV_LO_REG: Начальное значение младшего бита счетчика HS_TMR_CURNT_HI_REG: текущее значение старшего бита счетчика HS_TMR_CURNT_LO_REG: текущее значение младшего бита счетчика AHB1CLK: тактовая частота AHB1 HS_TMR_CLK: Коэффициент предварительного масштабирования счетчика времени


    3.7.3.2

    Типичное применение

    Рисунок 3-15. Схема применения HSTimer

    Высокоскоростной таймер находится на AHB1, а высокоскоростной таймер управляет регистрами через AHB1.

    Высокоскоростной таймер имеет единственный источник тактовой частоты: AHB. Высокоскоростной таймер может генерировать прерывание.


    3.7.3.3

    Реализация функции

    Высокоскоростной таймер представляет собой 56-битный счетчик с обратным отсчетом, значение счетчика уменьшается на 1 на каждом фронте тактовой частоты счета.

    У высокоскоростного таймера есть два режима отсчета времени.

  • Непрерывный режим: бит 7 HS_TMR0_CTRL_REG устанавливается в непрерывный режим, когда значение счетчика уменьшается до 0, модуль высокоскоростного таймера перезагружает данные из HS_TMR_INTV_LO_REG и HS_TMR_INTV_HI_REG, а затем продолжает считать.
  • Одиночный режим: Бит 7 HS_TMR0_CTRL_REG устанавливается в одиночный режим, когда значение счетчика уменьшается до 0, высокоскоростной таймер прекращает счет. Высокоскоростной таймер снова начинает отсчет только после загрузки нового начального значения.

    Таймер высокой скорости имеет два режима работы.

  • Нормальный режим: когда бит 31 HS_TMR0_CTRL_REG установлен в нормальный режим, высокоскоростной таймер используется как 56-битный счетчик обратного отсчета, который может завершить непрерывную синхронизацию и одиночную синхронизацию.
  • Тестовый режим: когда бит 31 HS_TMR0_CTRL_REG установлен в тестовый режим, тогда HS_TMR_INTV_LO_REG должен быть установлен в 0x1, высокоскоростной таймер используется как 24-битный обратный счетчик, а HS_TMR_INTV_HI_REG является начальным значением высокоскоростного таймера.

    Каждый высокоскоростной таймер имеет предварительный делитель, который делит рабочую тактовую частоту каждого рабочего таймера на 1,2,4,8,16.


    3.7.3.4

    Рабочий режим

    1. Инициализация таймера HSTimer

    Рисунок 3-16. Процесс инициализации HSTimer

  • (1) Управление часами AHB1: откройте стробирование часов AHB1 и отмените мягкий сброс AHB1 в CCU.
  • (2) Настройте соответствующие параметры высокоскоростного таймера: источник тактовой частоты, коэффициент предварительного делителя, рабочий режим, режим счета. Эти параметры, записанные в HS_TMR0_CTRL_REG, не имеют последовательностей. (3) Запишите начальное значение: сначала запишите регистр младшего разряда (HS_TMR_INTV_LO_REG), затем запишите регистр старшего разряда (HS_TMR_INTV_HI_REG). Запишите бит 1 HS_TMR0_CTRL_REG, чтобы загрузить начальное значение. Если на этапе остановки по времени высокоскоростного таймера, запишите бит 1 и бит 0 HS_TMR0_CTRL_REG, чтобы перезагрузить начальное значение. (4) Включить высокоскоростной таймер: запишите бит [0] HS_TMR0_CTRL_REG, чтобы включить высокоскоростной счетчик. (5) Чтение HS_TMR_CURNT_LO_REG и HS_TMR_CURNT_HI_REG может получить текущее значение счета.

    2. Прерывания HSTimer

  • (1) Разрешить прерывание: Запишите соответствующий бит разрешения прерывания HS_TMR_IRQ_EN_REG, когда время счета высокоскоростного таймера достигает, генерируется соответствующее прерывание.
  • (2) После входа в процесс прерывания запишите HS_TMR_IRQ_STAS_REG, чтобы очистить отложенное прерывание.
  • (3) Возобновить прерывание и продолжить выполнение прерванного процесса.


    3.7.4. Рекомендации по программированию

    Сделайте задержку 1 мкс с помощью HSTimer0 для следующего примера: AHB1CLK будет настроен как 100 МГц, и в этом случае будут выбраны n_mode, одиночный режим и 2 предварительных масштабирования.

  • Writel (0x32, HS_TMR0_INTV_LO); // Устанавливаем значение интервала Lo 0x32
  • Writel (0x0, HS_TMR0_INTV_HI); // Устанавливаем значение интервала Hi 0x0
  • Writel (0x90, HS_TMR0_CTRL); // Выбираем n_mode, 2 предварительных масштабирования, одиночный режим
  • Writel (readl (HS_TMR0_CTRL) | (1 << 1), HS_TMR0_CTRL); // Устанавливаем бит перезагрузки
  • Writel (readl (HS_TMR0_CTRL) | (1 << 0), HS_TMR0_CTRL); // Включаем HSTimer0
  • while (! (readl (HS_TMR_IRQ_STAS) & 1)); // Подождите, пока HSTimer0 сгенерирует отложенный
  • Writel (1, HS_TMR_IRQ_STAS); // Очистить отложенный HSTimer0




  •    3.7.5. Список регистров