Stm32 счетчик: Уроки STM32. Таймеры STM32 в режиме счетчиков. Генерация циклических прерываний от таймеров.

Время выполнения кода STM32. » Хабстаб

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

Всё началось с того что, появилась необходимость хотя бы примерно оценить время выполнения участка кода. Оказалось у микроконтроллеров с ядром Cortex-M3 для этого предназначен специальный модуль, который называется Data Watchpoint and Trace Unit, сокращённо DWT.

Чтобы настроить DWT на измерение длительности выполнения кода, необходимо установить 2 бита.

Бит TRCENA в регистре DEMCR, установка единицы в который разрешает использовать DWT.

Бит CYCCNTENA в регистре DWT_CTRL, установка единицы в который запускает счётчик.

Текущее значение счётчика можно считать из 32-битного регистра CYCCNT.

Код, позволяющий оценить время выполнения кода, выглядит следующим образом


#define    DWT_CYCCNT    *(volatile unsigned long *)0xE0001004
#define    DWT_CONTROL   *(volatile unsigned long *)0xE0001000
#define    SCB_DEMCR     *(volatile unsigned long *)0xE000EDFC

SCB_DEMCR |= CoreDebug_DEMCR_TRCENA_Msk;// разрешаем использовать DWT

DWT_CYCCNT = 0;// обнуляем значение

DWT_CONTROL|= DWT_CTRL_CYCCNTENA_Msk; // включаем счётчик

Какой-то код

count_tic = DWT_CYCCNT;//смотрим сколько натикало

count_tiс – количество тактов, в течение которых выполнялся код. Если мы хотим получить время надо разделить это значение на тактовую частоту, в моём случае на 56 000 000.

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

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



#include "stm32f10x.h"

#define    DWT_CYCCNT    *(volatile unsigned long *)0xE0001004
#define    DWT_CONTROL   *(volatile unsigned long *)0xE0001000
#define    SCB_DEMCR     *(volatile unsigned long *)0xE000EDFC
	
uint32_t count_tic = 0;

void TIM3_IRQHandler(void)
{
	count_tic =  DWT_CYCCNT;
	//останавливаем DWT
	DWT_CONTROL &= ~DWT_CTRL_CYCCNTENA_Msk; 
	DWT_CYCCNT  = 0;
	//выключаем таймер
	TIM3->CR1 &= ~TIM_CR1_CEN;
	//обнуляем его значение
	TIM3->CNT = 0;
	//сбрасываем флаг прерывания 2 раза, у меня он иначе он не сбрасывался
	TIM3->SR &= ~TIM_SR_UIF; 
	TIM3->SR &= ~TIM_SR_UIF; 	
}


int main(void)
{	
	//включаем тактирование таймера
	RCC->APB1ENR |= RCC_APB1ENR_TIM3EN;
	//уcтанавливаем предделитель, новая частота таймера 10KHz
        TIM3->PSC  = 5600 - 1; 
	//период 1 секунда
        TIM3->ARR  = 10000 - 1; 
	//счётчик считает вниз
        TIM3->CR1 &= ~TIM_CR1_DIR; 
	//в режиме одного импульса
        TIM3->CR1 |= TIM_CR1_OPM; 
	//разрешаем прерывания
        TIM3->DIER  |= TIM_DIER_UIE; 
	NVIC->ISER[0] = NVIC_ISER_SETENA_29;
	//запускаем таймер
	TIM3->CR1 |= TIM_CR1_CEN;
	
         //включаем DWT
	 SCB_DEMCR |= CoreDebug_DEMCR_TRCENA_Msk;
	 DWT_CYCCNT  = 0;
	 DWT_CONTROL|= DWT_CTRL_CYCCNTENA_Msk; 
	
	while(1)
	{
               //включаем таймер
		TIM3->CR1 |= TIM_CR1_CEN;
		//запускаем DWT
		DWT_CONTROL|= DWT_CTRL_CYCCNTENA_Msk; 
	}
}

Установка бита TIM_CR1_OPM включает режим одиночного импульса, в этом режиме после возникновения события счёт прекращается.
Первое значение отличается от остальных, потому как таймер и счётчик надо бы запустить одновременно, следующие отличаются от расчётного значения на несколько тактов, которые необходимы для сохранения значения DWT_CYCCNT в count_tic, то есть данный способ работает. На этом всё, спасибо за внимание.

Источник: hubstub.ru

Статья

STM32. Новый курс по программированию

Опубликовано 13.11.2022

На сегодняшний день микроконтроллеры семейства STM32 заняли прочную позицию на рынке, а появление полноценных средств разработки и отладки позволяет быстро осваивать их возможности.
Но, тем не менее, материалов для изучения этих микроконтроллеров и особенностям разработки ПО на языке С для микроконтроллеров достаточно мало.
Этой статьей мы начинаем свой обновленный авторский курс.

Аппаратное обеспечение

В нашем курсе мы будем использовать Аппаратно-программный комплекс «Импульс» для изучения микроконтроллеров.

Импульс. Аппаратно-программный комплекс для изучения МК семейства STM32

Первая статья цикла будет посвящена описанию этого учебного стенда. В его состав входит плата Nucleo F411RE, а так же простейшие периферийные устройства, применяемые в устройствах на МК. Кнопки, дисплей, пьезоизлучатель, датчики температуры, переменные резисторы, светодиоды и внешние RTC.

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

Программное обеспечение

На сегодняшний день программная среда STM32CubeIDE — наилучшим образом подходит для разработки под STM32. Она органично интегрирует средства для инициализации кода, менеджмент файлов проекта и поддержку отладочных средств. Но самое главное — это официальная бесплатная среда разработки с поддержкой непосредственно от производителей этих микроконтроллеров.

Также мы будем использовать в своем курсе HAL-драйвер (Hardware Abstraction Layer), так как в подавляющем большинстве случаев серьезные проекты так или иначе разрабатываются с применением этого драйвера.

Все статьи курса вы можете найти по этим ссылкам:

  1. STM32. Введение. Импульс. Аппаратно-программный комплекс для изучения МК семейства STM32
  2. STM32. Тема 0.0 Работа в STM32CubeIDE
  3. STM32. Тема 1.0 Генерация управляющих импульсных сигналов
  4. STM32. Тема 1.1 Генератор меандра
  5. STM32. Тема 1.2 Генератор сигнала SOS
  6. STM32. Тема 1.3 Генератор сигнала SOS со звуком
  7. STM32. Тема 1.4 Линейный обработчик светофора
  8. STM32. Тема 1.5 Линейный обработчик светофора для перекрестка
  9. STM32. Тема 1.6 Обработчик светофора со трелкой
  10. STM32. Тема 1.7 Обработчик светофора с пешеходными секциями в автоматном стиле
  11. STM32. Тема 2.0 Семисегментный индикатор
  12. STM32. Тема 2.1 Обработчик семисегментного индикатора
  13. STM32. Тема 2.2 Обратный таймер 5 сек
  14. STM32. Тема 2.3 Таймер 10 сек
  15. STM32. Тема 2.4 Бегущий огонь
  16. STM32. Тема 2.5 Индикатор состояния
  17. STM32. Тема 2.6 Таймер 1 минута
  18. STM32. Тема 2.7 Светофор с таймером обратного отсчета
  19. STM32. Тема 3.0 Тактовые кнопки
  20. STM32. Тема 3.1 Телеграфный манипулятор
  21. STM32. Тема 3.2 Вызывной светофор
  22. STM32. Тема 3.3 Ямбический ключ
  23. STM32. Тема 3.4 Счетчик внешних событий
  24. STM32. Тема 3.5 Индикатор переключения АКПП
  25. STM32. Тема 3.6 Матричная клавиатура

Мы будем очень рады, если вы поддержите наш ресурс и посетите магазин наших товаров shop.customelectronics.ru.



Метки отсутствуют

Просмотров: 624

Please enable JavaScript to view the comments powered by Disqus.

Микроконтроллер

— предварительный делитель и счетчик периода (STM32)

\$\начало группы\$

Для таймеров на stm32 есть возможность установки периода предварительного делителя и счетчика. Я понял, что прескалер делит частоту перед тем, как использовать ее для счетчика. Однако мне кажется, что установка значения счетчика делает в основном то же самое, потому что, если я установлю счетчик на N, результирующая частота f должна быть f’ = f / N, что на самом деле приводит к тому же, что и предварительный делитель. Что я сделал не так?

  • микроконтроллер
  • stm32
  • часы
  • таймер
  • счетчик

\$\конечная группа\$

\$\начало группы\$

  1. Предварительный делитель определяет частоту счетчика. AR (автоматическая перезагрузка) — это просто ограничение на максимальное количество единиц и обновление рег; в ШИМ или простой временной базе они работают одинаково. но как насчет захвата ввода? Как насчет ШИМ без ущерба для разрешения?
  2. Больше гибкости. Обычно прескалеры представляют собой степень двойки, например
    2,4,8,. .. и это несмотря на то, что там одни микроконтроллеры
    без ограничений, но добавление обоих делает его более гибким.

\$\конечная группа\$

\$\начало группы\$

Предварительный делитель используется для установки частоты изменения счетчика.

Пример:

Если тактовая частота вашего таймера составляет 100 МГц, и вы хотите, чтобы таймер переполнялся каждые 2 мс, вам необходимо выполнить некоторые математические действия.

  1. В течение 2 мс ваш счетчик должен считать до 100 МГц * 2 мс = 200000. Большинство счетчиков таймеров STM32 имеют 16 бит, и это значение не подходит. Максимальное значение 65535.

  2. 200000 / (65535 + 1) = 3,05. Ближайшее целое число, большее этого числа, равно 4,

    .

  3. 100 МГц / 4 = 25 МГц. Счетчик должен будет считать до 50000, и это значение будет соответствовать 16-битному регистру.

Таким образом, ваш регистр предварительного делителя (PSC) должен быть установлен на 3 (4-1), а регистр счетчика (ARR) — на 49. 999 (50000-1). Смещение единицы необходимо, потому что так работают эти таймеры.

\$\конечная группа\$

0

Зарегистрируйтесь или войдите в систему

Зарегистрируйтесь с помощью Google

Зарегистрироваться через Facebook

Зарегистрируйтесь, используя адрес электронной почты и пароль

Опубликовать как гость

Электронная почта

Требуется, но никогда не отображается

Опубликовать как гость

Электронная почта

Требуется, но не отображается

Нажимая «Опубликовать свой ответ», вы соглашаетесь с нашими условиями обслуживания, политикой конфиденциальности и политикой использования файлов cookie

Микроконтроллер

— Настройка таймера STM32 в качестве счетчика частоты

спросил

Изменено
3 года, 10 месяцев назад

Просмотрено
2к раз

\$\начало группы\$

Я пытаюсь настроить один из входов таймера на STM32 для работы в качестве счетчика частоты для внешнего сигнала. Техническое описание STM32 описывает «режим захвата ввода» в разделе 17.3.6 (стр. 342)

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

Я пытаюсь включить это в CubeMX, и у меня возникают трудности с сопоставлением пояснений таблицы данных с настройками в CubeMX. Это то, что я сейчас настроил. Это правильно?

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

  • микроконтроллер
  • stm32
  • таймер
  • stm32cubemx

\$\конечная группа\$

1

\$\начало группы\$

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


Опубликовано

в

от

Метки:

Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *