Перейти к содержанию
    

SAM3U и 32 битный таймер

Последнее время привык использовать в приложениях аппаратный 32 битный счётчик с разрешением в 1 микросекунду.

На его базе очень удобно реализовать таймеры с выдержкой от единиц микросекунд до нескольких минут.

 

На STM32F1xx приходилось использовать в цепочке два 16 битных таймера, благо есть возможность выстраивания друг за другом.

На LPC17хх вообще без проблем - нативный 32 битный таймер в наличии.

Вот теперь прицениваюсь к Сэмам.

 

И что же наблюдаю? Имеем очередное чудо инженерной (плисоводской?) мысли в виде отсутствия каких либо прескалеров и навороченного блока таймеров.

 

В мануале написано, что у нас аж 9 каналов 16 битных таймеров, тогда как регистров в наличии только на 3 :smile3046:

Первая непонятка.

Потом смотрю, вроде есть возможность заводить выход одного счётчика на вход другого, ага!

Идея такая: первый таймер играет роль делителя частоты ядра в 96 МГц до 1 МГц (прескалер) -> второй выполняет роль младших 16 бит -> и третий старших - в итоге получаем 32 бита.

 

Но для этого надо, чтобы после срабатывания функции сравнения и сброса счётчика в 0 выдавался импульс на следующее звено в цепочке, для его инкремента.

Однако в мануале указана только возможность установить в 1, сбросить в 0 или переключить состояние выхода таймера.

Про короткий импульс нет ни слова :(

 

Неужели всё это нагромождение таймеров не способно работать как один 32 битный свободный счётчик? :crying:

 

ЗЫ: ага, вроде придумал - ведь на каждый таймер мы имеем три compare регистра - А, В и С.

Тогда, к примеру, в регистр А заносим значение 0xFFFF, а в регистр C - 0x0, и устанавливаем функции для А - установить выход в 1, а для С - сбросить в 0.

И получаем короткий импульс при переполнении счётчика!

 

Что скажете, уважаемые?

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В мануале написано, что у нас аж 9 каналов 16 битных таймеров, тогда как регистров в наличии только на 3 :smile3046:

Первая непонятка.

В мануале их 3, откуда взялось 9?

 

Потом смотрю, вроде есть возможность заводить выход одного счётчика на вход другого, ага!

Идея такая: первый таймер играет роль делителя частоты ядра в 96 МГц до 1 МГц (прескалер) -> второй выполняет роль младших 16 бит -> и третий старших - в итоге получаем 32 бита.

Эх, и не жалко таймеров?

 

Но для этого надо, чтобы после срабатывания функции сравнения и сброса счётчика в 0 выдавался импульс на следующее звено в цепочке, для его инкремента.

Однако в мануале указана только возможность установить в 1, сбросить в 0 или переключить состояние выхода таймера.

Про короткий импульс нет ни слова :(

Еще в мануале упоминаются три регистра сравнения, по каждому из которых можно что-нибудь с TIOx сделать.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В мануале их 3, откуда взялось 9?

Отсюда

post-19695-1307571382_thumb.png

Там по тексту ещё в одном месте про 9 каналов сказано.

Три - это уже совсем мало.

 

Эх, и не жалко таймеров?

Можете предложить другой способ получения 32 бит?

Это Атмелу надо было думать, прежде чем выпускать современный контроллер с жалкими тремя 16 битными огрызками :)

Прескалер-то выбросили, явно намекают на использование вместо него одного из таймеров.

 

Еще в мануале упоминаются три регистра сравнения, по каждому из которых можно что-нибудь с TIOx сделать.

Это я уже допёр :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Отсюда

Там по тексту ещё в одном месте про 9 каналов сказано.

Три - это уже совсем мало.

Выдали желаемое за действительное. На самом деле их три, разумеется. И не сказать, что этого мало.

 

Можете предложить другой способ получения 32 бит?

Я, если честно, слабо представляю, зачем вообще может понадобиться на уровне софта таймер с разрешением 1 мкс. Разве что в качестве performance timer'а.

Можно использовать входную частоту MCK/128, если забить на привязку 1 тик = 1 мкс.

 

Это Атмелу надо было думать, прежде чем выпускать современный контроллер с жалкими тремя 16 битными огрызками :)

Прескалер-то выбросили, явно намекают на использование вместо него одного из таймеров.

Да, могли бы расширить до 32-х. Прескалера никогда и не было.

 

Вообще, TC практически идентичен тому, что был 10 лет назад на M40800 (ну, квадратурный декодер недавно добавили).

Тогда он мне представлялся довольно навороченным :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Я, если честно, слабо представляю, зачем вообще может понадобиться на уровне софта таймер с разрешением 1 мкс. Разве что в качестве performance timer'а.

Для меня весьма удобно иметь класс таймеров с широкими возможностями, с обработкой практически любых желаемых временных промежутков.

Всего то надо один 32 битный аппаратный таймер для этого.

 

Вообще, TC практически идентичен тому, что был 10 лет назад на M40800 (ну, квадратурный декодер недавно добавили).

Тогда он мне представлялся довольно навороченным :)

Да мне тоже он показался навороченным, пока разобрался, что к чему, аж голова затрещала :biggrin:

Просто до этого не имел дела с Атмеловскими таймерами.

 

Что интересно - на борту ведь имеются два 32 битных счётчика - RTT и RTC, и не всегда они задействованы, а точнее - вообще почти никогда.

Если бы была возможность тактировать их не только от Slow Clock... :(

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Что интересно - на борту ведь имеются два 32 битных счётчика - RTT и RTC, и не всегда они задействованы, а точнее - вообще почти никогда.

Если бы была возможность тактировать их не только от Slow Clock... :(

Традиции-с. RTT - вообще весьма невнятная вещь, использовать можно только как источник alarm'а. Но упорно перетаскивают его из кристалла в кристалл.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для меня весьма удобно иметь класс таймеров с широкими возможностями, с обработкой практически любых желаемых временных промежутков.

Всего то надо один 32 битный аппаратный таймер для этого.

Чем не устраивает PIT??? Частота MCLK, предделитель есть, настройте на 1мкс.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Можете предложить другой способ получения 32 бит?

Я могу.

Обрабатывать переполнения 16-битного таймера программно, дополняя до 32 бит.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Чем не устраивает PIT???

Тем, что его там нет, наверное.

 

Обрабатывать переполнения 16-битного таймера программно, дополняя до 32 бит.

Кстати, да. Событие редкое, раз в 65.536мс можно и отвлечься ненадолго.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Я могу.

Обрабатывать переполнения 16-битного таймера программно, дополняя до 32 бит.

Можно и так, да.

Но тут столько же минусов, сколько и плюсов - экономим всего один таймер, зато получаем лишнее прерывание.

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Но тут столько же минусов, сколько и плюсов - экономим всего один таймер, зато получаем лишнее прерывание.

Это, знаете ли, как посмотреть: экономим целый таймер и получаем редкое и короткое прерывание. Три - это уже совсем мало, не так ли? ;)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...