Руководство пользователя 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.6. Таймер - Timer

3.6. Таймер


3.6.1. Обзор

Модуль таймера реализует функции хронирования и подсчета. Модуль таймера включает в себя timer0, timer1, сторожевой таймер и AVS0, AVS1.

Таймер 0 и таймер 1 полностью согласованы. Таймер 0 и таймер 1 имеют следующие особенности:

  • Настраиваемые часы подсчета: LOSC и OSC24M. LOSC - это внутренние низкочастотные часы или внешние низкочастотные часы, задав LOSC_SRC_SEL. Внешняя низкая частота имеет большую точность.
  • Настраиваемый коэффициент предварительного масштабирования 8
  • Программируемый 32-битный таймер отключения
  • Два режима работы: режим продолжения и режим одиночного счета
  • Создает прерывание при уменьшении счетчика до 0

    Сторожевой таймер используется для передачи сигнала сброса для сброса всей системы после возникновения исключения в системе. Сторожевой таймер имеет следующие особенности:

  • Единый источник тактовой частоты: OSC24M / 750
  • 12 начальных значений для настройки
  • Генерация прерываний по таймауту
  • Генерация сигнала сброса
  • Watchdog перезапускает отсчет времени

    AVS используется для синхронизации аудио и видео. Модуль AVS включает AVS0 и AVS1, AVS0 и AVS1 полностью согласованы. AVS имеет следующие особенности:

  • Единый источник тактовой частоты: OSC24M
  • Программируемый 33-битный таймер вверх
  • Начальное значение можно обновить в любое время
  • 12-битный коэффициент делителя частоты
  • Функция паузы / запуска


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

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


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


    3.6.3.1

    Формула таймера

    На примере Timer0.

    Ttimer0 = ((TMR0_INTV_VALUE_REG-TMR0_CUR_VALUE_REG) / TMR0_CLK_SRC)*TMR0_CLK_PRES

  • TMR0_INTV_VALUE_REG: начальное значение таймера;
  • TMR0_CUR_VALUE_REG: текущий счетчик таймера;
  • TMR0_CLK_SRC: источник тактовой частоты таймера;
  • TMR0_CLK_PRES: коэффициент предварительного масштабирования таймера.


    3.6.3.2

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

    Рисунок 3-13. Схема применения таймера.

  • Регистр настройки таймера, сторожевого таймера и AVS по шине APB1.
  • Таймер и сторожевой таймер имеют режим прерывания.
  • Система настраивает время сторожевого таймера, если в системе нет времени для сторожевого таймера перезапуска (например, зависание шины), тогда сторожевой таймер посылает внешний сигнал сброса сторожевого таймера для сброса системы; тем временем сторожевой таймер выводит сигнал на площадку RESET для сброса PMIC.


    3.6.3.3

    Выполнение функций

    1. Таймер

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

    Таймер имеет два режима работы.
  • Непрерывный режим

    Бит 7 TMRn_CTRL_REG установлен в непрерывный режим, когда значение счетчика уменьшается до 0, модуль таймера перезагружает данные из TMRn_INTV_VALUE_REG, а затем продолжает счет.

  • Одиночный режим

    Бит 7 TMRn_CTRL_REG устанавливается в одиночный режим, когда значение счетчика уменьшается до 0, таймер прекращает счет. Таймер снова начинает отсчет только после загрузки нового начального значения.

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

    2. Сторожевой таймер

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

    Сторожевой таймер имеет два режима работы.
  • Режим прерывания

    WDOG0_CFG_REG устанавливается в 0x2, когда значение счетчика достигает 0 и WDOG0_IRQ_EN_REG включен, сторожевой таймер генерирует прерывание, сторожевой таймер переходит в режим прерывания.

  • Режим сброса

    WDOG0_CFG_REG установлен в 0x1, когда значение счетчика достигает 0, сторожевой таймер генерирует сигнал сброса для сброса всей системы.

    Источником синхронизации сторожевого таймера является OSC24M / 750. Имеется 12 настраиваемых начальных значений счета.

    Сторожевой таймер может перезапустить для подсчета, установив WDOG0_CTRL_REG: записать 0xA57 в бит [12: 1], затем записать 1 в бит [0].

    3. AVS

    AVS - это 33-битный суммирующий счетчик. Значение счетчика увеличивается на 1 с каждым нарастающим фронтом счетчика. AVS может работать после открытия его тактового строба в модуле CCU. AVS имеет источник синхронизации OSC24M и 12-битный коэффициент деления (N1 или N2). Когда таймер увеличивается до N1 или N2 с 0, счетчик AVS добавляет 1; когда счетчик достигнет 33-битного верхнего предела, AVS снова начнет отсчет с начального значения. В процессе работы счетчика коэффициент деления и начальный счетчик AVS можно изменить в любое время. И AVS может в любой момент остановить или запустить счетчик.


    3.6.3.4

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

    1. Таймер начальный

  • (1) Настройте параметры таймера: источник тактовой частоты, коэффициент предварительного масштабирования, рабочий режим. Конфигурация этих параметров не имеет последовательности и может быть реализована записью TMRn_CTRL_REG.
  • (2) Запишите начальное значение: запишите TMRn_INTV_VALUE_REG, чтобы предоставить начальное значение для таймера; запишите бит [1] TMRn_CTRL_REG, чтобы загрузить начальное значение в таймер, если бит [1] равен 1, операция записи не может быть выполнена; если 0, это означает успешную загрузку.
  • (3) Включить таймер: запишите бит [0] TMRn_CTRL_REG, чтобы включить счетчик таймера; прочтите TMRn_CUR_VALUE_REG, чтобы получить текущее значение счетчика.

    2. Таймер прерывания

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

    3. Watchdog Initial

  • (1) Запишите WDOG0_CFG_REG, чтобы настроить генерацию прерываний и вывод сигнала сброса.
  • (2) Запишите WDOG0_MODE_REG, чтобы настроить начальное значение счетчика.
  • (3) Напишите WDOG0_MODE_REG, чтобы включить сторожевой таймер.

    4. Сторожевое прерывание

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

    5. AVS Старт / Пауза

    (1) Напишите AVS_CNT_DIV_REG, чтобы настроить коэффициент деления. (2) Запишите AVS_CNT_REG, чтобы настроить начальное значение счетчика. (3) Запишите AVS_CNT_CTL_REG, чтобы включить счетчик AVS. Счетчик AVS можно приостановить в любой момент.

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

    3.6.4.1. Таймер

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

  • Writel (0x2EE0, TMR_0_INTV); // Устанавливаем значение интервала
  • Writel (0x94, TMR_0_CTRL); // Выбираем одиночный режим, источник тактовой частоты 24 МГц, 2 предустановки
  • Writel (readl (TMR_0_CTRL) | (1 << 1), TMR_0_CTRL); // Устанавливаем бит перезагрузки
  • Writel ((readl (TMR_0_CTRL) &rt;&rt; 1) & 1); // Бит ожидания перезагрузки становится 0
  • Writel (readl (TMR_0_CTRL) | (1 << 0), TMR_0_CTRL); // Включаем Timer0


    3.6.4.2

    Сброс сторожевого таймера

    В следующем примере выполняются конфигурации для Watchdog: настройте источник синхронизации как 24M / 750, настройте значение интервала как 1s и настройте конфигурацию Watchdog как для всей системы. Этот пример указывает на то, что система сбросила через 1 с.

    Writel (0x1, WDOG_CONFIG); // Для всей системы Writel (0x10, WDOG_MODE); // Значение интервала устанавливается 1 с writel(readl(WDOG_MODE)|(1 << 0), WDOG_MODE); //Enable Watchdog


    3.6.4.3

    Перезапуск сторожевого таймера

    В следующем примере выполняются конфигурации для Watchdog: настройте источник синхронизации как 24M / 750, настройте значение интервала как 1s и настройте конфигурацию Watchdog как для всей системы. В следующем случае, если время других кодов больше 1 с, сторожевой таймер сбросит всю систему. Если предложение о перезапуске сторожевого таймера реализовано внутри 1 с, сторожевой таймер будет перезапущен.

  • Writel (0x1, WDOG_CONFIG); // Для всей системы
  • Writel (0x10, WDOG_MODE); // Значение интервала устанавливается 1 с
  • Writel (readl (WDOG_MODE) | (1 << 0), WDOG_MODE);// Включить Watchdog

    ---- другие коды ---

  • Writel (readl (WDOG_CTRL) | (0xA57 << 1) | (1 << 0), WDOG_CTRL); // Запись 0xA57 в ключевом поле и перезапуск сторожевого таймера




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