Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: SAM3U и 32 битный таймер
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
sonycman
Последнее время привык использовать в приложениях аппаратный 32 битный счётчик с разрешением в 1 микросекунду.
На его базе очень удобно реализовать таймеры с выдержкой от единиц микросекунд до нескольких минут.

На STM32F1xx приходилось использовать в цепочке два 16 битных таймера, благо есть возможность выстраивания друг за другом.
На LPC17хх вообще без проблем - нативный 32 битный таймер в наличии.
Вот теперь прицениваюсь к Сэмам.

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

В мануале написано, что у нас аж 9 каналов 16 битных таймеров, тогда как регистров в наличии только на 3 smile3046.gif
Первая непонятка.
Потом смотрю, вроде есть возможность заводить выход одного счётчика на вход другого, ага!
Идея такая: первый таймер играет роль делителя частоты ядра в 96 МГц до 1 МГц (прескалер) -> второй выполняет роль младших 16 бит -> и третий старших - в итоге получаем 32 бита.

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

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

ЗЫ: ага, вроде придумал - ведь на каждый таймер мы имеем три compare регистра - А, В и С.
Тогда, к примеру, в регистр А заносим значение 0xFFFF, а в регистр C - 0x0, и устанавливаем функции для А - установить выход в 1, а для С - сбросить в 0.
И получаем короткий импульс при переполнении счётчика!

Что скажете, уважаемые?
aaarrr
Цитата(sonycman @ Jun 9 2011, 01:42) *
В мануале написано, что у нас аж 9 каналов 16 битных таймеров, тогда как регистров в наличии только на 3 smile3046.gif
Первая непонятка.

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

Цитата(sonycman @ Jun 9 2011, 01:42) *
Потом смотрю, вроде есть возможность заводить выход одного счётчика на вход другого, ага!
Идея такая: первый таймер играет роль делителя частоты ядра в 96 МГц до 1 МГц (прескалер) -> второй выполняет роль младших 16 бит -> и третий старших - в итоге получаем 32 бита.

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

Цитата(sonycman @ Jun 9 2011, 01:42) *
Но для этого надо, чтобы после срабатывания функции сравнения и сброса счётчика в 0 выдавался импульс на следующее звено в цепочке, для его инкремента.
Однако в мануале указана только возможность установить в 1, сбросить в 0 или переключить состояние выхода таймера.
Про короткий импульс нет ни слова sad.gif

Еще в мануале упоминаются три регистра сравнения, по каждому из которых можно что-нибудь с TIOx сделать.
sonycman
Цитата(aaarrr @ Jun 9 2011, 01:53) *
В мануале их 3, откуда взялось 9?

Отсюда
Нажмите для просмотра прикрепленного файла
Там по тексту ещё в одном месте про 9 каналов сказано.
Три - это уже совсем мало.

Цитата(aaarrr @ Jun 9 2011, 01:53) *
Эх, и не жалко таймеров?

Можете предложить другой способ получения 32 бит?
Это Атмелу надо было думать, прежде чем выпускать современный контроллер с жалкими тремя 16 битными огрызками sm.gif
Прескалер-то выбросили, явно намекают на использование вместо него одного из таймеров.

Цитата(aaarrr @ Jun 9 2011, 01:53) *
Еще в мануале упоминаются три регистра сравнения, по каждому из которых можно что-нибудь с TIOx сделать.

Это я уже допёр sm.gif
aaarrr
Цитата(sonycman @ Jun 9 2011, 02:19) *
Отсюда
Там по тексту ещё в одном месте про 9 каналов сказано.
Три - это уже совсем мало.

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

Цитата(sonycman @ Jun 9 2011, 02:19) *
Можете предложить другой способ получения 32 бит?

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

Цитата(sonycman @ Jun 9 2011, 02:19) *
Это Атмелу надо было думать, прежде чем выпускать современный контроллер с жалкими тремя 16 битными огрызками sm.gif
Прескалер-то выбросили, явно намекают на использование вместо него одного из таймеров.

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

Вообще, TC практически идентичен тому, что был 10 лет назад на M40800 (ну, квадратурный декодер недавно добавили).
Тогда он мне представлялся довольно навороченным sm.gif
sonycman
Цитата(aaarrr @ Jun 9 2011, 02:34) *
Я, если честно, слабо представляю, зачем вообще может понадобиться на уровне софта таймер с разрешением 1 мкс. Разве что в качестве performance timer'а.

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

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

Да мне тоже он показался навороченным, пока разобрался, что к чему, аж голова затрещала biggrin.gif
Просто до этого не имел дела с Атмеловскими таймерами.

Что интересно - на борту ведь имеются два 32 битных счётчика - RTT и RTC, и не всегда они задействованы, а точнее - вообще почти никогда.
Если бы была возможность тактировать их не только от Slow Clock... sad.gif
aaarrr
Цитата(sonycman @ Jun 9 2011, 03:25) *
Что интересно - на борту ведь имеются два 32 битных счётчика - RTT и RTC, и не всегда они задействованы, а точнее - вообще почти никогда.
Если бы была возможность тактировать их не только от Slow Clock... sad.gif

Традиции-с. RTT - вообще весьма невнятная вещь, использовать можно только как источник alarm'а. Но упорно перетаскивают его из кристалла в кристалл.
DmitryM
Цитата(sonycman @ Jun 9 2011, 03:25) *
Для меня весьма удобно иметь класс таймеров с широкими возможностями, с обработкой практически любых желаемых временных промежутков.
Всего то надо один 32 битный аппаратный таймер для этого.

Чем не устраивает PIT??? Частота MCLK, предделитель есть, настройте на 1мкс.
scifi
Цитата(sonycman @ Jun 9 2011, 02:19) *
Можете предложить другой способ получения 32 бит?

Я могу.
Обрабатывать переполнения 16-битного таймера программно, дополняя до 32 бит.
aaarrr
Цитата(DmitryM @ Jun 9 2011, 09:29) *
Чем не устраивает PIT???

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

Цитата(scifi @ Jun 9 2011, 09:37) *
Обрабатывать переполнения 16-битного таймера программно, дополняя до 32 бит.

Кстати, да. Событие редкое, раз в 65.536мс можно и отвлечься ненадолго.
sonycman
Цитата(scifi @ Jun 9 2011, 09:37) *
Я могу.
Обрабатывать переполнения 16-битного таймера программно, дополняя до 32 бит.

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

aaarrr
Цитата(sonycman @ Jun 9 2011, 12:28) *
Но тут столько же минусов, сколько и плюсов - экономим всего один таймер, зато получаем лишнее прерывание.

Это, знаете ли, как посмотреть: экономим целый таймер и получаем редкое и короткое прерывание. Три - это уже совсем мало, не так ли? wink.gif
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.