реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> stm32 захват таймера 16 бит
SasaVitebsk
сообщение Apr 3 2014, 11:09
Сообщение #1


Гуру
******

Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521



Доброго времени суток. Есть вопрос.
Немного не учёл особенности однокристалки stm32f407.
Короче мне надо использовать захват таймера. Но плата разведена на таймер 8. Он 16-ти битный. Мне для расчётов нужен 32-ух битный.
Я сделал расширение таймера за счёт 4-го таймера. При захвате вызываю прерывание где читаю регистр захвата TIM8 и регистр CNT таймера расширения TIM4.
Вижу потенциальные грабли в том, что пока вызывается прерывание, можно нарваться на "ненужное" переполнение. То есть фактически тот же неатомарный доступ только для таймеров.
Кто-нибудь разруливал данную ситуацию? Я могу как-то захватить оба таймера?
Go to the top of the page
 
+Quote Post
e-serg
сообщение Apr 3 2014, 11:46
Сообщение #2


Частый гость
**

Группа: Участник
Сообщений: 97
Регистрация: 24-07-08
Из: Иркутск
Пользователь №: 39 180



Цитата(SasaVitebsk @ Apr 3 2014, 20:09) *
Я могу как-то захватить оба таймера?

Пробовал на stm32f107 два таймера, захват на каждом, есть сомнение в синхронности.
Для вашего варианта можно посмотреть в сторону DMA.
По событиям от TIM8, запускать чтение(запись) регистров TIM2 или TIM5.
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Apr 3 2014, 12:07
Сообщение #3


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Для AVR приходилось тоже извращаться (программно-аппаратное увеличение разрядности регистра захвата таймера).
Не смог найти оригинальный источник с этой идеей на этом сайте. Поищите, может вы найдёте...
Вот что у меня получилось после творческой переработки:
Код
ISR(COMP_VECTOR)
{
    compare_isr();
}

//=============================================================================
//   Подпрограмма выгребания события из регистра ICR.
// Приоритет выше чем у переполнения и сравнения, поэтому такие сложности...
//=============================================================================
ISR(CAPT_VECTOR)
{
    uint16_t icr = ICR;

    if ((icr<0x8000) && (TIFR & (1<<OCF)))
    {
        TIFR = (1<<OCF); // clr compare flag by writing 1 to its bits location.
        compare_isr();
    }
    ...
}


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Apr 3 2014, 13:27
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



у вас переполнение первого таймера вызывает тик второго, такая схема?
и вы боитесь что пока читаете один, тикнет другой?

Если я все правильно понял то решается двойным чтением

младший1
старший1
младший2
старший2

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

вот и все, 4 чтения + 1 сравнение...
Go to the top of the page
 
+Quote Post
SasaVitebsk
сообщение Apr 4 2014, 02:26
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521



Всем спасибо. )) Не ожидал такого числа ответов.
Идея с DMA мне в голову не приходила. Похоже она прокатывает, но переделывать много. Не очень хочется. Всё равно спасибо.
Идею demiurg_spb, стыдно признаться - не понял.
А Golikov A. подсказал мысль толковую. Можно текущий счётчик таймера сравнивать с регистром захвата.
Попробую.
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Apr 4 2014, 02:33
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



DMA на самом деле тоже через одну шину читает, и ему надо будет шину захватывать, так что тоже чтение будет не одновременное по 2 каналам...
Go to the top of the page
 
+Quote Post
sKWO
сообщение Apr 4 2014, 03:36
Сообщение #7


Местный
***

Группа: Участник
Сообщений: 355
Регистрация: 27-03-07
Из: Україна, Чуднів
Пользователь №: 26 530



Цитата(demiurg_spb @ Apr 3 2014, 16:07) *
Для AVR приходилось тоже извращаться (программно-аппаратное увеличение разрядности регистра захвата таймера).
Не смог найти оригинальный источник с этой идеей на этом сайте. Поищите, может вы найдёте...

В своё время мне помогла вот эта ветка, сама идея заключалась в дополнительной проверке флага переполнения. Я прав, она?

А именно && (TIFR & (1<<OCF)


--------------------
нельзя недооценивать предсказуемость глупости
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Apr 4 2014, 03:45
Сообщение #8


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Цитата(sKWO @ Apr 4 2014, 07:36) *
Я прав, она?
Да. Похоже она.

Цитата(SasaVitebsk @ Apr 4 2014, 06:26) *
Идею demiurg_spb, стыдно признаться - не понял.
compare_isr() инкрементирует старшее слово (программное), а из ICR читается младшее слово.
Таким образом получается 32 разряда.
А условие ((icr<0x8000) && (TIFR & (1<<OCF))) проверяет, что переполнение случилось недавно.
Давность можно регулировать, задав вместо 0x8000 другое значение.

На STM32 таких проблем как с AVR быть не должно, т.к. можно конфигурировать NVIC и разруливать приоритеты по собственному желанию.



--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
SasaVitebsk
сообщение Apr 4 2014, 03:50
Сообщение #9


Гуру
******

Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521



Цитата(sKWO @ Apr 4 2014, 06:36) *
сама идея заключалась в дополнительной проверке флага переполнения.

Не могу понять как это может помочь.
Переполнение от таймера идёт слэйв таймеру. В момент захвата этих переполнений вагон и маленькая тележка.
Go to the top of the page
 
+Quote Post
ViKo
сообщение Apr 4 2014, 04:18
Сообщение #10


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Цитата(Golikov A. @ Apr 3 2014, 16:27) *
младший1
старший1
младший2
старший2

Для PIC когда-то было предложено. Читать старший, читать младший, читать старший. Если оба прочтения старшего одинаковые, значит, переполнения не было.
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Apr 4 2014, 05:38
Сообщение #11


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Цитата(SasaVitebsk @ Apr 4 2014, 07:50) *
Не могу понять как это может помочь.
Переполнение от таймера идёт слэйв таймеру. В момент захвата этих переполнений вагон и маленькая тележка.

Это может помочь если будете использовать только один таймер (не соединяя никаких таймеров).
Задайте тактирование не слишком большой частотой (скажем 9МГц) и переполнения будут происходить на частоте 9.0E6 / 2^16 = 137Гц, что в целом не слишком напряжно.


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
SasaVitebsk
сообщение Apr 4 2014, 06:55
Сообщение #12


Гуру
******

Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521



Это всё понятно. У меня частота 14 и соответственно 213.6. Вопрос о напряжности сложный, если это прибор коммерческого учёта. )) Придётся всёже переразвести на 32-ух битный таймер.
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Apr 4 2014, 14:47
Сообщение #13


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



Цитата
Для PIC когда-то было предложено. Читать старший, читать младший, читать старший. Если оба прочтения старшего одинаковые, значит, переполнения не было.

а если старшие не равны, то надо читать новый младший и все теже 4 считывания получаются%), это все та же старая стандартная идея, с разными типами проверки


Цитата
Это всё понятно. У меня частота 14 и соответственно 213.6. Вопрос о напряжности сложный, если это прибор коммерческого учёта. )) Придётся всёже переразвести на 32-ух битный таймер.

мне тут в личку написали, смысл идеи с ДМА, перепишу суда своими словами.

вы запускаете таймер 32 разрядный, настраиваете ДМА на чтение этого таймера по 1 тику вашего 8 разрядного таймера что идет наружу. И настраиваете запуск этого 8 разрядного таймера по внешнему сигналу.


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


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

Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 21st July 2025 - 07:57
Рейтинг@Mail.ru


Страница сгенерированна за 0.01484 секунд с 7
ELECTRONIX ©2004-2016