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

stm32 захват таймера 16 бит

Доброго времени суток. Есть вопрос.

Немного не учёл особенности однокристалки stm32f407.

Короче мне надо использовать захват таймера. Но плата разведена на таймер 8. Он 16-ти битный. Мне для расчётов нужен 32-ух битный.

Я сделал расширение таймера за счёт 4-го таймера. При захвате вызываю прерывание где читаю регистр захвата TIM8 и регистр CNT таймера расширения TIM4.

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

Кто-нибудь разруливал данную ситуацию? Я могу как-то захватить оба таймера?

 

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


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

Я могу как-то захватить оба таймера?

Пробовал на stm32f107 два таймера, захват на каждом, есть сомнение в синхронности.

Для вашего варианта можно посмотреть в сторону DMA.

По событиям от TIM8, запускать чтение(запись) регистров TIM2 или TIM5.

 

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


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

Для 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();
    }
    ...
}

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


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

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

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

 

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

 

младший1

старший1

младший2

старший2

 

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

 

вот и все, 4 чтения + 1 сравнение...

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


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

Всем спасибо. )) Не ожидал такого числа ответов.

Идея с DMA мне в голову не приходила. Похоже она прокатывает, но переделывать много. Не очень хочется. Всё равно спасибо.

Идею demiurg_spb, стыдно признаться - не понял.

А Golikov A. подсказал мысль толковую. Можно текущий счётчик таймера сравнивать с регистром захвата.

Попробую.

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


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

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

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


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

Для AVR приходилось тоже извращаться (программно-аппаратное увеличение разрядности регистра захвата таймера).

Не смог найти оригинальный источник с этой идеей на этом сайте. Поищите, может вы найдёте...

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

 

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

 

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


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

Я прав, она?
Да. Похоже она.

 

Идею demiurg_spb, стыдно признаться - не понял.
compare_isr() инкрементирует старшее слово (программное), а из ICR читается младшее слово.

Таким образом получается 32 разряда.

А условие ((icr<0x8000) && (TIFR & (1<<OCF))) проверяет, что переполнение случилось недавно.

Давность можно регулировать, задав вместо 0x8000 другое значение.

 

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

 

 

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


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

сама идея заключалась в дополнительной проверке флага переполнения.

Не могу понять как это может помочь.

Переполнение от таймера идёт слэйв таймеру. В момент захвата этих переполнений вагон и маленькая тележка.

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


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

младший1

старший1

младший2

старший2

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

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


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

Не могу понять как это может помочь.

Переполнение от таймера идёт слэйв таймеру. В момент захвата этих переполнений вагон и маленькая тележка.

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

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

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


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

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

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


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

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

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

 

 

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

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

 

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

 

 

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

 

 

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

 

 

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


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

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

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

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

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

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

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

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

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

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